From d6629dbd1148b6c70341d889812084fa3a9c69a1 Mon Sep 17 00:00:00 2001 From: Daniel Stonies Date: Tue, 1 Dec 2020 10:01:58 +0100 Subject: [PATCH] Add facebook auth support --- Platforms/FacebookAds/Controller.php | 83 +- Platforms/FacebookAds/Importer.php | 121 +- composer.json | 4 +- composer.lock | 960 ++- vendor/bramus/ansi-php/.travis.yml | 11 +- vendor/bramus/ansi-php/composer.lock | 660 +- vendor/bramus/ansi-php/readme.md | 39 +- .../ansi-php/src/ControlSequences/Base.php | 4 +- .../src/Writers/FlushableInterface.php | 6 + vendor/composer/ClassLoader.php | 10 +- vendor/composer/InstalledVersions.php | 457 ++ vendor/composer/autoload_classmap.php | 2 + vendor/composer/autoload_files.php | 5 + vendor/composer/autoload_psr4.php | 6 + vendor/composer/autoload_real.php | 7 +- vendor/composer/autoload_static.php | 45 + vendor/composer/installed.json | 2606 +++++--- vendor/composer/installed.php | 272 + vendor/composer/platform_check.php | 23 + .../.github/ISSUE_TEMPLATE.md | 3 + vendor/facebook/php-business-sdk/.gitignore | 12 + vendor/facebook/php-business-sdk/.travis.yml | 30 + vendor/facebook/php-business-sdk/CHANGELOG.md | 122 + .../php-business-sdk/CODE_OF_CONDUCT.md | 3 + .../facebook/php-business-sdk/CONTRIBUTING.md | 45 + .../php-business-sdk/DEVELOPER_GUIDE.md | 495 ++ vendor/facebook/php-business-sdk/LICENSE | 19 + vendor/facebook/php-business-sdk/README.md | 360 + .../php-business-sdk/bin/clean_account.php | 111 + .../php-business-sdk/bin/create_phar.php | 112 + .../php-business-sdk/bin/docsmith.php | 68 + .../php-business-sdk/bin/get_version.php | 34 + .../facebook/php-business-sdk/composer.json | 27 + .../examples/AdAccountActivityNode.php | 45 + .../examples/AdAccountAdCreativesEdge.php | 47 + .../examples/AdAccountAdCreativesPost.php | 48 + ...AdCreativesPost2CreateAdCreativeLinkAd.php | 48 + ...t2CreateCarouselCallToActionAppInstall.php | 48 + ...ost2CreateLinkAdCallToActionAppInstall.php | 48 + ...tAdCreativesPost2CreateLinkAdImageCrop.php | 48 + .../AdAccountAdCreativesPost2CreateMAIDPA.php | 49 + ...countAdCreativesPost2CreateVideoLeadAd.php | 47 + ...tAdCreativesPost2CreateVideoPageLikeAd.php | 48 + ...AccountAdCreativesPostCreateAdCreative.php | 47 + ...tAdCreativesPostCreateAdCreativeCanvas.php | 48 + ...tCreateAdCreativeCustomizationCanvasDV.php | 48 + ...eateAdCreativeCustomizationCanvasImage.php | 48 + ...eateAdCreativeCustomizationCanvasVideo.php | 48 + ...tAdCreativesPostCreateAdCreativeLinkAd.php | 48 + ...dCreativesPostCreateAdCreativePageLike.php | 48 + ...ountAdCreativesPostCreateAssetFeedSpec.php | 49 + ...stCreateCarouselCallToActionAppInstall.php | 48 + ...ativesPostCreateDynamicAdCustomization.php | 50 + ...PostCreateLinkAdCallToActionAppInstall.php | 48 + ...ntAdCreativesPostCreateLinkAdImageCrop.php | 48 + ...ntAdCreativesPostCreateLinkAdNotToPage.php | 52 + .../AdAccountAdCreativesPostCreateMAIDPA.php | 49 + ...ccountAdCreativesPostCreateVideoLeadAd.php | 47 + ...ntAdCreativesPostCreateVideoPageLikeAd.php | 48 + .../AdAccountAdSetsPost2CreateMAIA.php | 55 + .../AdAccountAdSetsPostAdSetCreateCpa.php | 59 + ...countAdSetsPostAdSetCreateCpaAppEvents.php | 57 + .../AdAccountAdSetsPostBehaviorTargeting.php | 53 + .../AdAccountAdSetsPostBidMultiplier.php | 56 + .../AdAccountAdSetsPostCreateAdSet.php | 56 + ...AccountAdSetsPostCreateAudienceNetwork.php | 53 + .../AdAccountAdSetsPostCreateCampaign.php | 49 + .../AdAccountAdSetsPostDailyBudget20.php | 56 + ...dAccountAdSetsPostDemographicTargeting.php | 55 + .../AdAccountAdSetsPostInterestTargeting.php | 55 + ...etsPostLifetimeBudget200Duration10Days.php | 56 + .../AdAccountAdSetsPostOfferClaim.php | 56 + ...ccountAdSetsPostOptimizePostEngagement.php | 56 + .../examples/AdAccountAdSetsPostPageLikes.php | 55 + .../AdAccountAdSetsPostPlacementTargeting.php | 54 + .../examples/AdAccountAdSetsPostReach.php | 55 + .../examples/AdAccountAdVideosPost.php | 47 + .../AdAccountAdsPixelEdgeGetPixelCode.php | 46 + .../examples/AdAccountAdsPixelsPost.php | 47 + .../examples/AdAccountAdsPost.php | 50 + .../AdAccountAdsPostAdsRedownload.php | 51 + .../examples/AdAccountAdsPostOfferClaim.php | 50 + ...AdAccountAdsPostTrackingPostEngagement.php | 51 + .../examples/AdAccountCampaignsEdge.php | 49 + .../AdAccountCampaignsPostConversions.php | 50 + .../AdAccountCampaignsPostEventResponses.php | 50 + .../AdAccountCampaignsPostLeadGen.php | 50 + .../AdAccountCampaignsPostLinkClicks.php | 50 + .../AdAccountCampaignsPostLocalAwareness.php | 50 + .../examples/AdAccountCampaignsPostMAIA.php | 50 + .../examples/AdAccountCampaignsPostMAIDPA.php | 50 + .../AdAccountCampaignsPostOfferClaims.php | 50 + .../AdAccountCampaignsPostPageLikes.php | 50 + .../AdAccountCampaignsPostPostEngagement.php | 50 + .../AdAccountCampaignsPostStoreCampaign.php | 51 + .../AdAccountCampaignsPostVideoViews.php | 50 + .../examples/AdAccountCustomAudiencesEdge.php | 47 + ...ntCustomAudiencesEdgeDataSourceSubtype.php | 48 + ...ustomAudiencesPostCreateCustomAudience.php | 50 + ...EventValueBasedLookalikeCustomAudience.php | 49 + ...namicValueBasedLookalikeCustomAudience.php | 49 + ...ncesPostPlatformCustomAudienceMACARule.php | 49 + ...stomAudiencesPostPlatformECAExclusions.php | 49 + ...omAudiencesPostPlatformECAMultiFilters.php | 49 + ...stomAudiencesPostPlatformECAMultiPages.php | 49 + ...esPostPlatformEngagementCustomAudience.php | 49 + ...encesPostPlatformWebsiteCustomAudience.php | 49 + ...mAudiencesPostValueBasedCustomAudience.php | 50 + ...sPostValueBasedLookalikeCustomAudience.php | 50 + .../AdAccountGeneratePreviewsEdge.php | 48 + ...GeneratePreviewsEdgeDesktopWithStoryId.php | 48 + ...GeneratePreviewsEdgeInstagramStandards.php | 48 + ...atePreviewsEdgeMaiaWithObjectStorySpec.php | 48 + .../examples/AdAccountNode.php | 46 + ...oductAudiencesPostIphoneViewNoPurchase.php | 50 + ...dAccountProductAudiencesPostNoPurchase.php | 50 + .../examples/AdAccountReachEstimate.php | 47 + .../examples/AdCampaignActivityNode.php | 46 + .../examples/AdCampaignGroupActivityNode.php | 46 + .../examples/AdCampaignGroupAdsEdge.php | 47 + ...GroupAdsEdgeAdgroupsWithStatusArchived.php | 48 + .../examples/AdCampaignGroupAdsetsEdge.php | 51 + .../examples/AdCampaignNode.php | 46 + .../examples/AdCampaignPost.php | 46 + .../examples/AdCampaignPostAdsetUpdateCpa.php | 49 + .../AdCreativeCreativeInsightsEdge.php | 47 + .../examples/AdCreativeNode.php | 46 + .../examples/AdCreativeNodeRead.php | 47 + ...dCreativeNodeReadInstagramPermalinkUrl.php | 46 + .../examples/AdCreativePreviewsEdge.php | 48 + .../AdCreativePreviewsEdgePreview.php | 47 + ...dCreativePreviewsEdgePreviewDynamicAds.php | 48 + ...dgePreviewDynamicAdsWithCustomizations.php | 49 + .../examples/AdgroupActivityNode.php | 46 + .../examples/AdgroupLeadsEdgeAdgroupLeads.php | 46 + .../AdgroupLeadsEdgeAdgroupLeadsDPA.php | 48 + .../AdgroupLeadsEdgeAdgroupLeadsFiltered.php | 47 + .../php-business-sdk/examples/AdgroupPost.php | 46 + .../examples/AdgroupPostUpdateStatus.php | 46 + .../AdsInsightsEdgeAdCampaignInsights.php | 48 + ...ightsEdgeStoreVisitsAdCampaignInsights.php | 48 + .../examples/AdsPixelEventsPost.php | 46 + .../examples/AdsPixelEventsPostCustom.php | 64 + .../examples/AdsPixelNodeGetPixelCode.php | 46 + .../examples/AdsPixelSharedAccountsEdge.php | 47 + .../examples/AdsPixelSharedAccountsPost.php | 47 + .../examples/AdsPixelSharedAgenciesEdge.php | 46 + ...dProductCatalogsPostDestinationCatalog.php | 48 + ...sOwnedProductCatalogsPostFlightCatalog.php | 48 + ...ssOwnedProductCatalogsPostHotelCatalog.php | 48 + ...OwnedProductCatalogsPostProductCatalog.php | 47 + .../examples/CustomAudienceDelete.php | 46 + .../examples/CustomAudienceNode.php | 45 + .../examples/CustomAudienceNodeReadRule.php | 47 + .../examples/CustomAudiencePost.php | 46 + .../examples/CustomAudienceUsersPost.php | 46 + .../CustomAudienceUsersPostCrossPlatform.php | 46 + .../MultiPageFeedCreateThenDelete.php | 77 + .../examples/MultiPromoteYourPage.php | 161 + .../OfflineConversionsCreateOfflineSet.php | 48 + .../examples/PageFeedEdge.php | 46 + .../examples/PageFeedPost.php | 47 + .../PageFeedPostFeedImageDeepLink.php | 48 + .../php-business-sdk/examples/PageNode.php | 49 + .../examples/PageNodePageSearch.php | 48 + .../examples/PagePhotosEdge.php | 46 + .../examples/PagePhotosPost.php | 48 + .../examples/PagePictureEdge.php | 47 + .../examples/PagePostCommentsEdge.php | 46 + .../examples/PagePostCommentsPost.php | 47 + .../examples/PagePostDelete.php | 46 + .../examples/PagePostNode.php | 45 + .../examples/PagePostPost.php | 46 + .../examples/PagePostsEdge.php | 46 + .../PagePostsEdgePagePostCreateCarousel.php | 51 + .../examples/PageRolesEdge.php | 46 + .../examples/PageSubscribedAppsPost.php | 46 + .../examples/ProductCatalogEventStatsEdge.php | 46 + .../examples/ProductCatalogHotelsPost.php | 56 + ...gHotelsPostUpdateHotelsCatalogSettings.php | 46 + ...ductCatalogProductFeedsPostProductFeed.php | 48 + .../ProductCatalogProductSetsPostHotelSet.php | 48 + ...roductCatalogProductSetsPostProductSet.php | 48 + .../examples/UserAccountsEdge.php | 46 + .../examples/UserAdAccountsEdge.php | 46 + .../examples/UserLeadGenInfoNode.php | 45 + .../php-business-sdk/examples/UserNode.php | 45 + .../examples/VideoThumbnailsEdge.php | 46 + .../examples/adgroup_creation.php | 201 + .../examples/aggregator_onboarding/README.md | 16 + .../examples/aggregator_onboarding/api.php | 403 ++ .../examples/aggregator_onboarding/index.css | 143 + .../examples/aggregator_onboarding/index.html | 174 + .../php-business-sdk/examples/curl_log.php | 67 + .../examples/custom_audiences.php | 81 + .../examples/server_side_api.php | 92 + .../php-business-sdk/fb_ca_chain_bundle.crt | 3920 +++++++++++ .../src/FacebookAds/AnonymousSession.php | 35 + .../php-business-sdk/src/FacebookAds/Api.php | 247 + .../src/FacebookAds/ApiConfig.php | 29 + .../src/FacebookAds/ApiRequest.php | 219 + .../src/FacebookAds/CrashReporter.php | 216 + .../src/FacebookAds/Cursor.php | 536 ++ .../src/FacebookAds/Enum/AbstractEnum.php | 181 + .../src/FacebookAds/Enum/EmptyEnum.php | 56 + .../Enum/EnumInstanceInterface.php | 91 + .../src/FacebookAds/Exception/Exception.php | 29 + .../Http/Adapter/AbstractAdapter.php | 56 + .../Http/Adapter/AdapterInterface.php | 64 + .../Http/Adapter/Curl/AbstractCurl.php | 130 + .../FacebookAds/Http/Adapter/Curl/Curl.php | 101 + .../FacebookAds/Http/Adapter/Curl/Curl55.php | 96 + .../Http/Adapter/Curl/CurlInterface.php | 106 + .../FacebookAds/Http/Adapter/CurlAdapter.php | 201 + .../src/FacebookAds/Http/Client.php | 220 + .../Http/Exception/AuthorizationException.php | 29 + .../Http/Exception/ClientException.php | 29 + .../Http/Exception/EmptyResponseException.php | 42 + .../Http/Exception/PermissionException.php | 29 + .../Http/Exception/RequestException.php | 257 + .../Http/Exception/ServerException.php | 29 + .../Http/Exception/ThrottleException.php | 29 + .../src/FacebookAds/Http/FileParameter.php | 89 + .../src/FacebookAds/Http/Headers.php | 29 + .../src/FacebookAds/Http/Parameters.php | 59 + .../src/FacebookAds/Http/Request.php | 296 + .../src/FacebookAds/Http/RequestInterface.php | 169 + .../src/FacebookAds/Http/Response.php | 125 + .../FacebookAds/Http/ResponseInterface.php | 73 + .../src/FacebookAds/Http/SimpleRequest.php | 74 + .../src/FacebookAds/Http/Util.php | 48 + .../src/FacebookAds/Logger/CurlLogger.php | 276 + .../Logger/CurlLogger/JsonAwareParameters.php | 38 + .../Logger/CurlLogger/JsonNode.php | 196 + .../FacebookAds/Logger/LoggerInterface.php | 54 + .../src/FacebookAds/Logger/NullLogger.php | 60 + .../Object/AbstractArchivableCrudObject.php | 92 + .../FacebookAds/Object/AbstractCrudObject.php | 531 ++ .../src/FacebookAds/Object/AbstractObject.php | 185 + .../src/FacebookAds/Object/Ad.php | 516 ++ .../src/FacebookAds/Object/AdAccount.php | 3037 +++++++++ .../FacebookAds/Object/AdAccountActivity.php | 80 + .../Object/AdAccountAdRulesHistory.php | 61 + .../FacebookAds/Object/AdAccountAdVolume.php | 59 + ...dAccountContentFilterLevelsInheritance.php | 57 + .../Object/AdAccountCreationRequest.php | 103 + .../Object/AdAccountDefaultDestination.php | 57 + .../Object/AdAccountDefaultObjective.php | 61 + .../Object/AdAccountDeliveryEstimate.php | 59 + ...countMatchedSearchApplicationsEdgeData.php | 59 + .../FacebookAds/Object/AdAccountMaxBid.php | 57 + .../Object/AdAccountPromotableObjects.php | 57 + .../Object/AdAccountReachEstimate.php | 57 + .../AdAccountRecommendedCamapaignBudget.php | 57 + .../src/FacebookAds/Object/AdAccountRoas.php | 57 + .../Object/AdAccountSubscribedApps.php | 64 + .../Object/AdAccountTargetingUnified.php | 69 + .../Object/AdAccountTrackingData.php | 57 + .../src/FacebookAds/Object/AdAccountUser.php | 76 + .../src/FacebookAds/Object/AdActivity.php | 63 + .../FacebookAds/Object/AdAssetFeedSpec.php | 59 + .../Object/AdAssetFeedSpecAssetLabel.php | 57 + .../Object/AdAssetFeedSpecBody.php | 57 + .../Object/AdAssetFeedSpecCaption.php | 57 + .../Object/AdAssetFeedSpecDescription.php | 57 + .../Object/AdAssetFeedSpecGroupRule.php | 57 + .../Object/AdAssetFeedSpecImage.php | 57 + .../Object/AdAssetFeedSpecLinkURL.php | 57 + .../Object/AdAssetFeedSpecTitle.php | 57 + .../Object/AdAssetFeedSpecVideo.php | 57 + .../src/FacebookAds/Object/AdAsyncRequest.php | 105 + .../FacebookAds/Object/AdAsyncRequestSet.php | 167 + .../AdAsyncRequestSetNotificationResult.php | 57 + .../FacebookAds/Object/AdBidAdjustments.php | 57 + .../FacebookAds/Object/AdCampaignActivity.php | 92 + .../Object/AdCampaignBidConstraint.php | 57 + .../Object/AdCampaignDeliveryEstimate.php | 59 + ...ampaignDeliveryStatsUnsupportedReasons.php | 57 + .../AdCampaignFrequencyControlSpecs.php | 57 + .../Object/AdCampaignGroupActivity.php | 84 + .../Object/AdCampaignIssuesInfo.php | 57 + .../Object/AdCampaignLearningStageInfo.php | 57 + .../Object/AdCampaignOptimizationEvent.php | 57 + .../Object/AdCampaignPacedBidInfo.php | 57 + .../src/FacebookAds/Object/AdCreative.php | 260 + .../Object/AdCreativeAdDisclaimer.php | 57 + .../AdCreativeCollectionThumbnailInfo.php | 57 + .../FacebookAds/Object/AdCreativeInsights.php | 57 + .../AdCreativeInteractiveComponentsSpec.php | 57 + .../FacebookAds/Object/AdCreativeLinkData.php | 61 + .../Object/AdCreativeLinkDataAppLinkSpec.php | 57 + .../Object/AdCreativeLinkDataCallToAction.php | 59 + .../AdCreativeLinkDataCallToActionValue.php | 57 + .../AdCreativeLinkDataChildAttachment.php | 57 + .../AdCreativeLinkDataImageLayerSpec.php | 71 + .../AdCreativeLinkDataImageOverlaySpec.php | 69 + .../AdCreativeLinkDataSponsorshipInfoSpec.php | 57 + .../AdCreativeLinkDataTemplateVideoSpec.php | 57 + .../Object/AdCreativeObjectStorySpec.php | 57 + .../Object/AdCreativePhotoData.php | 57 + .../AdCreativePhotoDataMediaElements.php | 57 + .../Object/AdCreativePlaceData.php | 57 + .../AdCreativePlatformCustomization.php | 57 + .../AdCreativePortraitCustomizations.php | 57 + .../AdCreativePostClickConfiguration.php | 57 + .../Object/AdCreativeRecommenderSettings.php | 57 + .../Object/AdCreativeStaticFallbackSpec.php | 57 + .../Object/AdCreativeTemplateURLSpec.php | 57 + .../FacebookAds/Object/AdCreativeTextData.php | 57 + .../Object/AdCreativeVideoData.php | 57 + .../Object/AdCustomizationRuleSpec.php | 57 + .../FacebookAds/Object/AdDynamicCreative.php | 57 + .../Object/AdEntityTargetSpend.php | 57 + .../src/FacebookAds/Object/AdImage.php | 264 + .../src/FacebookAds/Object/AdKeywords.php | 57 + .../src/FacebookAds/Object/AdLabel.php | 226 + .../Object/AdMonetizationProperty.php | 183 + .../AdNetworkAnalyticsAsyncQueryResult.php | 57 + .../AdNetworkAnalyticsSyncQueryResult.php | 67 + .../src/FacebookAds/Object/AdPlacePageSet.php | 93 + .../Object/AdPlacePageSetMetadata.php | 57 + .../src/FacebookAds/Object/AdPlacement.php | 80 + .../src/FacebookAds/Object/AdPreview.php | 68 + .../FacebookAds/Object/AdPromotedObject.php | 59 + .../FacebookAds/Object/AdRecommendation.php | 61 + .../Object/AdRecommendationData.php | 57 + .../src/FacebookAds/Object/AdReportRun.php | 120 + .../src/FacebookAds/Object/AdReportSpec.php | 80 + .../src/FacebookAds/Object/AdRule.php | 215 + .../Object/AdRuleEvaluationSpec.php | 59 + .../Object/AdRuleExecutionOptions.php | 59 + .../Object/AdRuleExecutionSpec.php | 59 + .../src/FacebookAds/Object/AdRuleFilters.php | 59 + .../src/FacebookAds/Object/AdRuleHistory.php | 59 + .../Object/AdRuleHistoryResult.php | 59 + .../Object/AdRuleHistoryResultAction.php | 57 + .../src/FacebookAds/Object/AdRuleSchedule.php | 57 + .../FacebookAds/Object/AdRuleScheduleSpec.php | 57 + .../src/FacebookAds/Object/AdRuleTrigger.php | 61 + .../src/FacebookAds/Object/AdSet.php | 704 ++ .../src/FacebookAds/Object/AdStudy.php | 228 + .../src/FacebookAds/Object/AdStudyCell.php | 204 + .../FacebookAds/Object/AdStudyObjective.php | 284 + .../FacebookAds/Object/AdStudyObjectiveID.php | 57 + .../src/FacebookAds/Object/AdVideo.php | 691 ++ .../FacebookAds/Object/AdgroupActivity.php | 84 + .../FacebookAds/Object/AdgroupIssuesInfo.php | 57 + ...AdgroupPlacementSpecificReviewFeedback.php | 57 + .../Object/AdgroupRelevanceScore.php | 57 + .../Object/AdgroupReviewFeedback.php | 57 + .../src/FacebookAds/Object/AdoptablePet.php | 80 + .../src/FacebookAds/Object/AdsActionStats.php | 57 + .../src/FacebookAds/Object/AdsImageCrops.php | 57 + .../src/FacebookAds/Object/AdsInsights.php | 78 + .../AdsOptimalDeliveryGrowthOpportunity.php | 57 + .../src/FacebookAds/Object/AdsPixel.php | 419 ++ .../src/FacebookAds/Object/AdsPixelStats.php | 57 + .../Object/AdsPixelStatsResult.php | 66 + .../src/FacebookAds/Object/AgeRange.php | 57 + .../Object/AgencyClientDeclaration.php | 57 + .../src/FacebookAds/Object/Album.php | 379 ++ .../src/FacebookAds/Object/AndroidAppLink.php | 57 + .../src/FacebookAds/Object/AppRequest.php | 104 + .../Object/AppRequestFormerRecipient.php | 57 + .../src/FacebookAds/Object/Application.php | 1673 +++++ .../src/FacebookAds/Object/AssignedUser.php | 57 + .../src/FacebookAds/Object/AsyncRequest.php | 61 + .../src/FacebookAds/Object/AsyncSession.php | 80 + .../src/FacebookAds/Object/AtlasCampaign.php | 197 + .../FacebookAds/Object/AttributionSpec.php | 57 + .../Object/AudienceInsightsStudySpec.php | 57 + .../Object/AudiencePermissionForActions.php | 57 + .../src/FacebookAds/Object/AudioCopyright.php | 80 + .../FacebookAds/Object/AutomotiveModel.php | 80 + .../Object/BilledAmountDetails.php | 57 + .../Object/BrandSafetyBlockListUsage.php | 57 + .../Object/BroadTargetingCategories.php | 64 + .../src/FacebookAds/Object/Business.php | 2186 +++++++ .../Object/BusinessAdAccountRequest.php | 57 + .../FacebookAds/Object/BusinessAgreement.php | 108 + .../Object/BusinessApplicationRequest.php | 57 + .../FacebookAds/Object/BusinessAssetGroup.php | 760 +++ .../Object/BusinessAssetSharingAgreement.php | 106 + .../BusinessOwnedObjectOnBehalfOfRequest.php | 82 + .../Object/BusinessPageRequest.php | 57 + .../Object/BusinessRoleRequest.php | 130 + .../src/FacebookAds/Object/BusinessUnit.php | 441 ++ .../src/FacebookAds/Object/BusinessUser.php | 229 + ...PASAdvertiserPartnershipRecommendation.php | 80 + .../Object/CPASCollaborationRequest.php | 89 + .../Object/CPASParentCatalogSettings.php | 107 + .../src/FacebookAds/Object/Campaign.php | 548 ++ .../CampaignGroupBrandConfiguration.php | 57 + ...mpaignGroupCollaborativeAdsPartnerInfo.php | 57 + .../Object/CanRedownloadInterface.php | 33 + .../src/FacebookAds/Object/Canvas.php | 179 + .../FacebookAds/Object/CanvasAdSettings.php | 57 + .../FacebookAds/Object/CanvasBodyElement.php | 57 + .../Object/CanvasCollectionThumbnail.php | 57 + .../Object/CatalogBasedTargeting.php | 57 + .../Object/CatalogItemAppLinks.php | 57 + .../Object/CatalogItemAppealStatus.php | 57 + .../Object/CatalogSubVerticalList.php | 57 + .../Object/CheckBatchRequestStatus.php | 57 + .../src/FacebookAds/Object/ChildEvent.php | 57 + .../FacebookAds/Object/ClickTrackingTag.php | 53 + .../CollaborativeAdsPartnerInfoListItem.php | 57 + .../Object/CollaborativeAdsShareSettings.php | 106 + .../src/FacebookAds/Object/Comment.php | 307 + .../Object/CommerceMerchantSettings.php | 310 + .../CommerceMerchantSettingsSetupStatus.php | 57 + .../src/FacebookAds/Object/CommerceOrder.php | 421 ++ .../Object/CommerceOrderTransactionDetail.php | 103 + .../src/FacebookAds/Object/CommercePayout.php | 57 + .../FacebookAds/Object/CommerceSettings.php | 57 + .../Object/ConnectionsTargeting.php | 57 + .../Object/ContentDeliveryReport.php | 61 + .../Object/ConversionActionQuery.php | 57 + .../Object/CopyrightReferenceContainer.php | 57 + .../src/FacebookAds/Object/CoverPhoto.php | 57 + .../FacebookAds/Object/CreativeHistory.php | 57 + .../Object/CreditPartitionActionOptions.php | 57 + .../src/FacebookAds/Object/Currency.php | 57 + .../src/FacebookAds/Object/CurrencyAmount.php | 57 + .../src/FacebookAds/Object/CustomAudience.php | 593 ++ .../Object/CustomAudienceAdAccount.php | 57 + .../Object/CustomAudienceDataSource.php | 61 + .../Object/CustomAudienceMultiKey.php | 193 + .../BirthYearNormalizer.php | 49 + .../CityNormalizer.php | 49 + .../CountryNormalizer.php | 52 + .../DateNormalizer.php | 56 + .../EmailNormalizer.php | 49 + .../FirstNameInitialNormalizer.php | 52 + .../FirstNameNormalizer.php | 49 + .../GenderNormalizer.php | 49 + .../HashNormalizer.php | 54 + .../LastNameNormalizer.php | 49 + .../MadidNormalizer.php | 49 + .../PhoneNormalizer.php | 49 + .../StateNormalizer.php | 49 + .../ValueNormalizerInterface.php | 42 + .../ZipNormalizer.php | 51 + .../Object/CustomAudienceSession.php | 57 + .../Object/CustomAudienceSharingStatus.php | 57 + .../Object/CustomAudienceStatus.php | 57 + .../FacebookAds/Object/CustomAudiencesTOS.php | 57 + .../CustomAudiencesharedAccountInfo.php | 57 + .../FacebookAds/Object/CustomConversion.php | 166 + .../Object/CustomConversionStatsResult.php | 59 + .../FacebookAds/Object/CustomUserSettings.php | 57 + .../src/FacebookAds/Object/DACheck.php | 59 + .../src/FacebookAds/Object/DayPart.php | 57 + .../src/FacebookAds/Object/DeliveryCheck.php | 57 + .../Object/DeliveryCheckExtraInfo.php | 57 + .../src/FacebookAds/Object/Destination.php | 80 + .../Object/DestinationCatalogSettings.php | 80 + .../src/FacebookAds/Object/Domain.php | 80 + .../FacebookAds/Object/DynamicContentSet.php | 80 + .../Object/DynamicPostChildAttachment.php | 57 + .../Object/DynamicPriceConfigByDate.php | 80 + .../src/FacebookAds/Object/Engagement.php | 57 + .../FacebookAds/Object/EntityAtTextRange.php | 59 + .../src/FacebookAds/Object/Event.php | 328 + .../FacebookAds/Object/EventSourceGroup.php | 159 + .../src/FacebookAds/Object/EventTour.php | 126 + .../src/FacebookAds/Object/Experience.php | 57 + .../src/FacebookAds/Object/ExtendedCredit.php | 211 + .../Object/ExtendedCreditAllocationConfig.php | 133 + .../Object/ExtendedCreditInvoiceGroup.php | 199 + .../Object/ExternalEventSource.php | 64 + .../FacebookAds/Object/FAMEExportConfig.php | 57 + .../AbstractArchivableCrudObjectFields.php | 33 + .../Object/Fields/AdAccountActivityFields.php | 103 + .../Fields/AdAccountAdRulesHistoryFields.php | 63 + .../Object/Fields/AdAccountAdVolumeFields.php | 69 + ...ntContentFilterLevelsInheritanceFields.php | 53 + .../Fields/AdAccountCreationRequestFields.php | 111 + .../AdAccountDefaultDestinationFields.php | 49 + .../AdAccountDefaultObjectiveFields.php | 49 + .../AdAccountDeliveryEstimateFields.php | 53 + .../Object/Fields/AdAccountFields.php | 165 + ...atchedSearchApplicationsEdgeDataFields.php | 61 + .../Object/Fields/AdAccountMaxBidFields.php | 47 + .../AdAccountPromotableObjectsFields.php | 51 + .../Fields/AdAccountReachEstimateFields.php | 49 + ...ccountRecommendedCamapaignBudgetFields.php | 51 + .../Object/Fields/AdAccountRoasFields.php | 103 + .../Fields/AdAccountSubscribedAppsFields.php | 49 + .../AdAccountTargetingUnifiedFields.php | 89 + .../Fields/AdAccountTrackingDataFields.php | 47 + .../Object/Fields/AdAccountUserFields.php | 51 + .../Object/Fields/AdActivityFields.php | 69 + .../AdAssetFeedSpecAssetLabelFields.php | 49 + .../Fields/AdAssetFeedSpecBodyFields.php | 51 + .../Fields/AdAssetFeedSpecCaptionFields.php | 51 + .../AdAssetFeedSpecDescriptionFields.php | 51 + .../Object/Fields/AdAssetFeedSpecFields.php | 79 + .../Fields/AdAssetFeedSpecGroupRuleFields.php | 59 + .../Fields/AdAssetFeedSpecImageFields.php | 55 + .../Fields/AdAssetFeedSpecLinkURLFields.php | 57 + .../Fields/AdAssetFeedSpecTitleFields.php | 51 + .../Fields/AdAssetFeedSpecVideoFields.php | 57 + .../Object/Fields/AdAsyncRequestFields.php | 63 + .../Object/Fields/AdAsyncRequestSetFields.php | 79 + ...syncRequestSetNotificationResultFields.php | 49 + .../Object/Fields/AdBidAdjustmentsFields.php | 51 + .../Fields/AdCampaignActivityFields.php | 161 + .../Fields/AdCampaignBidConstraintFields.php | 47 + .../AdCampaignDeliveryEstimateFields.php | 53 + ...nDeliveryStatsUnsupportedReasonsFields.php | 49 + .../AdCampaignFrequencyControlSpecsFields.php | 51 + .../Fields/AdCampaignGroupActivityFields.php | 91 + .../Fields/AdCampaignIssuesInfoFields.php | 55 + .../AdCampaignLearningStageInfoFields.php | 53 + .../AdCampaignOptimizationEventFields.php | 51 + .../Fields/AdCampaignPacedBidInfoFields.php | 47 + .../Fields/AdCreativeAdDisclaimerFields.php | 51 + ...dCreativeCollectionThumbnailInfoFields.php | 51 + .../Object/Fields/AdCreativeFields.php | 167 + .../Fields/AdCreativeInsightsFields.php | 47 + ...reativeInteractiveComponentsSpecFields.php | 49 + .../AdCreativeLinkDataAppLinkSpecFields.php | 53 + .../AdCreativeLinkDataCallToActionFields.php | 49 + ...reativeLinkDataCallToActionValueFields.php | 67 + ...dCreativeLinkDataChildAttachmentFields.php | 67 + .../Fields/AdCreativeLinkDataFields.php | 109 + ...AdCreativeLinkDataImageLayerSpecFields.php | 71 + ...CreativeLinkDataImageOverlaySpecFields.php | 61 + ...ativeLinkDataSponsorshipInfoSpecFields.php | 49 + ...reativeLinkDataTemplateVideoSpecFields.php | 51 + .../AdCreativeObjectStorySpecFields.php | 59 + .../Fields/AdCreativePhotoDataFields.php | 57 + ...AdCreativePhotoDataMediaElementsFields.php | 53 + .../Fields/AdCreativePlaceDataFields.php | 57 + .../AdCreativePlatformCustomizationFields.php | 47 + ...AdCreativePortraitCustomizationsFields.php | 47 + ...AdCreativePostClickConfigurationFields.php | 49 + .../AdCreativeRecommenderSettingsFields.php | 49 + .../AdCreativeStaticFallbackSpecFields.php | 57 + .../AdCreativeTemplateURLSpecFields.php | 59 + .../Fields/AdCreativeTextDataFields.php | 47 + .../Fields/AdCreativeVideoDataFields.php | 79 + .../Fields/AdCustomizationRuleSpecFields.php | 65 + .../Object/Fields/AdDynamicCreativeFields.php | 47 + .../Fields/AdEntityTargetSpendFields.php | 55 + .../FacebookAds/Object/Fields/AdFields.php | 125 + .../Object/Fields/AdImageFields.php | 83 + .../Object/Fields/AdKeywordsFields.php | 53 + .../Object/Fields/AdLabelFields.php | 55 + .../Fields/AdMonetizationPropertyFields.php | 47 + ...NetworkAnalyticsAsyncQueryResultFields.php | 55 + ...dNetworkAnalyticsSyncQueryResultFields.php | 49 + .../Object/Fields/AdPlacePageSetFields.php | 61 + .../Fields/AdPlacePageSetMetadataFields.php | 53 + .../Object/Fields/AdPlacementFields.php | 61 + .../Object/Fields/AdPreviewFields.php | 51 + .../Object/Fields/AdPromotedObjectFields.php | 81 + .../Fields/AdRecommendationDataFields.php | 47 + .../Object/Fields/AdRecommendationFields.php | 59 + .../Object/Fields/AdReportRunFields.php | 111 + .../Object/Fields/AdReportSpecFields.php | 79 + .../Fields/AdRuleEvaluationSpecFields.php | 51 + .../Fields/AdRuleExecutionOptionsFields.php | 51 + .../Fields/AdRuleExecutionSpecFields.php | 49 + .../Object/Fields/AdRuleFields.php | 65 + .../Object/Fields/AdRuleFiltersFields.php | 51 + .../Object/Fields/AdRuleHistoryFields.php | 61 + .../AdRuleHistoryResultActionFields.php | 53 + .../Fields/AdRuleHistoryResultFields.php | 51 + .../Object/Fields/AdRuleScheduleFields.php | 51 + .../Fields/AdRuleScheduleSpecFields.php | 49 + .../Object/Fields/AdRuleTriggerFields.php | 53 + .../FacebookAds/Object/Fields/AdSetFields.php | 173 + .../Object/Fields/AdStudyCellFields.php | 55 + .../Object/Fields/AdStudyFields.php | 85 + .../Object/Fields/AdStudyObjectiveFields.php | 57 + .../Fields/AdStudyObjectiveIDFields.php | 51 + .../Object/Fields/AdVideoFields.php | 51 + .../Object/Fields/AdgroupActivityFields.php | 153 + .../Object/Fields/AdgroupIssuesInfoFields.php | 55 + ...pPlacementSpecificReviewFeedbackFields.php | 109 + .../Fields/AdgroupRelevanceScoreFields.php | 53 + .../Fields/AdgroupReviewFeedbackFields.php | 49 + .../Object/Fields/AdoptablePetFields.php | 101 + .../Object/Fields/AdsActionStatsFields.php | 99 + .../Object/Fields/AdsImageCropsFields.php | 59 + .../Object/Fields/AdsInsightsFields.php | 313 + ...OptimalDeliveryGrowthOpportunityFields.php | 51 + .../Object/Fields/AdsPixelFields.php | 75 + .../Object/Fields/AdsPixelStatsFields.php | 53 + .../Fields/AdsPixelStatsResultFields.php | 51 + .../Object/Fields/AgeRangeFields.php | 49 + .../src/FacebookAds/Object/Fields/Agency.php | 29 + .../Fields/AgencyClientDeclarationFields.php | 69 + .../FacebookAds/Object/Fields/AlbumFields.php | 91 + .../Object/Fields/AndroidAppLinkFields.php | 53 + .../Object/Fields/AppRequestFields.php | 63 + .../AppRequestFormerRecipientFields.php | 49 + .../Object/Fields/ApplicationFields.php | 247 + .../Object/Fields/AssignedUserFields.php | 53 + .../Object/Fields/AsyncRequestFields.php | 53 + .../Object/Fields/AsyncSessionFields.php | 75 + .../Object/Fields/AtlasCampaignFields.php | 241 + .../Object/Fields/AttributionSpecFields.php | 49 + .../AudienceInsightsStudySpecFields.php | 61 + .../AudiencePermissionForActionsFields.php | 55 + .../Object/Fields/AudioCopyrightFields.php | 71 + .../Object/Fields/AutomotiveModelFields.php | 99 + .../Fields/BilledAmountDetailsFields.php | 53 + .../BrandSafetyBlockListUsageFields.php | 55 + .../Fields/BroadTargetingCategoriesFields.php | 67 + .../Fields/BusinessAdAccountRequestFields.php | 49 + .../Object/Fields/BusinessAgreementFields.php | 49 + .../BusinessApplicationRequestFields.php | 49 + .../Fields/BusinessAssetGroupFields.php | 49 + .../BusinessAssetSharingAgreementFields.php | 57 + .../Object/Fields/BusinessFields.php | 81 + ...nessOwnedObjectOnBehalfOfRequestFields.php | 55 + .../Fields/BusinessPageRequestFields.php | 49 + .../Fields/BusinessRoleRequestFields.php | 73 + .../Object/Fields/BusinessUnitFields.php | 65 + .../Object/Fields/BusinessUserFields.php | 71 + ...ertiserPartnershipRecommendationFields.php | 63 + .../Fields/CPASCollaborationRequestFields.php | 65 + .../CPASParentCatalogSettingsFields.php | 51 + .../Object/Fields/CampaignFields.php | 125 + .../CampaignGroupBrandConfigurationFields.php | 51 + ...GroupCollaborativeAdsPartnerInfoFields.php | 45 + .../Object/Fields/CanvasAdSettingsFields.php | 59 + .../Object/Fields/CanvasBodyElementFields.php | 47 + .../CanvasCollectionThumbnailFields.php | 51 + .../Object/Fields/CanvasFields.php | 65 + .../Fields/CatalogBasedTargetingFields.php | 47 + .../Fields/CatalogItemAppLinksFields.php | 61 + .../Fields/CatalogItemAppealStatusFields.php | 53 + .../Fields/CatalogSubVerticalListFields.php | 149 + .../Fields/CheckBatchRequestStatusFields.php | 59 + .../Object/Fields/ChildEventFields.php | 53 + .../Object/Fields/ClickTrackingTagFields.php | 38 + ...laborativeAdsPartnerInfoListItemFields.php | 45 + .../CollaborativeAdsShareSettingsFields.php | 57 + .../Object/Fields/CommentFields.php | 91 + .../Fields/CommerceMerchantSettingsFields.php | 93 + ...merceMerchantSettingsSetupStatusFields.php | 57 + .../Object/Fields/CommerceOrderFields.php | 71 + .../CommerceOrderTransactionDetailFields.php | 63 + .../Object/Fields/CommercePayoutFields.php | 55 + .../Object/Fields/CommerceSettingsFields.php | 49 + .../Fields/ConnectionsTargetingFields.php | 49 + .../Fields/ContentDeliveryReportFields.php | 55 + .../Fields/ConversionActionQueryFields.php | 97 + .../CopyrightReferenceContainerFields.php | 69 + .../Object/Fields/CoverPhotoFields.php | 55 + .../Object/Fields/CreativeHistoryFields.php | 49 + .../CreditPartitionActionOptionsFields.php | 51 + .../Object/Fields/CurrencyAmountFields.php | 53 + .../Object/Fields/CurrencyFields.php | 53 + .../Fields/CustomAudienceAdAccountFields.php | 47 + .../Fields/CustomAudienceDataSourceFields.php | 51 + .../Object/Fields/CustomAudienceFields.php | 177 + .../CustomAudienceMultikeySchemaFields.php | 51 + .../Fields/CustomAudienceSessionFields.php | 61 + .../CustomAudienceSharingStatusFields.php | 49 + .../Fields/CustomAudienceStatusFields.php | 49 + .../Fields/CustomAudiencesTOSFields.php | 51 + .../CustomAudiencesharedAccountInfoFields.php | 55 + .../Object/Fields/CustomConversionFields.php | 89 + .../CustomConversionStatsResultFields.php | 51 + .../Fields/CustomUserSettingsFields.php | 49 + .../Object/Fields/DACheckFields.php | 57 + .../Object/Fields/DayPartFields.php | 53 + .../Fields/DeliveryCheckExtraInfoFields.php | 51 + .../Object/Fields/DeliveryCheckFields.php | 53 + .../DestinationCatalogSettingsFields.php | 49 + .../Object/Fields/DestinationFields.php | 73 + .../Object/Fields/DomainFields.php | 51 + .../Object/Fields/DynamicContentSetFields.php | 51 + .../DynamicPostChildAttachmentFields.php | 57 + .../Fields/DynamicPriceConfigByDateFields.php | 53 + .../Object/Fields/EngagementFields.php | 59 + .../Object/Fields/EntityAtTextRangeFields.php | 57 + .../FacebookAds/Object/Fields/EventFields.php | 111 + .../Object/Fields/EventSourceGroupFields.php | 53 + .../Object/Fields/EventTourFields.php | 73 + .../Object/Fields/ExperienceFields.php | 55 + .../ExtendedCreditAllocationConfigFields.php | 65 + .../Object/Fields/ExtendedCreditFields.php | 77 + .../ExtendedCreditInvoiceGroupFields.php | 57 + .../Fields/ExternalEventSourceFields.php | 51 + .../Object/Fields/FAMEExportConfigFields.php | 53 + .../Object/Fields/FlexibleTargetingFields.php | 101 + .../Object/Fields/FlightFields.php | 77 + .../Object/Fields/FriendListFields.php | 53 + .../FundingSourceDetailsCouponFields.php | 53 + .../Fields/FundingSourceDetailsFields.php | 53 + .../FacebookAds/Object/Fields/GroupFields.php | 83 + .../Object/Fields/HomeListingFields.php | 131 + .../FacebookAds/Object/Fields/HotelFields.php | 87 + .../Object/Fields/HotelRoomFields.php | 67 + .../Object/Fields/IDNameFields.php | 49 + .../Object/Fields/IGCommentFields.php | 61 + .../Object/Fields/IGMediaFields.php | 75 + .../Object/Fields/IGUserFields.php | 75 + .../Object/Fields/InsightsResultFields.php | 59 + .../Fields/InstagramInsightsResultFields.php | 57 + .../Fields/InstagramInsightsValueFields.php | 49 + .../Object/Fields/InstagramUserFields.php | 63 + .../Object/Fields/InstantArticleFields.php | 63 + ...nstantArticleInsightsQueryResultFields.php | 53 + .../Object/Fields/InvoiceCampaignFields.php | 61 + .../Object/Fields/IosAppLinkFields.php | 51 + .../Object/Fields/KeyValueFields.php | 49 + .../FacebookAds/Object/Fields/LeadFields.php | 79 + .../LeadGenAppointmentBookingInfoFields.php | 51 + ...ConditionalQuestionsGroupChoicesFields.php | 51 + ...nditionalQuestionsGroupQuestionsFields.php | 51 + .../Fields/LeadGenDraftQuestionFields.php | 61 + ...LeadGenPostSubmissionCheckResultFields.php | 51 + .../Object/Fields/LeadGenQuestionFields.php | 63 + .../Fields/LeadGenQuestionOptionFields.php | 49 + .../Object/Fields/LeadgenFormFields.php | 89 + .../Object/Fields/LifeEventFields.php | 61 + .../FacebookAds/Object/Fields/LinkFields.php | 69 + .../Object/Fields/LiveEncoderFields.php | 67 + .../Fields/LiveVideoAdBreakConfigFields.php | 65 + .../Object/Fields/LiveVideoErrorFields.php | 55 + .../Object/Fields/LiveVideoFields.php | 99 + .../Fields/LiveVideoInputStreamFields.php | 63 + .../Fields/LiveVideoTargetingFields.php | 53 + .../Object/Fields/LocationFields.php | 71 + .../Object/Fields/LookalikeSpecFields.php | 69 + .../Object/Fields/MailingAddressFields.php | 61 + .../Fields/MeasurementUploadEventFields.php | 65 + .../Object/Fields/MediaFingerprintFields.php | 59 + .../Fields/MessagingFeatureReviewFields.php | 49 + ...gerDestinationPageWelcomeMessageFields.php | 57 + .../Object/Fields/MessengerProfileFields.php | 61 + .../Object/Fields/MinimumBudgetFields.php | 55 + .../Fields/MusicVideoCopyrightFields.php | 73 + .../Fields/NativeOfferDiscountFields.php | 57 + .../Object/Fields/NativeOfferFields.php | 97 + .../Object/Fields/NativeOfferViewFields.php | 51 + .../Object/Fields/NullNodeFields.php | 45 + .../Fields/OfflineConversionDataSetFields.php | 87 + .../Fields/OfflineTermsOfServiceFields.php | 51 + .../Object/Fields/OffsitePixelFields.php | 57 + .../Object/Fields/OpenGraphContextFields.php | 47 + .../Object/Fields/OracleTransactionFields.php | 81 + .../Fields/OutcomePredictionPointFields.php | 53 + .../Object/Fields/PageAdminNoteFields.php | 55 + .../Object/Fields/PageCallToActionFields.php | 83 + .../Object/Fields/PageCategoryFields.php | 53 + .../Fields/PageChangeProposalFields.php | 57 + .../FacebookAds/Object/Fields/PageFields.php | 329 + .../Object/Fields/PageParkingFields.php | 51 + .../Fields/PagePaymentOptionsFields.php | 55 + .../Object/Fields/PagePostFields.php | 175 + .../Fields/PageRestaurantServicesFields.php | 65 + .../PageRestaurantSpecialtiesFields.php | 55 + .../Object/Fields/PageSavedFilterFields.php | 59 + .../Object/Fields/PageSettingsFields.php | 49 + .../Object/Fields/PageStartInfoFields.php | 49 + .../Object/Fields/PageThreadOwnerFields.php | 47 + .../Fields/PageUpcomingChangeFields.php | 57 + .../PageUserMessageThreadLabelFields.php | 49 + .../Object/Fields/PartnerStudyFields.php | 81 + .../Fields/PaymentPricepointsFields.php | 47 + .../Fields/PaymentSubscriptionFields.php | 93 + .../Object/Fields/PermissionFields.php | 49 + .../Object/Fields/PersonaFields.php | 51 + .../FacebookAds/Object/Fields/PhotoFields.php | 99 + .../FacebookAds/Object/Fields/PlaceFields.php | 53 + .../Object/Fields/PlaceTopicFields.php | 61 + .../Fields/PlatformImageSourceFields.php | 51 + .../Object/Fields/PlayableContentFields.php | 61 + .../FacebookAds/Object/Fields/PostFields.php | 189 + .../Object/Fields/PrivacyFields.php | 57 + .../Object/Fields/ProductAudienceFields.php | 41 + .../Fields/ProductCatalogCategoryFields.php | 61 + .../Object/Fields/ProductCatalogFields.php | 79 + .../ProductCatalogHotelRoomsBatchFields.php | 53 + .../ProductCatalogImageSettingsFields.php | 49 + ...uctCatalogImageSettingsOperationFields.php | 47 + ...ductCatalogPricingVariablesBatchFields.php | 53 + .../ProductCatalogProductSetsBatchFields.php | 53 + .../Object/Fields/ProductEventStatFields.php | 67 + .../Object/Fields/ProductFeedFields.php | 87 + ...ctFeedMissingFeedItemReplacementFields.php | 53 + .../Object/Fields/ProductFeedRuleFields.php | 53 + .../ProductFeedRuleSuggestionFields.php | 51 + .../Fields/ProductFeedScheduleFields.php | 65 + ...oductFeedUploadDiagnosticsReportFields.php | 49 + .../Fields/ProductFeedUploadErrorFields.php | 59 + .../ProductFeedUploadErrorReportFields.php | 49 + .../ProductFeedUploadErrorSampleFields.php | 51 + .../Object/Fields/ProductFeedUploadFields.php | 71 + .../Object/Fields/ProductGroupFields.php | 53 + .../ProductItemCommerceInsightsFields.php | 51 + .../Object/Fields/ProductItemFields.php | 205 + .../Object/Fields/ProductSetFields.php | 65 + .../Fields/ProductSetMetadataFields.php | 53 + .../Object/Fields/ProductVariantFields.php | 51 + .../Object/Fields/ProfileFields.php | 67 + .../Fields/ProfilePictureSourceFields.php | 63 + .../Fields/PublisherBlockListFields.php | 65 + .../Object/Fields/RTBDynamicPostFields.php | 67 + .../Object/Fields/RawCustomAudienceFields.php | 49 + .../Fields/ReachFrequencyActivityFields.php | 57 + .../Fields/ReachFrequencyAdFormatFields.php | 49 + ...equencyCurveLowerConfidenceRangeFields.php | 57 + ...equencyCurveUpperConfidenceRangeFields.php | 57 + .../Fields/ReachFrequencyDayPartFields.php | 51 + .../ReachFrequencyEstimatesCurveFields.php | 61 + ...uencyEstimatesPlacementBreakdownFields.php | 69 + .../Fields/ReachFrequencyPredictionFields.php | 239 + .../Fields/ReachFrequencySpecFields.php | 61 + ...dOnlyAnalyticsUserPropertyConfigFields.php | 49 + .../Object/Fields/RecommendationFields.php | 61 + .../Object/Fields/ReferralFields.php | 71 + .../Object/Fields/RevSharePolicyFields.php | 49 + .../Object/Fields/RichMediaElementFields.php | 51 + .../Object/Fields/SavedAudienceFields.php | 69 + .../Fields/SavedMessageResponseFields.php | 57 + .../Object/Fields/SecuritySettingsFields.php | 45 + .../Object/Fields/SplitTestWinnerFields.php | 51 + .../Fields/StoreCatalogSettingsFields.php | 49 + .../Object/Fields/SystemUserFields.php | 38 + .../FacebookAds/Object/Fields/TabFields.php | 65 + .../Fields/TargetingDynamicRuleFields.php | 61 + .../Object/Fields/TargetingFields.php | 221 + .../Fields/TargetingGeoLocationCityFields.php | 59 + ...rgetingGeoLocationCustomLocationFields.php | 73 + ...tingGeoLocationElectoralDistrictFields.php | 53 + .../Fields/TargetingGeoLocationFields.php | 85 + .../TargetingGeoLocationGeoEntitiesFields.php | 55 + ...getingGeoLocationLocationClusterFields.php | 47 + ...tingGeoLocationLocationExpansionFields.php | 47 + .../TargetingGeoLocationMarketFields.php | 53 + .../TargetingGeoLocationPlaceFields.php | 63 + ...tingGeoLocationPoliticalDistrictFields.php | 53 + .../TargetingGeoLocationRegionFields.php | 51 + .../Fields/TargetingGeoLocationZipFields.php | 55 + .../TargetingProductAudienceSpecFields.php | 51 + .../TargetingProductAudienceSubSpecFields.php | 49 + .../TargetingProspectingAudienceFields.php | 47 + .../Fields/TargetingRelaxationFields.php | 47 + .../Fields/TargetingSentenceLineFields.php | 51 + ...irdPartyMeasurementReportDatasetFields.php | 55 + ...rackingAndConversionWithDefaultsFields.php | 53 + .../FacebookAds/Object/Fields/URLFields.php | 59 + .../Object/Fields/UnifiedThreadFields.php | 77 + .../Object/Fields/UserCoverPhotoFields.php | 51 + .../Object/Fields/UserDeviceFields.php | 49 + .../FacebookAds/Object/Fields/UserFields.php | 161 + .../Object/Fields/UserIDForAppFields.php | 49 + .../Object/Fields/UserIDForPageFields.php | 49 + .../UserLeadGenDisclaimerResponseFields.php | 49 + .../Fields/UserLeadGenFieldDataFields.php | 49 + .../Fields/UserPaymentMethodsInfoFields.php | 59 + .../UserPaymentMobilePricepointsFields.php | 53 + .../UserPaymentModulesOptionsFields.php | 53 + .../Fields/ValueBasedEligibleSourceFields.php | 51 + .../Object/Fields/VehicleFields.php | 135 + .../Object/Fields/VehicleOfferFields.php | 113 + .../VideoCopyrightConditionGroupFields.php | 51 + .../Object/Fields/VideoCopyrightFields.php | 77 + .../Fields/VideoCopyrightGeoGateFields.php | 49 + .../Fields/VideoCopyrightRuleFields.php | 59 + .../Fields/VideoCopyrightSegmentFields.php | 51 + .../Object/Fields/VideoListFields.php | 63 + .../Object/Fields/VideoPollFields.php | 59 + .../Object/Fields/VideoThumbnailFields.php | 59 + .../Object/Fields/VideoUploadLimitsFields.php | 49 + .../Object/Fields/VoipInfoFields.php | 59 + .../Object/Fields/WebAppLinkFields.php | 49 + .../Fields/WhatsAppBusinessAccountFields.php | 67 + .../Object/Fields/WindowsAppLinkFields.php | 53 + .../Fields/WindowsPhoneAppLinkFields.php | 51 + .../Object/Fields/WorkUserFrontlineFields.php | 49 + .../FacebookAds/Object/FlexibleTargeting.php | 57 + .../src/FacebookAds/Object/Flight.php | 112 + .../src/FacebookAds/Object/FriendList.php | 80 + .../Object/FundingSourceDetails.php | 57 + .../Object/FundingSourceDetailsCoupon.php | 57 + .../src/FacebookAds/Object/Group.php | 942 +++ .../src/FacebookAds/Object/HomeListing.php | 147 + .../src/FacebookAds/Object/Hotel.php | 168 + .../src/FacebookAds/Object/HotelRoom.php | 136 + .../src/FacebookAds/Object/IDName.php | 57 + .../src/FacebookAds/Object/IGComment.php | 174 + .../src/FacebookAds/Object/IGMedia.php | 203 + .../src/FacebookAds/Object/IGUser.php | 284 + .../src/FacebookAds/Object/InsightsResult.php | 61 + .../Object/InstagramInsightsResult.php | 61 + .../Object/InstagramInsightsValue.php | 57 + .../src/FacebookAds/Object/InstagramUser.php | 177 + .../src/FacebookAds/Object/InstantArticle.php | 135 + .../InstantArticleInsightsQueryResult.php | 61 + .../FacebookAds/Object/InvoiceCampaign.php | 57 + .../src/FacebookAds/Object/IosAppLink.php | 57 + .../src/FacebookAds/Object/KeyValue.php | 57 + .../src/FacebookAds/Object/Lead.php | 110 + .../Object/LeadGenAppointmentBookingInfo.php | 57 + ...eadGenConditionalQuestionsGroupChoices.php | 57 + ...dGenConditionalQuestionsGroupQuestions.php | 57 + .../Object/LeadGenDraftQuestion.php | 57 + .../LeadGenPostSubmissionCheckResult.php | 57 + .../FacebookAds/Object/LeadGenQuestion.php | 57 + .../Object/LeadGenQuestionOption.php | 57 + .../src/FacebookAds/Object/LeadgenForm.php | 187 + .../src/FacebookAds/Object/LifeEvent.php | 136 + .../src/FacebookAds/Object/Link.php | 197 + .../src/FacebookAds/Object/LiveEncoder.php | 211 + .../src/FacebookAds/Object/LiveVideo.php | 402 ++ .../Object/LiveVideoAdBreakConfig.php | 57 + .../src/FacebookAds/Object/LiveVideoError.php | 80 + .../Object/LiveVideoInputStream.php | 81 + .../FacebookAds/Object/LiveVideoTargeting.php | 57 + .../src/FacebookAds/Object/Location.php | 57 + .../src/FacebookAds/Object/LookalikeSpec.php | 57 + .../src/FacebookAds/Object/MailingAddress.php | 80 + .../Object/MeasurementUploadEvent.php | 134 + .../FacebookAds/Object/MediaFingerprint.php | 132 + .../Object/MessagingFeatureReview.php | 57 + ...MessengerDestinationPageWelcomeMessage.php | 80 + .../FacebookAds/Object/MessengerProfile.php | 57 + .../src/FacebookAds/Object/MinimumBudget.php | 64 + .../Object/MusicVideoCopyright.php | 80 + .../src/FacebookAds/Object/NativeOffer.php | 172 + .../Object/NativeOfferDiscount.php | 57 + .../FacebookAds/Object/NativeOfferView.php | 159 + .../src/FacebookAds/Object/NullNode.php | 57 + .../FacebookAds/Object/ObjectStorySpec.php | 42 + .../Object/OfflineConversionDataSet.php | 448 ++ .../Object/OfflineTermsOfService.php | 80 + .../src/FacebookAds/Object/OffsitePixel.php | 88 + .../FacebookAds/Object/OpenGraphContext.php | 80 + .../FacebookAds/Object/OracleTransaction.php | 105 + .../Object/OutcomePredictionPoint.php | 57 + .../src/FacebookAds/Object/Page.php | 3397 ++++++++++ .../src/FacebookAds/Object/PageAdminNote.php | 80 + .../FacebookAds/Object/PageCallToAction.php | 152 + .../src/FacebookAds/Object/PageCategory.php | 57 + .../FacebookAds/Object/PageChangeProposal.php | 57 + .../src/FacebookAds/Object/PageParking.php | 57 + .../FacebookAds/Object/PagePaymentOptions.php | 57 + .../src/FacebookAds/Object/PagePost.php | 483 ++ .../Object/PageRestaurantServices.php | 57 + .../Object/PageRestaurantSpecialties.php | 57 + .../FacebookAds/Object/PageSavedFilter.php | 80 + .../src/FacebookAds/Object/PageSettings.php | 57 + .../src/FacebookAds/Object/PageStartInfo.php | 57 + .../FacebookAds/Object/PageThreadOwner.php | 57 + .../FacebookAds/Object/PageUpcomingChange.php | 104 + .../Object/PageUserMessageThreadLabel.php | 151 + .../src/FacebookAds/Object/PartnerStudy.php | 80 + .../FacebookAds/Object/PaymentPricepoints.php | 57 + .../Object/PaymentSubscription.php | 80 + .../src/FacebookAds/Object/Permission.php | 59 + .../src/FacebookAds/Object/Persona.php | 103 + .../src/FacebookAds/Object/Photo.php | 334 + .../src/FacebookAds/Object/Place.php | 80 + .../src/FacebookAds/Object/PlaceTopic.php | 87 + .../Object/PlatformImageSource.php | 57 + .../FacebookAds/Object/PlayableContent.php | 87 + .../src/FacebookAds/Object/Post.php | 597 ++ .../src/FacebookAds/Object/Privacy.php | 57 + .../FacebookAds/Object/ProductAudience.php | 45 + .../src/FacebookAds/Object/ProductCatalog.php | 1340 ++++ .../Object/ProductCatalogCategory.php | 66 + .../Object/ProductCatalogHotelRoomsBatch.php | 57 + .../Object/ProductCatalogImageSettings.php | 57 + .../ProductCatalogImageSettingsOperation.php | 57 + .../ProductCatalogPricingVariablesBatch.php | 57 + .../Object/ProductCatalogProductSetsBatch.php | 57 + .../FacebookAds/Object/ProductEventStat.php | 63 + .../src/FacebookAds/Object/ProductFeed.php | 507 ++ .../ProductFeedMissingFeedItemReplacement.php | 57 + .../FacebookAds/Object/ProductFeedRule.php | 129 + .../Object/ProductFeedRuleSuggestion.php | 57 + .../Object/ProductFeedSchedule.php | 131 + .../FacebookAds/Object/ProductFeedUpload.php | 135 + .../ProductFeedUploadDiagnosticsReport.php | 57 + .../Object/ProductFeedUploadError.php | 137 + .../Object/ProductFeedUploadErrorReport.php | 57 + .../Object/ProductFeedUploadErrorSample.php | 80 + .../src/FacebookAds/Object/ProductGroup.php | 252 + .../src/FacebookAds/Object/ProductItem.php | 243 + .../Object/ProductItemCommerceInsights.php | 57 + .../src/FacebookAds/Object/ProductSet.php | 338 + .../FacebookAds/Object/ProductSetMetadata.php | 57 + .../src/FacebookAds/Object/ProductVariant.php | 57 + .../src/FacebookAds/Object/Profile.php | 116 + .../Object/ProfilePictureSource.php | 61 + .../FacebookAds/Object/PublisherBlockList.php | 185 + .../src/FacebookAds/Object/RTBDynamicPost.php | 136 + .../FacebookAds/Object/RawCustomAudience.php | 57 + .../Object/ReachFrequencyActivity.php | 57 + .../Object/ReachFrequencyAdFormat.php | 57 + ...eachFrequencyCurveLowerConfidenceRange.php | 57 + ...eachFrequencyCurveUpperConfidenceRange.php | 57 + .../Object/ReachFrequencyDayPart.php | 57 + .../Object/ReachFrequencyEstimatesCurve.php | 57 + ...chFrequencyEstimatesPlacementBreakdown.php | 57 + .../Object/ReachFrequencyPrediction.php | 93 + .../FacebookAds/Object/ReachFrequencySpec.php | 57 + .../ReadOnlyAnalyticsUserPropertyConfig.php | 80 + .../src/FacebookAds/Object/Recommendation.php | 57 + .../src/FacebookAds/Object/Referral.php | 138 + .../src/FacebookAds/Object/RevSharePolicy.php | 57 + .../FacebookAds/Object/RichMediaElement.php | 57 + .../src/FacebookAds/Object/SavedAudience.php | 80 + .../Object/SavedMessageResponse.php | 80 + .../Search/DemographicSearchClasses.php | 50 + .../Object/Search/TargetingSearchTypes.php | 49 + .../FacebookAds/Object/SecuritySettings.php | 57 + .../Object/ServerSide/AdsPixelSettings.php | 201 + .../Object/ServerSide/AsyncClient.php | 53 + .../Object/ServerSide/BatchProcessor.php | 121 + .../FacebookAds/Object/ServerSide/Content.php | 279 + .../Object/ServerSide/CustomData.php | 604 ++ .../Object/ServerSide/DeliveryCategory.php | 52 + .../FacebookAds/Object/ServerSide/Event.php | 456 ++ .../Object/ServerSide/EventRequest.php | 460 ++ .../Object/ServerSide/EventRequestAsync.php | 89 + .../Object/ServerSide/EventResponse.php | 234 + .../FacebookAds/Object/ServerSide/Gender.php | 44 + .../Object/ServerSide/HttpMethod.php | 34 + .../ServerSide/HttpServiceClientConfig.php | 57 + .../ServerSide/HttpServiceInterface.php | 37 + .../Object/ServerSide/Normalizer.php | 309 + .../Object/ServerSide/Singleton.php | 44 + .../Object/ServerSide/UserData.php | 805 +++ .../FacebookAds/Object/ServerSide/Util.php | 149 + .../FacebookAds/Object/SplitTestWinner.php | 57 + .../Object/StoreCatalogSettings.php | 127 + .../src/FacebookAds/Object/SystemUser.php | 52 + .../src/FacebookAds/Object/Tab.php | 57 + .../src/FacebookAds/Object/Targeting.php | 61 + .../Object/TargetingDynamicRule.php | 57 + .../Object/TargetingGeoLocation.php | 57 + .../Object/TargetingGeoLocationCity.php | 57 + .../TargetingGeoLocationCustomLocation.php | 57 + .../TargetingGeoLocationElectoralDistrict.php | 57 + .../TargetingGeoLocationGeoEntities.php | 57 + .../TargetingGeoLocationLocationCluster.php | 57 + .../TargetingGeoLocationLocationExpansion.php | 57 + .../Object/TargetingGeoLocationMarket.php | 57 + .../Object/TargetingGeoLocationPlace.php | 57 + .../TargetingGeoLocationPoliticalDistrict.php | 57 + .../Object/TargetingGeoLocationRegion.php | 57 + .../Object/TargetingGeoLocationZip.php | 57 + .../Object/TargetingProductAudienceSpec.php | 57 + .../TargetingProductAudienceSubSpec.php | 57 + .../Object/TargetingProspectingAudience.php | 57 + .../Object/TargetingRelaxation.php | 57 + .../FacebookAds/Object/TargetingSearch.php | 65 + .../Object/TargetingSentenceLine.php | 64 + .../ThirdPartyMeasurementReportDataset.php | 104 + .../TrackingAndConversionWithDefaults.php | 57 + .../Traits/AdLabelAwareCrudObjectTrait.php | 70 + .../Object/Traits/FieldValidation.php | 48 + .../Object/Traits/ObjectValidation.php | 54 + .../src/FacebookAds/Object/URL.php | 112 + .../src/FacebookAds/Object/UnifiedThread.php | 108 + .../src/FacebookAds/Object/User.php | 1738 +++++ .../src/FacebookAds/Object/UserCoverPhoto.php | 57 + .../src/FacebookAds/Object/UserDevice.php | 57 + .../src/FacebookAds/Object/UserIDForApp.php | 57 + .../src/FacebookAds/Object/UserIDForPage.php | 57 + .../Object/UserLeadGenDisclaimerResponse.php | 57 + .../Object/UserLeadGenFieldData.php | 57 + .../Object/UserPaymentMethodsInfo.php | 57 + .../Object/UserPaymentMobilePricepoints.php | 57 + .../Object/UserPaymentModulesOptions.php | 57 + .../Object/ValueBasedEligibleSource.php | 57 + .../AdAccountAdRulesHistoryActionValues.php | 51 + ...ountAdRulesHistoryEvaluationTypeValues.php | 42 + ...ccountAdVolumeRecommendationTypeValues.php | 52 + .../Values/AdAccountClaimObjectiveValues.php | 48 + .../Values/AdAccountContentTypeValues.php | 52 + .../Object/Values/AdAccountCurrencyValues.php | 95 + ...ObjectiveDefaultObjectiveForUserValues.php | 58 + ...efaultObjectiveObjectiveForLevelValues.php | 58 + ...DeliveryEstimateOptimizationGoalValues.php | 66 + ...archApplicationsEdgeDataAppStoreValues.php | 53 + .../Values/AdAccountPermittedTasksValues.php | 43 + .../Object/Values/AdAccountSubtypeValues.php | 55 + ...dAccountTargetingUnifiedAppStoreValues.php | 53 + ...AccountTargetingUnifiedLimitTypeValues.php | 66 + .../AdAccountTargetingUnifiedModeValues.php | 44 + ...AccountTargetingUnifiedObjectiveValues.php | 56 + ...getingUnifiedRegulatedCategoriesValues.php | 45 + ...TargetingUnifiedWhitelistedTypesValues.php | 159 + .../Object/Values/AdAccountTasksValues.php | 43 + .../Values/AdActivityCategoryValues.php | 51 + .../Values/AdActivityDataSourceValues.php | 42 + .../Values/AdActivityEventTypeValues.php | 116 + ...AdAssetFeedSpecCallToActionTypesValues.php | 103 + ...dAsyncRequestSetNotificationModeValues.php | 42 + ...syncRequestSetNotificationStatusValues.php | 43 + .../Values/AdAsyncRequestStatusesValues.php | 53 + .../Object/Values/AdBidTypeValues.php | 45 + ...AdCampaignActivityBidStrategyNewValues.php | 44 + ...AdCampaignActivityBidStrategyOldValues.php | 44 + ...dCampaignActivityBillingEventNewValues.php | 49 + ...dCampaignActivityBillingEventOldValues.php | 49 + ...paignActivityOptimizationGoalNewValues.php | 66 + ...paignActivityOptimizationGoalOldValues.php | 66 + ...DeliveryEstimateOptimizationGoalValues.php | 66 + ...ampaignGroupActivityObjectiveNewValues.php | 58 + ...ampaignGroupActivityObjectiveOldValues.php | 58 + .../Values/AdConfiguredStatusValues.php | 44 + .../AdCreativeApplinkTreatmentValues.php | 43 + .../AdCreativeAuthorizationCategoryValues.php | 42 + .../AdCreativeCallToActionTypeValues.php | 103 + ...AdCreativeCategorizationCriteriaValues.php | 43 + .../AdCreativeCategoryMediaSourceValues.php | 44 + .../Values/AdCreativeDynamicAdVoiceValues.php | 42 + ...AdCreativeInstantCheckoutSettingValues.php | 42 + ...dCreativeLinkDataAttachmentStyleValues.php | 42 + ...CreativeLinkDataCallToActionTypeValues.php | 103 + .../AdCreativeLinkDataFormatOptionValues.php | 44 + ...nkDataImageLayerSpecBlendingModeValues.php | 43 + ...inkDataImageLayerSpecFrameSourceValues.php | 41 + ...inkDataImageLayerSpecImageSourceValues.php | 41 + ...eLinkDataImageLayerSpecLayerTypeValues.php | 43 + ...ataImageLayerSpecOverlayPositionValues.php | 49 + ...nkDataImageLayerSpecOverlayShapeValues.php | 45 + ...veLinkDataImageLayerSpecTextFontValues.php | 49 + ...taImageOverlaySpecCustomTextTypeValues.php | 41 + ...aImageOverlaySpecOverlayTemplateValues.php | 43 + ...LinkDataImageOverlaySpecPositionValues.php | 44 + ...LinkDataImageOverlaySpecTextFontValues.php | 50 + ...LinkDataImageOverlaySpecTextTypeValues.php | 48 + ...nkDataImageOverlaySpecThemeColorValues.php | 56 + .../Values/AdCreativeObjectTypeValues.php | 53 + .../Values/AdCreativeOperatorValues.php | 42 + .../Object/Values/AdCreativeStatusValues.php | 44 + .../Object/Values/AdDatePresetValues.php | 59 + .../Object/Values/AdEffectiveStatusValues.php | 52 + .../Values/AdExecutionOptionsValues.php | 43 + .../Object/Values/AdImageStatusValues.php | 42 + ...SyncQueryResultAggregationPeriodValues.php | 42 + ...alyticsSyncQueryResultBreakdownsValues.php | 61 + ...kAnalyticsSyncQueryResultMetricsValues.php | 60 + ...icsSyncQueryResultOrderingColumnValues.php | 43 + ...yticsSyncQueryResultOrderingTypeValues.php | 42 + .../Object/Values/AdOperatorValues.php | 42 + .../Values/AdPlacePageSetCategoryValues.php | 42 + .../AdPlacePageSetLocationTypesValues.php | 42 + .../AdPlacePageSetTargetedAreaTypeValues.php | 43 + .../Object/Values/AdPreviewAdFormatValues.php | 72 + .../Values/AdPreviewRenderTypeValues.php | 41 + .../AdPromotedObjectCustomEventTypeValues.php | 68 + .../AdRecommendationConfidenceValues.php | 43 + .../AdRecommendationImportanceValues.php | 43 + ...RuleEvaluationSpecEvaluationTypeValues.php | 42 + .../AdRuleExecutionOptionsOperatorValues.php | 42 + ...AdRuleExecutionSpecExecutionTypeValues.php | 53 + .../Values/AdRuleFiltersOperatorValues.php | 53 + .../Values/AdRuleHistoryActionValues.php | 51 + .../AdRuleHistoryResultObjectTypeValues.php | 43 + .../Object/Values/AdRuleStatusValues.php | 43 + .../Values/AdRuleTriggerOperatorValues.php | 53 + .../Object/Values/AdRuleTriggerTypeValues.php | 45 + .../Object/Values/AdSetBidStrategyValues.php | 44 + .../Object/Values/AdSetBillingEventValues.php | 49 + .../Values/AdSetConfiguredStatusValues.php | 44 + .../Object/Values/AdSetDatePresetValues.php | 59 + .../Values/AdSetDestinationTypeValues.php | 46 + .../Values/AdSetEffectiveStatusValues.php | 47 + .../Values/AdSetExecutionOptionsValues.php | 42 + .../AdSetFullFunnelExplorationModeValues.php | 43 + ...AdSetMultiOptimizationGoalWeightValues.php | 44 + .../Object/Values/AdSetOperatorValues.php | 42 + .../Values/AdSetOptimizationGoalValues.php | 66 + .../AdSetOptimizationSubEventValues.php | 50 + .../Object/Values/AdSetStatusOptionValues.php | 43 + .../Object/Values/AdSetStatusValues.php | 44 + .../Values/AdSetTuneForCategoryValues.php | 45 + .../Object/Values/AdStatusOptionValues.php | 43 + .../Object/Values/AdStatusValues.php | 44 + .../AdStudyCellCreationTemplateValues.php | 58 + .../Values/AdStudyObjectiveTypeValues.php | 49 + .../Object/Values/AdStudyTypeValues.php | 45 + .../AdVideoBackdatedTimeGranularityValues.php | 46 + .../Values/AdVideoContainerTypeValues.php | 155 + .../Values/AdVideoContentCategoryValues.php | 58 + .../Object/Values/AdVideoFormattingValues.php | 42 + .../AdVideoOriginalProjectionTypeValues.php | 43 + .../Object/Values/AdVideoSwapModeValues.php | 41 + .../Object/Values/AdVideoTypeValues.php | 42 + .../AdVideoUnpublishedContentTypeValues.php | 47 + .../Values/AdVideoUploadPhaseValues.php | 44 + .../AdgroupActivityObjectiveNewValues.php | 58 + .../AdgroupActivityObjectiveOldValues.php | 58 + ...InsightsActionAttributionWindowsValues.php | 48 + .../AdsInsightsActionBreakdownsValues.php | 50 + .../AdsInsightsActionReportTimeValues.php | 43 + .../Values/AdsInsightsBreakdownsValues.php | 62 + .../Values/AdsInsightsDatePresetValues.php | 59 + .../Object/Values/AdsInsightsLevelValues.php | 44 + ...sInsightsSummaryActionBreakdownsValues.php | 50 + .../AdsPixelAutomaticMatchingFieldsValues.php | 51 + .../Values/AdsPixelDataUseSettingValues.php | 43 + .../AdsPixelFirstPartyCookieStatusValues.php | 43 + .../Object/Values/AdsPixelSortByValues.php | 42 + .../AdsPixelStatsResultAggregationValues.php | 56 + .../Object/Values/AdsPixelTasksValues.php | 42 + .../FacebookAds/Object/Values/AppRoles.php | 40 + .../Values/ApplicationAnPlatformsValues.php | 46 + .../Values/ApplicationLoggingSourceValues.php | 41 + .../Values/ApplicationLoggingTargetValues.php | 43 + .../ApplicationMutationMethodValues.php | 43 + .../Values/ApplicationPlatformValues.php | 42 + .../Values/ApplicationPostMethodValues.php | 42 + .../Values/ApplicationRequestTypeValues.php | 43 + .../Values/ApplicationScoreTypeValues.php | 43 + .../Values/ApplicationSortOrderValues.php | 42 + .../ApplicationSupportedPlatformsValues.php | 52 + .../ArchivableCrudObjectEffectiveStatuses.php | 44 + .../Values/AsyncRequestStatusValues.php | 44 + .../Object/Values/AsyncRequestTypeValues.php | 43 + .../Object/Values/BillingEvents.php | 32 + .../BusinessAgreementRequestStatusValues.php | 45 + ...BusinessAssetGroupAdaccountTasksValues.php | 43 + ...oupOfflineConversionDataSetTasksValues.php | 44 + .../BusinessAssetGroupPageTasksValues.php | 60 + .../BusinessAssetGroupPixelTasksValues.php | 42 + ...setSharingAgreementRequestStatusValues.php | 45 + ...nedObjectOnBehalfOfRequestStatusValues.php | 45 + .../BusinessPagePermittedTasksValues.php | 60 + .../Values/BusinessPermittedTasksValues.php | 43 + .../Values/BusinessRoleRequestRoleValues.php | 55 + .../Object/Values/BusinessRoles.php | 39 + .../BusinessSurveyBusinessTypeValues.php | 44 + .../Values/BusinessTwoFactorTypeValues.php | 43 + .../Object/Values/BusinessUserRoleValues.php | 55 + .../Object/Values/BusinessVerticalValues.php | 62 + ...ionRequestRequesterAgencyOrBrandValues.php | 43 + ...atalogSettingsAttributionWindowsValues.php | 48 + .../Values/CampaignBidStrategyValues.php | 44 + .../Values/CampaignBuyingTypeValues.php | 36 + .../Values/CampaignConfiguredStatusValues.php | 44 + .../Values/CampaignDatePresetValues.php | 59 + .../Values/CampaignEffectiveStatusValues.php | 46 + .../Values/CampaignExecutionOptionsValues.php | 42 + .../Object/Values/CampaignObjectiveValues.php | 56 + .../Object/Values/CampaignOperatorValues.php | 42 + .../CampaignSmartPromotionTypeValues.php | 42 + .../CampaignSpecialAdCategoriesValues.php | 45 + ...CampaignSpecialAdCategoryCountryValues.php | 291 + .../CampaignSpecialAdCategoryValues.php | 45 + .../Values/CampaignStatusOptionValues.php | 43 + .../Object/Values/CampaignStatusValues.php | 44 + .../CommentCommentPrivacyValueValues.php | 47 + .../Object/Values/CommentFilterValues.php | 42 + .../Object/Values/CommentLiveFilterValues.php | 42 + .../Object/Values/CommentOrderValues.php | 42 + .../Values/CommerceOrderFiltersValues.php | 46 + .../Values/CommerceOrderReasonCodeValues.php | 50 + .../Values/CommerceOrderStateValues.php | 44 + .../Object/Values/ConnectionObjectTypes.php | 39 + .../ContentDeliveryReportPlatformValues.php | 47 + .../ContentDeliveryReportPositionValues.php | 64 + .../CustomAudienceClaimObjectiveValues.php | 48 + .../CustomAudienceContentTypeValues.php | 52 + ...CustomAudienceCustomerFileSourceValues.php | 43 + .../CustomAudienceDataSourceSubTypeValues.php | 93 + .../CustomAudienceDataSourceTypeValues.php | 48 + .../Values/CustomAudienceSubtypeValues.php | 55 + .../Object/Values/CustomAudienceSubtypes.php | 42 + .../Object/Values/CustomAudienceTypes.php | 58 + .../CustomConversionCustomEventTypeValues.php | 60 + ...ConversionStatsResultAggregationValues.php | 48 + .../Values/DACheckConnectionMethodValues.php | 44 + .../Values/EntityAtTextRangeTypeValues.php | 45 + .../Object/Values/EventCategoryValues.php | 65 + .../Values/EventEventStateFilterValues.php | 44 + .../Values/EventOnlineEventFormatValues.php | 45 + .../Object/Values/EventTimeFilterValues.php | 42 + .../Object/Values/EventTypeValues.php | 45 + ...ditAllocationConfigLiabilityTypeValues.php | 43 + ...ditAllocationConfigPartitionTypeValues.php | 42 + ...CreditAllocationConfigSendBillToValues.php | 42 + .../Object/Values/FeedEncoding.php | 39 + .../Object/Values/GroupGroupTypeValues.php | 93 + .../Object/Values/GroupJoinSettingValues.php | 43 + .../Values/GroupPostPermissionsValues.php | 43 + .../Object/Values/GroupPurposeValues.php | 93 + .../Values/GroupSuggestionCategoryValues.php | 46 + .../Object/Values/InsightsIncrements.php | 36 + .../Object/Values/InsightsOperators.php | 49 + .../Values/InsightsResultDatePresetValues.php | 59 + .../Values/InsightsResultPeriodValues.php | 45 + .../InstagramInsightsResultMetricValues.php | 54 + .../InstagramInsightsResultPeriodValues.php | 45 + ...icleInsightsQueryResultBreakdownValues.php | 49 + ...ArticleInsightsQueryResultPeriodValues.php | 45 + .../Object/Values/LeadgenFormLocaleValues.php | 71 + .../Object/Values/LeadgenFormStatusValues.php | 44 + .../LiveEncoderCapAudioCodecsValues.php | 41 + ...LiveEncoderCapStreamingProtocolsValues.php | 43 + .../LiveEncoderCapVideoCodecsValues.php | 41 + .../Object/Values/LiveEncoderStatusValues.php | 46 + .../Values/LiveVideoBroadcastStatusValues.php | 49 + ...ideoLiveCommentModerationSettingValues.php | 46 + .../Values/LiveVideoProjectionValues.php | 43 + .../Object/Values/LiveVideoSourceValues.php | 42 + .../LiveVideoSpatialAudioFormatValues.php | 41 + .../Object/Values/LiveVideoStatusValues.php | 45 + .../LiveVideoStereoscopicModeValues.php | 43 + .../Values/LiveVideoStreamTypeValues.php | 42 + ...ementUploadEventAggregationLevelValues.php | 43 + ...easurementUploadEventEventStatusValues.php | 46 + ...urementUploadEventLookbackWindowValues.php | 44 + ...surementUploadEventMatchUniverseValues.php | 43 + .../MeasurementUploadEventTimezoneValues.php | 186 + ...ingerprintFingerprintContentTypeValues.php | 45 + .../Values/NativeOfferBarcodeTypeValues.php | 53 + .../Values/NativeOfferLocationTypeValues.php | 43 + ...tiveOfferUniqueCodesFileCodeTypeValues.php | 47 + ...eConversionDataSetPermittedRolesValues.php | 43 + ...onversionDataSetRelationshipTypeValues.php | 45 + .../Values/OracleTransactionTypeValues.php | 42 + .../Object/Values/PageAttireValues.php | 43 + .../PageBackdatedTimeGranularityValues.php | 46 + ...llToActionAndroidDestinationTypeValues.php | 52 + ...allToActionIphoneDestinationTypeValues.php | 52 + .../Values/PageCallToActionTypeValues.php | 73 + ...geCallToActionWebDestinationTypeValues.php | 48 + .../Values/PageCheckinEntryPointValues.php | 44 + .../Object/Values/PageFoodStylesValues.php | 97 + .../Object/Values/PageFormattingValues.php | 42 + .../Object/Values/PageMessagingTypeValues.php | 43 + .../Object/Values/PageModelValues.php | 63 + .../Values/PageNotificationTypeValues.php | 43 + .../Values/PagePermittedTasksValues.php | 60 + .../Object/Values/PagePickupOptionsValues.php | 43 + .../PagePlaceAttachmentSettingValues.php | 42 + ...PagePostBackdatedTimeGranularityValues.php | 46 + .../PagePostFeedStoryVisibilityValues.php | 42 + .../PagePostSurfacesBlacklistValues.php | 45 + .../PagePostTimelineVisibilityValues.php | 43 + .../Object/Values/PagePostWithValues.php | 41 + .../Values/PagePostingToRedspaceValues.php | 42 + .../Object/Values/PagePublishStatusValues.php | 42 + .../FacebookAds/Object/Values/PageRoles.php | 39 + .../Object/Values/PageSenderActionValues.php | 45 + .../Values/PageSubscribedFieldsValues.php | 118 + .../Object/Values/PageTargetSurfaceValues.php | 42 + .../Object/Values/PageTasksValues.php | 60 + .../Values/PageTemporaryStatusValues.php | 44 + .../FacebookAds/Object/Values/PageTypes.php | 43 + .../PageUnpublishedContentTypeValues.php | 47 + .../Object/Values/PermissionStatusValues.php | 43 + .../PhotoBackdatedTimeGranularityValues.php | 46 + .../Object/Values/PhotoTypeValues.php | 43 + .../PhotoUnpublishedContentTypeValues.php | 47 + .../PostBackdatedTimeGranularityValues.php | 46 + .../Values/PostCheckinEntryPointValues.php | 44 + .../Values/PostFeedStoryVisibilityValues.php | 42 + .../Object/Values/PostFormattingValues.php | 42 + .../PostPlaceAttachmentSettingValues.php | 42 + .../PostPostSurfacesBlacklistValues.php | 45 + .../Values/PostPostingToRedspaceValues.php | 42 + .../Object/Values/PostTargetSurfaceValues.php | 42 + .../Values/PostTimelineVisibilityValues.php | 43 + .../PostUnpublishedContentTypeValues.php | 47 + ...ogCategoryCategorizationCriteriaValues.php | 43 + .../ProductCatalogItemSubTypeValues.php | 66 + .../ProductCatalogPermittedRolesValues.php | 42 + .../ProductCatalogPermittedTasksValues.php | 43 + .../Values/ProductCatalogStandardValues.php | 41 + .../Values/ProductCatalogTasksValues.php | 43 + .../Values/ProductCatalogVerticalValues.php | 55 + .../ProductEventStatBreakdownsValues.php | 41 + .../ProductEventStatDeviceTypeValues.php | 50 + .../Values/ProductEventStatEventValues.php | 48 + .../Values/ProductFeedDelimiterValues.php | 46 + .../Values/ProductFeedEncodingValues.php | 47 + .../Values/ProductFeedFeedTypeValues.php | 54 + .../Values/ProductFeedItemSubTypeValues.php | 66 + .../Values/ProductFeedOverrideTypeValues.php | 45 + .../ProductFeedQuotedFieldsModeValues.php | 43 + .../Values/ProductFeedRuleRuleTypeValues.php | 45 + .../ProductFeedScheduleDayOfWeekValues.php | 47 + .../ProductFeedScheduleIntervalValues.php | 44 + ...tFeedUploadErrorAffectedSurfacesValues.php | 43 + .../ProductFeedUploadErrorSeverityValues.php | 42 + .../ProductFeedUploadInputMethodValues.php | 45 + .../Values/ProductItemAgeGroupValues.php | 47 + .../Values/ProductItemAvailabilityValues.php | 46 + .../ProductItemCommerceTaxCategoryValues.php | 242 + .../Values/ProductItemConditionValues.php | 48 + .../Object/Values/ProductItemGenderValues.php | 43 + .../Values/ProductItemReviewStatusValues.php | 44 + .../ProductItemShippingWeightUnitValues.php | 44 + .../Values/ProductItemVisibilityValues.php | 42 + ...ofilePictureSourceBreakingChangeValues.php | 41 + .../Values/ProfilePictureSourceTypeValues.php | 43 + .../Values/ProfileProfileTypeValues.php | 45 + .../Object/Values/ProfileTypeValues.php | 50 + .../ReachFrequencyPredictionActionValues.php | 43 + ...achFrequencyPredictionBuyingTypeValues.php | 47 + ...quencyPredictionInstreamPackagesValues.php | 54 + .../ReachFrequencyPredictionStatuses.php | 52 + .../Values/TargetingDevicePlatformsValues.php | 43 + ...argetingEffectiveDevicePlatformsValues.php | 43 + .../Object/Values/TermsOfService.php | 37 + .../Object/Values/URLScopesValues.php | 42 + .../Object/Values/UserFilteringValues.php | 43 + ...rLocalNewsMegaphoneDismissStatusValues.php | 42 + .../UserLocalNewsSubscriptionStatusValues.php | 42 + .../Object/Values/UserPermissionRoles.php | 36 + .../Object/Values/UserTypeValues.php | 42 + .../Values/VehicleAvailabilityValues.php | 43 + .../Object/Values/VehicleBodyStyleValues.php | 53 + .../Object/Values/VehicleConditionValues.php | 47 + .../Object/Values/VehicleDrivetrainValues.php | 47 + .../Object/Values/VehicleFuelTypeValues.php | 49 + .../Values/VehicleStateOfVehicleValues.php | 43 + .../Values/VehicleTransmissionValues.php | 44 + .../Values/VehicleVehicleTypeValues.php | 48 + .../VideoCopyrightContentCategoryValues.php | 43 + .../VideoCopyrightMonitoringTypeValues.php | 43 + .../Values/VideoCopyrightRuleSourceValues.php | 43 + .../Object/Values/VideoPollActionValues.php | 45 + .../Object/Values/VideoPollStatusValues.php | 43 + .../WhatsAppBusinessAccountCategoryValues.php | 51 + .../WhatsAppBusinessAccountTasksValues.php | 45 + .../src/FacebookAds/Object/Vehicle.php | 163 + .../src/FacebookAds/Object/VehicleOffer.php | 80 + .../src/FacebookAds/Object/VideoCopyright.php | 120 + .../Object/VideoCopyrightConditionGroup.php | 57 + .../Object/VideoCopyrightGeoGate.php | 57 + .../FacebookAds/Object/VideoCopyrightRule.php | 82 + .../Object/VideoCopyrightSegment.php | 57 + .../src/FacebookAds/Object/VideoList.php | 103 + .../src/FacebookAds/Object/VideoPoll.php | 136 + .../src/FacebookAds/Object/VideoThumbnail.php | 64 + .../FacebookAds/Object/VideoUploadLimits.php | 57 + .../src/FacebookAds/Object/VoipInfo.php | 57 + .../src/FacebookAds/Object/WebAppLink.php | 57 + .../Object/WhatsAppBusinessAccount.php | 341 + .../src/FacebookAds/Object/WindowsAppLink.php | 57 + .../Object/WindowsPhoneAppLink.php | 57 + .../FacebookAds/Object/WorkUserFrontline.php | 57 + .../src/FacebookAds/Session.php | 110 + .../src/FacebookAds/SessionInterface.php | 33 + .../src/FacebookAds/TypeChecker.php | 194 + .../facebook/php-business-sdk/test/.gitignore | 1 + .../AbstractIntegrationTestCase.php | 161 + .../test/FacebookAdsTest/AbstractTestCase.php | 132 + .../FacebookAdsTest/AbstractUnitTestCase.php | 185 + .../test/FacebookAdsTest/ApiTest.php | 148 + .../FacebookAdsTest/Bootstrap/Bootstrap.php | 149 + .../Bootstrap/IntegrationBootstrap.php | 129 + .../test/FacebookAdsTest/Config/Config.php | 150 + .../Config/SkippableFeatureTestInterface.php | 33 + .../Config/SkippableFeaturesManager.php | 95 + .../FacebookAdsTest/CursorDegradationTest.php | 76 + .../test/FacebookAdsTest/CursorTest.php | 385 ++ .../test/FacebookAdsTest/Enum/DummyEnum.php | 33 + .../test/FacebookAdsTest/Enum/EnumTest.php | 107 + .../PHPUnitRequestExceptionWrapper.php | 108 + .../Http/Adapter/AbstractAdapterTest.php | 59 + .../Http/Adapter/CurlAdapterTest.php | 146 + .../test/FacebookAdsTest/Http/ClientTest.php | 176 + .../Http/Exception/RequestExceptionTest.php | 123 + .../Http/FileParameterTest.php | 44 + .../FacebookAdsTest/Http/ParametersTest.php | 74 + .../test/FacebookAdsTest/Http/RequestTest.php | 236 + .../FacebookAdsTest/Http/ResponseTest.php | 78 + .../Logger/AbstractLoggerTest.php | 46 + .../CurlLogger/JsonAwareParametersTest.php | 42 + .../Logger/CurlLogger/JsonAwareTestTrait.php | 87 + .../Logger/CurlLogger/JsonNodeTest.php | 61 + .../FacebookAdsTest/Logger/CurlLoggerTest.php | 141 + .../FacebookAdsTest/Logger/NullLoggerTest.php | 49 + .../Object/AbstractAsyncJobTestCase.php | 59 + .../Object/AbstractCrudObjectTest.php | 88 + .../Object/AbstractCrudObjectTestCase.php | 315 + .../Object/AdAccountGroupTest.php | 45 + .../FacebookAdsTest/Object/AdAccountTest.php | 165 + .../Object/AdConversionPixelTest.php | 48 + .../FacebookAdsTest/Object/AdCreativeTest.php | 111 + .../FacebookAdsTest/Object/AdImageTest.php | 61 + .../FacebookAdsTest/Object/AdLabelTest.php | 44 + .../FacebookAdsTest/Object/AdPreviewTest.php | 212 + .../test/FacebookAdsTest/Object/AdSetTest.php | 93 + .../test/FacebookAdsTest/Object/AdTest.php | 185 + .../FacebookAdsTest/Object/AdUserTest.php | 52 + .../FacebookAdsTest/Object/AdVideoTest.php | 52 + .../FacebookAdsTest/Object/AdsPixelTest.php | 166 + .../Object/AsyncJobInsightsTest.php | 56 + .../FacebookAdsTest/Object/BusinessTest.php | 109 + .../FacebookAdsTest/Object/CampaignTest.php | 53 + .../Object/CustomAudienceMultikeyTest.php | 127 + .../EmailNormalizerTest.php | 58 + .../Object/CustomAudienceTest.php | 101 + .../Object/DynamicProductAdsAdvertTest.php | 255 + .../Object/EmptyCrudObject.php | 30 + .../FacebookAdsTest/Object/EmptyObject.php | 38 + .../test/FacebookAdsTest/Object/LeadTest.php | 83 + .../Object/LeadgenFormTest.php | 69 + .../test/FacebookAdsTest/Object/PageTest.php | 40 + .../Object/PartnerCategoryTest.php | 59 + .../Object/ProductAudienceTest.php | 130 + .../Object/ProductCatalogTest.php | 49 + .../Object/ProductFeedTest.php | 76 + .../FacebookAdsTest/Object/ProductSetTest.php | 79 + .../FacebookAdsTest/Object/ProjectTest.php | 66 + .../Object/ReachEstimateTest.php | 61 + .../Object/ReachFrequencyPredictionTest.php | 75 + .../Object/ServerSide/AsyncClientTest.php | 58 + .../Object/ServerSide/BatchProcessorTest.php | 166 + .../Object/ServerSide/ContentTest.php | 97 + .../Object/ServerSide/CustomDataTest.php | 120 + .../ServerSide/EventRequestAsyncTest.php | 97 + .../Object/ServerSide/EventRequestTest.php | 234 + .../Object/ServerSide/ServerSideEventTest.php | 86 + .../ServerSide/ServerSideNormalizeTest.php | 533 ++ .../Object/ServerSide/ServerSideUtilTest.php | 121 + .../TestHelpers/AnotherHttpService.php | 32 + .../TestHelpers/FakeHttpService.php | 32 + .../Object/ServerSide/UserDataTest.php | 116 + .../Object/TargetingSearchTest.php | 42 + .../test/FacebookAdsTest/SessionTest.php | 59 + .../facebook/php-business-sdk/test/config.php | 164 + .../test/init_integration.php | 38 + .../php-business-sdk/test/init_unit.php | 36 + .../php-business-sdk/test/misc/image.png | Bin 0 -> 6620 bytes .../php-business-sdk/test/misc/images.zip | Bin 0 -> 12706 bytes .../php-business-sdk/test/misc/video.mp4 | Bin 0 -> 175019 bytes .../php-business-sdk/test/phpunit-travis.xml | 21 + .../php-business-sdk/test/phpunit.xml | 16 + vendor/firebase/php-jwt/README.md | 8 +- vendor/firebase/php-jwt/composer.json | 6 +- .../php-jwt/src/BeforeValidException.php | 1 - .../firebase/php-jwt/src/ExpiredException.php | 1 - vendor/firebase/php-jwt/src/JWK.php | 171 + vendor/firebase/php-jwt/src/JWT.php | 227 +- .../php-jwt/src/SignatureInvalidException.php | 1 - vendor/google/auth/.editorconfig | 18 - vendor/google/auth/.gitignore | 3 - vendor/google/auth/.php_cs | 54 - vendor/google/auth/.travis.yml | 32 - vendor/google/auth/CHANGELOG.md | 137 + vendor/google/auth/CODE_OF_CONDUCT.md | 43 + vendor/google/auth/CONTRIBUTING.md | 73 - vendor/google/auth/README.md | 81 +- vendor/google/auth/autoload.php | 2 +- vendor/google/auth/composer.json | 21 +- vendor/google/auth/phpunit.xml.dist | 16 - vendor/google/auth/src/AccessToken.php | 479 ++ .../src/ApplicationDefaultCredentials.php | 207 +- vendor/google/auth/src/Cache/Item.php | 13 +- .../auth/src/Cache/SysVCacheItemPool.php | 241 + .../Credentials/AppIdentityCredentials.php | 143 +- .../auth/src/Credentials/GCECredentials.php | 415 +- .../auth/src/Credentials/IAMCredentials.php | 6 +- .../src/Credentials/InsecureCredentials.php | 70 + .../Credentials/ServiceAccountCredentials.php | 122 +- .../ServiceAccountJwtAccessCredentials.php | 73 +- .../Credentials/UserRefreshCredentials.php | 38 +- vendor/google/auth/src/CredentialsLoader.php | 132 +- .../google/auth/src/FetchAuthTokenCache.php | 187 +- .../auth/src/FetchAuthTokenInterface.php | 1 - vendor/google/auth/src/GCECache.php | 92 + .../GetQuotaProjectInterface.php} | 30 +- .../src/HttpHandler/Guzzle5HttpHandler.php | 2 - .../src/HttpHandler/Guzzle6HttpHandler.php | 19 +- .../src/HttpHandler/Guzzle7HttpHandler.php | 21 + .../auth/src/HttpHandler/HttpClientCache.php | 54 + .../src/HttpHandler/HttpHandlerFactory.php | 20 +- vendor/google/auth/src/Iam.php | 99 + .../src/Middleware/AuthTokenMiddleware.php | 26 +- .../ScopedAccessTokenMiddleware.php | 4 +- .../auth/src/Middleware/SimpleMiddleware.php | 1 - vendor/google/auth/src/OAuth2.php | 193 +- .../auth/src/ProjectIdProviderInterface.php | 32 + .../auth/src/ServiceAccountSignerTrait.php | 57 + vendor/google/auth/src/SignBlobInterface.php | 44 + .../src/Subscriber/AuthTokenSubscriber.php | 42 +- .../ScopedAccessTokenSubscriber.php | 41 +- .../auth/src/Subscriber/SimpleSubscriber.php | 23 +- .../auth/src/UpdateMetadataInterface.php | 41 + .../ApplicationDefaultCredentialsTest.php | 340 - vendor/google/auth/tests/BaseTest.php | 33 - vendor/google/auth/tests/Cache/ItemTest.php | 126 - .../tests/Cache/MemoryCacheItemPoolTest.php | 222 - vendor/google/auth/tests/CacheTraitTest.php | 214 - .../AppIndentityCredentialsTest.php | 111 - .../tests/Credentials/GCECredentialsTest.php | 125 - .../tests/Credentials/IAMCredentialsTest.php | 82 - .../ServiceAccountCredentialsTest.php | 521 -- .../UserRefreshCredentialsTest.php | 229 - .../auth/tests/FetchAuthTokenCacheTest.php | 154 - .../google/auth/tests/FetchAuthTokenTest.php | 224 - .../HttpHandler/Guzzle5HttpHandlerTest.php | 217 - .../HttpHandler/Guzzle6HttpHandlerTest.php | 68 - .../HttpHandler/HttpHandlerFactoryTest.php | 39 - .../Middleware/AuthTokenMiddlewareTest.php | 344 - .../ScopedAccessTokenMiddlewareTest.php | 253 - vendor/google/auth/tests/OAuth2Test.php | 874 --- .../Subscriber/AuthTokenSubscriberTest.php | 333 - .../ScopedAccessTokenSubscriberTest.php | 246 - .../tests/Subscriber/SimpleSubscriberTest.php | 69 - vendor/google/auth/tests/bootstrap.php | 55 - .../application_default_credentials.json | 7 - .../google/auth/tests/fixtures/private.json | 7 - vendor/google/auth/tests/fixtures/private.pem | 15 - vendor/google/auth/tests/fixtures/public.pem | 6 - .../application_default_credentials.json | 6 - .../google/auth/tests/fixtures2/private.json | 6 - .../auth/tests/mocks/AppIdentityService.php | 19 - vendor/guzzlehttp/guzzle/.php_cs | 23 + vendor/guzzlehttp/guzzle/CHANGELOG.md | 56 + vendor/guzzlehttp/guzzle/Dockerfile | 18 + vendor/guzzlehttp/guzzle/README.md | 25 +- vendor/guzzlehttp/guzzle/composer.json | 45 +- vendor/guzzlehttp/guzzle/src/Client.php | 101 +- .../guzzlehttp/guzzle/src/ClientInterface.php | 7 +- .../guzzle/src/Cookie/CookieJar.php | 8 +- .../guzzle/src/Cookie/CookieJarInterface.php | 6 +- .../guzzle/src/Cookie/FileCookieJar.php | 3 +- .../guzzle/src/Cookie/SessionCookieJar.php | 1 + .../guzzle/src/Cookie/SetCookie.php | 8 +- .../guzzle/src/Exception/ClientException.php | 4 +- .../guzzle/src/Exception/GuzzleException.php | 30 +- .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 35 +- .../guzzle/src/Exception/ServerException.php | 4 +- .../Exception/TooManyRedirectsException.php | 4 +- .../src/Exception/TransferException.php | 4 +- .../guzzle/src/Handler/CurlFactory.php | 44 +- .../guzzle/src/Handler/CurlMultiHandler.php | 34 +- .../guzzle/src/Handler/MockHandler.php | 10 +- .../guzzle/src/Handler/StreamHandler.php | 25 +- vendor/guzzlehttp/guzzle/src/HandlerStack.php | 14 +- .../guzzle/src/MessageFormatter.php | 5 + vendor/guzzlehttp/guzzle/src/Middleware.php | 9 +- vendor/guzzlehttp/guzzle/src/Pool.php | 15 +- .../guzzle/src/PrepareBodyMiddleware.php | 5 + .../guzzle/src/RedirectMiddleware.php | 28 +- .../guzzlehttp/guzzle/src/RequestOptions.php | 10 +- .../guzzlehttp/guzzle/src/RetryMiddleware.php | 22 +- .../guzzlehttp/guzzle/src/TransferStats.php | 12 +- vendor/guzzlehttp/guzzle/src/Utils.php | 92 + vendor/guzzlehttp/guzzle/src/functions.php | 15 +- vendor/guzzlehttp/promises/.php_cs.dist | 88 + vendor/guzzlehttp/promises/CHANGELOG.md | 16 + vendor/guzzlehttp/promises/README.md | 42 +- vendor/guzzlehttp/promises/composer.json | 13 +- .../guzzlehttp/promises/phpstan-baseline.neon | 7 + vendor/guzzlehttp/promises/phpstan.neon.dist | 10 + vendor/guzzlehttp/promises/psalm.xml | 15 + .../promises/src/AggregateException.php | 1 + .../promises/src/CancellationException.php | 1 + vendor/guzzlehttp/promises/src/Coroutine.php | 28 +- vendor/guzzlehttp/promises/src/Create.php | 84 + vendor/guzzlehttp/promises/src/Each.php | 90 + .../guzzlehttp/promises/src/EachPromise.php | 70 +- .../promises/src/FulfilledPromise.php | 10 +- vendor/guzzlehttp/promises/src/Is.php | 46 + vendor/guzzlehttp/promises/src/Promise.php | 68 +- .../promises/src/PromiseInterface.php | 4 + .../promises/src/PromisorInterface.php | 1 + .../promises/src/RejectedPromise.php | 14 +- .../promises/src/RejectionException.php | 3 +- vendor/guzzlehttp/promises/src/TaskQueue.php | 5 +- .../promises/src/TaskQueueInterface.php | 3 +- vendor/guzzlehttp/promises/src/Utils.php | 274 + vendor/guzzlehttp/promises/src/functions.php | 254 +- vendor/guzzlehttp/psr7/CHANGELOG.md | 276 +- vendor/guzzlehttp/psr7/README.md | 328 +- vendor/guzzlehttp/psr7/composer.json | 18 +- vendor/guzzlehttp/psr7/src/AppendStream.php | 21 +- vendor/guzzlehttp/psr7/src/BufferStream.php | 3 + vendor/guzzlehttp/psr7/src/CachingStream.php | 3 +- vendor/guzzlehttp/psr7/src/DroppingStream.php | 1 + vendor/guzzlehttp/psr7/src/FnStream.php | 11 + vendor/guzzlehttp/psr7/src/Header.php | 71 + vendor/guzzlehttp/psr7/src/InflateStream.php | 3 +- vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 3 +- vendor/guzzlehttp/psr7/src/LimitStream.php | 3 +- vendor/guzzlehttp/psr7/src/Message.php | 252 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 67 +- vendor/guzzlehttp/psr7/src/MimeType.php | 140 + .../guzzlehttp/psr7/src/MultipartStream.php | 11 +- vendor/guzzlehttp/psr7/src/NoSeekStream.php | 1 + vendor/guzzlehttp/psr7/src/PumpStream.php | 5 +- vendor/guzzlehttp/psr7/src/Query.php | 108 + vendor/guzzlehttp/psr7/src/Request.php | 16 +- vendor/guzzlehttp/psr7/src/Response.php | 31 +- vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + vendor/guzzlehttp/psr7/src/ServerRequest.php | 38 +- vendor/guzzlehttp/psr7/src/Stream.php | 75 +- .../psr7/src/StreamDecoratorTrait.php | 4 +- vendor/guzzlehttp/psr7/src/StreamWrapper.php | 48 +- vendor/guzzlehttp/psr7/src/UploadedFile.php | 11 +- vendor/guzzlehttp/psr7/src/Uri.php | 125 +- vendor/guzzlehttp/psr7/src/UriNormalizer.php | 1 + vendor/guzzlehttp/psr7/src/UriResolver.php | 1 + vendor/guzzlehttp/psr7/src/Utils.php | 398 ++ vendor/guzzlehttp/psr7/src/functions.php | 705 +- vendor/league/oauth2-client/LICENSE | 21 + vendor/league/oauth2-client/README.md | 271 + vendor/league/oauth2-client/composer.json | 58 + .../oauth2-client/src/Grant/AbstractGrant.php | 80 + .../src/Grant/AuthorizationCode.php | 41 + .../src/Grant/ClientCredentials.php | 39 + .../Grant/Exception/InvalidGrantException.php | 26 + .../oauth2-client/src/Grant/GrantFactory.php | 104 + .../oauth2-client/src/Grant/Password.php | 42 + .../oauth2-client/src/Grant/RefreshToken.php | 41 + .../HttpBasicAuthOptionProvider.php | 42 + .../OptionProviderInterface.php | 30 + .../OptionProvider/PostAuthOptionProvider.php | 51 + .../src/Provider/AbstractProvider.php | 843 +++ .../Exception/IdentityProviderException.php | 48 + .../src/Provider/GenericProvider.php | 233 + .../src/Provider/GenericResourceOwner.php | 61 + .../src/Provider/ResourceOwnerInterface.php | 36 + .../oauth2-client/src/Token/AccessToken.php | 243 + .../src/Token/AccessTokenInterface.php | 72 + .../ResourceOwnerAccessTokenInterface.php | 25 + .../src/Tool/ArrayAccessorTrait.php | 52 + .../src/Tool/BearerAuthorizationTrait.php | 36 + .../src/Tool/GuardedPropertyTrait.php | 70 + .../src/Tool/MacAuthorizationTrait.php | 83 + .../src/Tool/ProviderRedirectTrait.php | 122 + .../src/Tool/QueryBuilderTrait.php | 33 + .../oauth2-client/src/Tool/RequestFactory.php | 87 + .../src/Tool/RequiredParameterTrait.php | 56 + vendor/league/oauth2-facebook/LICENSE | 21 + vendor/league/oauth2-facebook/composer.json | 40 + .../src/Grant/FbExchangeToken.php | 23 + .../src/Provider/AppSecretProof.php | 19 + .../Exception/FacebookProviderException.php | 7 + .../oauth2-facebook/src/Provider/Facebook.php | 202 + .../src/Provider/FacebookUser.php | 224 + vendor/monolog/monolog/.php_cs | 59 - vendor/monolog/monolog/CHANGELOG.md | 73 + vendor/monolog/monolog/README.md | 3 +- vendor/monolog/monolog/composer.json | 9 +- vendor/monolog/monolog/doc/01-usage.md | 231 - .../doc/02-handlers-formatters-processors.md | 157 - vendor/monolog/monolog/doc/03-utilities.md | 13 - vendor/monolog/monolog/doc/04-extending.md | 76 - vendor/monolog/monolog/doc/sockets.md | 39 - vendor/monolog/monolog/phpunit.xml.dist | 19 - .../monolog/src/Monolog/ErrorHandler.php | 12 +- .../Monolog/Formatter/FluentdFormatter.php | 5 +- .../src/Monolog/Formatter/HtmlFormatter.php | 7 +- .../src/Monolog/Formatter/JsonFormatter.php | 32 +- .../src/Monolog/Formatter/LineFormatter.php | 10 +- .../Monolog/Formatter/MongoDBFormatter.php | 8 +- .../Monolog/Formatter/NormalizerFormatter.php | 155 +- .../Monolog/Formatter/WildfireFormatter.php | 4 +- .../src/Monolog/Handler/AbstractHandler.php | 26 +- .../Handler/AbstractProcessingHandler.php | 2 + .../Monolog/Handler/AbstractSyslogHandler.php | 6 +- .../Monolog/Handler/BrowserConsoleHandler.php | 59 +- .../src/Monolog/Handler/BufferHandler.php | 35 +- .../src/Monolog/Handler/ChromePHPHandler.php | 19 +- .../src/Monolog/Handler/CubeHandler.php | 5 +- .../Monolog/Handler/DeduplicationHandler.php | 2 +- .../Monolog/Handler/ElasticSearchHandler.php | 8 +- .../src/Monolog/Handler/ErrorLogHandler.php | 8 +- .../src/Monolog/Handler/FilterHandler.php | 58 +- .../ActivationStrategyInterface.php | 2 +- .../Monolog/Handler/FingersCrossedHandler.php | 92 +- .../src/Monolog/Handler/FirePHPHandler.php | 2 +- .../src/Monolog/Handler/FlowdockHandler.php | 3 +- .../Handler/FormattableHandlerInterface.php | 39 + .../Handler/FormattableHandlerTrait.php | 63 + .../src/Monolog/Handler/GelfHandler.php | 8 - .../src/Monolog/Handler/GroupHandler.php | 19 +- .../src/Monolog/Handler/HandlerInterface.php | 4 +- .../src/Monolog/Handler/HandlerWrapper.php | 10 +- .../src/Monolog/Handler/HipChatHandler.php | 17 + .../src/Monolog/Handler/IFTTTHandler.php | 11 +- .../src/Monolog/Handler/InsightOpsHandler.php | 62 + .../src/Monolog/Handler/LogEntriesHandler.php | 4 +- .../src/Monolog/Handler/MandrillHandler.php | 2 +- .../src/Monolog/Handler/NewRelicHandler.php | 7 +- .../src/Monolog/Handler/PHPConsoleHandler.php | 3 +- .../Handler/ProcessableHandlerInterface.php | 40 + .../Handler/ProcessableHandlerTrait.php | 73 + .../src/Monolog/Handler/PsrHandler.php | 2 +- .../src/Monolog/Handler/PushoverHandler.php | 6 +- .../src/Monolog/Handler/RavenHandler.php | 16 +- .../src/Monolog/Handler/RedisHandler.php | 3 +- .../src/Monolog/Handler/RollbarHandler.php | 12 + .../Monolog/Handler/RotatingFileHandler.php | 21 +- .../src/Monolog/Handler/SamplingHandler.php | 53 +- .../src/Monolog/Handler/Slack/SlackRecord.php | 19 +- .../src/Monolog/Handler/SlackHandler.php | 8 +- .../Monolog/Handler/SlackWebhookHandler.php | 8 +- .../src/Monolog/Handler/SlackbotHandler.php | 8 +- .../src/Monolog/Handler/SocketHandler.php | 47 +- .../src/Monolog/Handler/StreamHandler.php | 13 +- .../Monolog/Handler/SwiftMailerHandler.php | 16 +- .../src/Monolog/Handler/SyslogHandler.php | 10 +- .../src/Monolog/Handler/SyslogUdpHandler.php | 49 +- .../src/Monolog/Handler/TestHandler.php | 29 +- .../Handler/WhatFailureGroupHandler.php | 11 + .../Monolog/Handler/ZendMonitorHandler.php | 46 +- vendor/monolog/monolog/src/Monolog/Logger.php | 248 +- .../src/Monolog/Processor/GitProcessor.php | 4 +- .../Processor/IntrospectionProcessor.php | 2 +- .../src/Monolog/Processor/MemoryProcessor.php | 6 +- .../Monolog/Processor/MercurialProcessor.php | 2 +- .../Monolog/Processor/ProcessIdProcessor.php | 2 +- .../Monolog/Processor/ProcessorInterface.php | 25 + .../Processor/PsrLogMessageProcessor.php | 6 +- .../src/Monolog/Processor/TagProcessor.php | 2 +- .../src/Monolog/Processor/UidProcessor.php | 17 +- .../src/Monolog/Processor/WebProcessor.php | 10 +- .../src/Monolog/ResettableInterface.php | 31 + .../monolog/src/Monolog/SignalHandler.php | 115 + vendor/monolog/monolog/src/Monolog/Utils.php | 189 + .../tests/Monolog/ErrorHandlerTest.php | 31 - .../Formatter/ChromePHPFormatterTest.php | 158 - .../Formatter/ElasticaFormatterTest.php | 79 - .../Formatter/FlowdockFormatterTest.php | 55 - .../Formatter/FluentdFormatterTest.php | 62 - .../Formatter/GelfMessageFormatterTest.php | 258 - .../Monolog/Formatter/JsonFormatterTest.php | 183 - .../Monolog/Formatter/LineFormatterTest.php | 222 - .../Monolog/Formatter/LogglyFormatterTest.php | 40 - .../Formatter/LogstashFormatterTest.php | 333 - .../Formatter/MongoDBFormatterTest.php | 262 - .../Formatter/NormalizerFormatterTest.php | 423 -- .../Monolog/Formatter/ScalarFormatterTest.php | 110 - .../Formatter/WildfireFormatterTest.php | 142 - .../Monolog/Handler/AbstractHandlerTest.php | 115 - .../Handler/AbstractProcessingHandlerTest.php | 80 - .../tests/Monolog/Handler/AmqpHandlerTest.php | 136 - .../Handler/BrowserConsoleHandlerTest.php | 130 - .../Monolog/Handler/BufferHandlerTest.php | 158 - .../Monolog/Handler/ChromePHPHandlerTest.php | 156 - .../Monolog/Handler/CouchDBHandlerTest.php | 31 - .../Handler/DeduplicationHandlerTest.php | 165 - .../Handler/DoctrineCouchDBHandlerTest.php | 52 - .../Monolog/Handler/DynamoDbHandlerTest.php | 82 - .../Handler/ElasticSearchHandlerTest.php | 239 - .../Monolog/Handler/ErrorLogHandlerTest.php | 66 - .../Monolog/Handler/FilterHandlerTest.php | 170 - .../Handler/FingersCrossedHandlerTest.php | 279 - .../Monolog/Handler/FirePHPHandlerTest.php | 96 - .../tests/Monolog/Handler/Fixtures/.gitkeep | 0 .../Monolog/Handler/FleepHookHandlerTest.php | 85 - .../Monolog/Handler/FlowdockHandlerTest.php | 88 - .../Monolog/Handler/GelfHandlerLegacyTest.php | 95 - .../tests/Monolog/Handler/GelfHandlerTest.php | 117 - .../Handler/GelfMockMessagePublisher.php | 25 - .../Monolog/Handler/GroupHandlerTest.php | 112 - .../Monolog/Handler/HandlerWrapperTest.php | 130 - .../Monolog/Handler/HipChatHandlerTest.php | 279 - .../Monolog/Handler/LogEntriesHandlerTest.php | 84 - .../tests/Monolog/Handler/MailHandlerTest.php | 75 - .../tests/Monolog/Handler/MockRavenClient.php | 27 - .../Monolog/Handler/MongoDBHandlerTest.php | 65 - .../Handler/NativeMailerHandlerTest.php | 111 - .../Monolog/Handler/NewRelicHandlerTest.php | 200 - .../tests/Monolog/Handler/NullHandlerTest.php | 33 - .../Monolog/Handler/PHPConsoleHandlerTest.php | 273 - .../tests/Monolog/Handler/PsrHandlerTest.php | 50 - .../Monolog/Handler/PushoverHandlerTest.php | 141 - .../Monolog/Handler/RavenHandlerTest.php | 255 - .../Monolog/Handler/RedisHandlerTest.php | 127 - .../Monolog/Handler/RollbarHandlerTest.php | 84 - .../Handler/RotatingFileHandlerTest.php | 211 - .../Monolog/Handler/SamplingHandlerTest.php | 33 - .../Monolog/Handler/Slack/SlackRecordTest.php | 387 -- .../Monolog/Handler/SlackHandlerTest.php | 155 - .../Handler/SlackWebhookHandlerTest.php | 107 - .../Monolog/Handler/SlackbotHandlerTest.php | 47 - .../Monolog/Handler/SocketHandlerTest.php | 309 - .../Monolog/Handler/StreamHandlerTest.php | 184 - .../Handler/SwiftMailerHandlerTest.php | 113 - .../Monolog/Handler/SyslogHandlerTest.php | 44 - .../Monolog/Handler/SyslogUdpHandlerTest.php | 76 - .../tests/Monolog/Handler/TestHandlerTest.php | 70 - .../tests/Monolog/Handler/UdpSocketTest.php | 64 - .../Handler/WhatFailureGroupHandlerTest.php | 121 - .../Handler/ZendMonitorHandlerTest.php | 69 - .../monolog/tests/Monolog/LoggerTest.php | 548 -- .../Monolog/Processor/GitProcessorTest.php | 29 - .../Processor/IntrospectionProcessorTest.php | 123 - .../MemoryPeakUsageProcessorTest.php | 42 - .../Processor/MemoryUsageProcessorTest.php | 42 - .../Processor/MercurialProcessorTest.php | 41 - .../Processor/ProcessIdProcessorTest.php | 30 - .../Processor/PsrLogMessageProcessorTest.php | 43 - .../Monolog/Processor/TagProcessorTest.php | 49 - .../Monolog/Processor/UidProcessorTest.php | 33 - .../Monolog/Processor/WebProcessorTest.php | 113 - .../tests/Monolog/PsrLogCompatTest.php | 47 - .../monolog/tests/Monolog/RegistryTest.php | 153 - .../monolog/tests/Monolog/TestCase.php | 58 - vendor/paragonie/random_compat/LICENSE | 22 + vendor/paragonie/random_compat/build-phar.sh | 5 + vendor/paragonie/random_compat/composer.json | 34 + .../dist/random_compat.phar.pubkey | 5 + .../dist/random_compat.phar.pubkey.asc | 11 + vendor/paragonie/random_compat/lib/random.php | 32 + .../random_compat/other/build_phar.php | 57 + .../random_compat/psalm-autoload.php | 9 + vendor/paragonie/random_compat/psalm.xml | 19 + .../reflection-common/.github/dependabot.yml | 7 + .../.github/workflows/push.yml | 223 + .../reflection-common/.travis.yml | 35 - .../phpdocumentor/reflection-common/README.md | 13 +- .../reflection-common/composer.json | 7 +- .../reflection-common/src/Element.php | 18 +- .../reflection-common/src/File.php | 17 +- .../reflection-common/src/Fqsen.php | 55 +- .../reflection-common/src/Location.php | 24 +- .../reflection-common/src/Project.php | 12 +- .../reflection-common/src/ProjectFactory.php | 13 +- .../reflection-docblock/appveyor.yml | 54 + .../reflection-docblock/composer.json | 7 +- .../src/DocBlock/Tags/BaseTag.php | 3 + .../src/DocBlock/Tags/Example.php | 2 +- .../src/DocBlock/Tags/Generic.php | 2 +- .../src/DocBlock/Tags/Method.php | 6 +- .../src/DocBlock/Tags/Param.php | 41 +- .../src/DocBlock/Tags/Property.php | 38 +- .../src/DocBlock/Tags/PropertyRead.php | 38 +- .../src/DocBlock/Tags/PropertyWrite.php | 38 +- .../src/DocBlock/Tags/Return_.php | 24 +- .../src/DocBlock/Tags/TagWithType.php | 60 + .../src/DocBlock/Tags/Throws.php | 26 +- .../src/DocBlock/Tags/Var_.php | 40 +- vendor/phpdocumentor/type-resolver/README.md | 65 +- .../phpdocumentor/type-resolver/composer.json | 31 +- .../phpdocumentor/type-resolver/composer.lock | 71 + .../phpdocumentor/type-resolver/phpbench.json | 10 + .../type-resolver/src/FqsenResolver.php | 34 +- .../type-resolver/src/PseudoType.php | 19 + .../type-resolver/src/PseudoTypes/False_.php | 39 + .../type-resolver/src/PseudoTypes/True_.php | 39 + .../phpdocumentor/type-resolver/src/Type.php | 13 +- .../type-resolver/src/TypeResolver.php | 491 +- .../type-resolver/src/Types/AbstractList.php | 83 + .../src/Types/AggregatedType.php | 124 + .../type-resolver/src/Types/Array_.php | 69 +- .../type-resolver/src/Types/Boolean.php | 13 +- .../type-resolver/src/Types/Callable_.php | 11 +- .../type-resolver/src/Types/ClassString.php | 56 + .../type-resolver/src/Types/Collection.php | 68 + .../type-resolver/src/Types/Compound.php | 71 +- .../type-resolver/src/Types/Context.php | 37 +- .../src/Types/ContextFactory.php | 359 +- .../type-resolver/src/Types/Expression.php | 51 + .../type-resolver/src/Types/Float_.php | 11 +- .../type-resolver/src/Types/Integer.php | 14 +- .../type-resolver/src/Types/Intersection.php | 37 + .../type-resolver/src/Types/Iterable_.php | 25 +- .../type-resolver/src/Types/Mixed_.php | 11 +- .../type-resolver/src/Types/Null_.php | 11 +- .../type-resolver/src/Types/Nullable.php | 21 +- .../type-resolver/src/Types/Object_.php | 33 +- .../type-resolver/src/Types/Parent_.php | 11 +- .../type-resolver/src/Types/Resource_.php | 11 +- .../type-resolver/src/Types/Scalar.php | 11 +- .../type-resolver/src/Types/Self_.php | 11 +- .../type-resolver/src/Types/Static_.php | 11 +- .../type-resolver/src/Types/String_.php | 11 +- .../type-resolver/src/Types/This.php | 11 +- .../type-resolver/src/Types/Void_.php | 11 +- vendor/psr/log/.gitignore | 1 - vendor/psr/log/Psr/Log/LoggerInterface.php | 40 +- vendor/psr/log/Psr/Log/LoggerTrait.php | 2 + vendor/psr/log/Psr/Log/NullLogger.php | 2 + vendor/psr/log/Psr/Log/Test/DummyTest.php | 18 + .../log/Psr/Log/Test/LoggerInterfaceTest.php | 14 +- vendor/psr/log/Psr/Log/Test/TestLogger.php | 147 + vendor/psr/log/README.md | 13 + vendor/psr/log/composer.json | 2 +- vendor/ralouphie/getallheaders/LICENSE | 21 + vendor/ralouphie/getallheaders/README.md | 27 + vendor/ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + vendor/symfony/polyfill-ctype/Ctype.php | 227 + vendor/symfony/polyfill-ctype/LICENSE | 19 + vendor/symfony/polyfill-ctype/README.md | 12 + vendor/symfony/polyfill-ctype/bootstrap.php | 46 + vendor/symfony/polyfill-ctype/composer.json | 38 + vendor/symfony/polyfill-intl-idn/Idn.php | 925 +++ vendor/symfony/polyfill-intl-idn/Info.php | 23 + vendor/symfony/polyfill-intl-idn/LICENSE | 19 + vendor/symfony/polyfill-intl-idn/README.md | 12 + .../Resources/unidata/DisallowedRanges.php | 375 ++ .../Resources/unidata/Regex.php | 24 + .../Resources/unidata/deviation.php | 8 + .../Resources/unidata/disallowed.php | 2638 ++++++++ .../unidata/disallowed_STD3_mapped.php | 308 + .../unidata/disallowed_STD3_valid.php | 71 + .../Resources/unidata/ignored.php | 273 + .../Resources/unidata/mapped.php | 5778 +++++++++++++++++ .../Resources/unidata/virama.php | 65 + .../symfony/polyfill-intl-idn/bootstrap.php | 141 + .../symfony/polyfill-intl-idn/composer.json | 44 + .../symfony/polyfill-intl-normalizer/LICENSE | 19 + .../polyfill-intl-normalizer/Normalizer.php | 308 + .../polyfill-intl-normalizer/README.md | 14 + .../Resources/stubs/Normalizer.php | 17 + .../unidata/canonicalComposition.php | 945 +++ .../unidata/canonicalDecomposition.php | 2065 ++++++ .../Resources/unidata/combiningClass.php | 876 +++ .../unidata/compatibilityDecomposition.php | 3695 +++++++++++ .../polyfill-intl-normalizer/bootstrap.php | 19 + .../polyfill-intl-normalizer/composer.json | 39 + vendor/symfony/polyfill-php72/LICENSE | 19 + vendor/symfony/polyfill-php72/Php72.php | 217 + vendor/symfony/polyfill-php72/README.md | 28 + vendor/symfony/polyfill-php72/bootstrap.php | 57 + vendor/symfony/polyfill-php72/composer.json | 35 + vendor/symfony/serializer/.gitignore | 3 - .../Annotation/DiscriminatorMap.php | 62 + .../symfony/serializer/Annotation/Groups.php | 4 +- .../serializer/Annotation/MaxDepth.php | 6 +- .../serializer/Annotation/SerializedName.php | 48 + vendor/symfony/serializer/CHANGELOG.md | 79 +- .../DependencyInjection/SerializerPass.php | 4 +- .../serializer/Encoder/ChainDecoder.php | 23 +- .../serializer/Encoder/ChainEncoder.php | 31 +- .../Encoder/ContextAwareDecoderInterface.php | 2 +- .../Encoder/ContextAwareEncoderInterface.php | 2 +- .../symfony/serializer/Encoder/CsvEncoder.php | 178 +- .../serializer/Encoder/DecoderInterface.php | 4 +- .../serializer/Encoder/EncoderInterface.php | 4 +- .../symfony/serializer/Encoder/JsonDecode.php | 78 +- .../symfony/serializer/Encoder/JsonEncode.php | 45 +- .../serializer/Encoder/JsonEncoder.php | 6 +- .../Encoder/SerializerAwareEncoder.php | 27 - .../symfony/serializer/Encoder/XmlEncoder.php | 292 +- .../serializer/Encoder/YamlEncoder.php | 20 +- .../Exception/ExceptionInterface.php | 2 +- .../Exception/ExtraAttributesException.php | 2 +- .../MissingConstructorArgumentsException.php} | 6 +- .../Extractor/ObjectPropertyListExtractor.php | 39 + .../ObjectPropertyListExtractorInterface.php | 27 + vendor/symfony/serializer/LICENSE | 2 +- .../serializer/Mapping/AttributeMetadata.php | 39 +- .../Mapping/AttributeMetadataInterface.php | 18 +- .../ClassDiscriminatorFromClassMetadata.php | 92 + .../Mapping/ClassDiscriminatorMapping.php | 68 + .../ClassDiscriminatorResolverInterface.php | 32 + .../serializer/Mapping/ClassMetadata.php | 43 +- .../Mapping/ClassMetadataInterface.php | 14 +- .../Factory/CacheClassMetadataFactory.php | 3 +- .../Mapping/Factory/ClassMetadataFactory.php | 32 +- .../Mapping/Factory/ClassResolverTrait.php | 18 +- .../Mapping/Loader/AnnotationLoader.php | 20 + .../serializer/Mapping/Loader/FileLoader.php | 6 +- .../serializer/Mapping/Loader/LoaderChain.php | 2 +- .../Mapping/Loader/XmlFileLoader.php | 28 +- .../Mapping/Loader/YamlFileLoader.php | 33 +- .../serializer-mapping-1.0.xsd | 22 +- .../AdvancedNameConverterInterface.php | 30 + .../CamelCaseToSnakeCaseNameConverter.php | 4 +- .../MetadataAwareNameConverter.php | 144 + .../Normalizer/AbstractNormalizer.php | 374 +- .../Normalizer/AbstractObjectNormalizer.php | 422 +- .../Normalizer/ArrayDenormalizer.php | 38 +- .../CacheableSupportsMethodInterface.php | 26 + .../ConstraintViolationListNormalizer.php | 100 + .../ContextAwareDenormalizerInterface.php | 2 +- .../ContextAwareNormalizerInterface.php | 2 +- .../Normalizer/CustomNormalizer.php | 26 +- .../Normalizer/DataUriNormalizer.php | 68 +- .../Normalizer/DateIntervalNormalizer.php | 74 +- .../Normalizer/DateTimeNormalizer.php | 81 +- .../Normalizer/DateTimeZoneNormalizer.php | 83 + .../Normalizer/DenormalizableInterface.php | 4 +- .../Normalizer/DenormalizerAwareInterface.php | 4 - .../Normalizer/DenormalizerAwareTrait.php | 7 - .../Normalizer/DenormalizerInterface.php | 10 +- .../Normalizer/GetSetMethodNormalizer.php | 45 +- .../Normalizer/JsonSerializableNormalizer.php | 14 +- .../Normalizer/NormalizableInterface.php | 2 +- .../Normalizer/NormalizerAwareInterface.php | 4 - .../Normalizer/NormalizerAwareTrait.php | 7 - .../Normalizer/NormalizerInterface.php | 12 +- .../Normalizer/ObjectNormalizer.php | 82 +- .../Normalizer/ObjectToPopulateTrait.php | 11 +- .../Normalizer/ProblemNormalizer.php | 77 + .../Normalizer/PropertyNormalizer.php | 50 +- .../Normalizer/SerializerAwareNormalizer.php | 27 - vendor/symfony/serializer/Serializer.php | 210 +- .../serializer/SerializerAwareInterface.php | 2 - .../serializer/SerializerAwareTrait.php | 7 - .../serializer/SerializerInterface.php | 9 +- .../Tests/Annotation/GroupsTest.php | 59 - .../Tests/Annotation/MaxDepthTest.php | 57 - .../SerializerPassTest.php | 75 - .../Tests/Encoder/ChainDecoderTest.php | 80 - .../Tests/Encoder/ChainEncoderTest.php | 137 - .../Tests/Encoder/CsvEncoderTest.php | 294 - .../Tests/Encoder/JsonDecodeTest.php | 75 - .../Tests/Encoder/JsonEncodeTest.php | 60 - .../Tests/Encoder/JsonEncoderTest.php | 121 - .../Tests/Encoder/XmlEncoderTest.php | 733 --- .../Tests/Encoder/YamlEncoderTest.php | 71 - .../Fixtures/AbstractNormalizerDummy.php | 60 - .../Tests/Fixtures/CircularReferenceDummy.php | 23 - .../Tests/Fixtures/DenormalizableDummy.php | 22 - .../serializer/Tests/Fixtures/Dummy.php | 43 - .../serializer/Tests/Fixtures/GroupDummy.php | 80 - .../Tests/Fixtures/GroupDummyChild.php | 33 - .../Tests/Fixtures/GroupDummyInterface.php | 25 - .../Tests/Fixtures/GroupDummyParent.php | 49 - .../Tests/Fixtures/JsonSerializableDummy.php | 25 - .../Tests/Fixtures/MaxDepthDummy.php | 45 - .../Fixtures/NormalizableTraversableDummy.php | 36 - .../PropertyCircularReferenceDummy.php | 25 - .../Tests/Fixtures/PropertySiblingHolder.php | 39 - .../serializer/Tests/Fixtures/ScalarDummy.php | 37 - .../Tests/Fixtures/SiblingHolder.php | 57 - .../Tests/Fixtures/StaticConstructorDummy.php | 31 - .../Fixtures/StaticConstructorNormalizer.php | 32 - .../Tests/Fixtures/ToBeProxyfiedDummy.php | 30 - .../Tests/Fixtures/TraversableDummy.php | 23 - .../Fixtures/VariadicConstructorArgsDummy.php | 27 - .../Tests/Fixtures/empty-mapping.yml | 0 .../Tests/Fixtures/invalid-mapping.yml | 1 - .../Tests/Fixtures/serialization.xml | 23 - .../Tests/Fixtures/serialization.yml | 12 - .../serializer/Tests/Fixtures/test.gif | Bin 35 -> 0 bytes .../serializer/Tests/Fixtures/test.txt | 1 - .../Tests/Mapping/AttributeMetadataTest.php | 79 - .../Tests/Mapping/ClassMetadataTest.php | 83 - .../Factory/CacheMetadataFactoryTest.php | 68 - .../Factory/ClassMetadataFactoryTest.php | 79 - .../Mapping/Loader/AnnotationLoaderTest.php | 77 - .../Mapping/Loader/XmlFileLoaderTest.php | 65 - .../Mapping/Loader/YamlFileLoaderTest.php | 80 - .../Mapping/TestClassMetadataFactory.php | 82 - .../CamelCaseToSnakeCaseNameConverterTest.php | 57 - .../Normalizer/AbstractNormalizerTest.php | 119 - .../AbstractObjectNormalizerTest.php | 126 - .../Normalizer/ArrayDenormalizerTest.php | 122 - .../Tests/Normalizer/CustomNormalizerTest.php | 83 - .../Normalizer/DataUriNormalizerTest.php | 189 - .../Normalizer/DateIntervalNormalizerTest.php | 137 - .../Normalizer/DateTimeNormalizerTest.php | 195 - .../Normalizer/GetSetMethodNormalizerTest.php | 841 --- .../JsonSerializableNormalizerTest.php | 95 - .../Tests/Normalizer/ObjectNormalizerTest.php | 1068 --- .../Normalizer/ObjectToPopulateTraitTest.php | 47 - .../Normalizer/PropertyNormalizerTest.php | 525 -- .../Tests/Normalizer/TestDenormalizer.php | 37 - .../Tests/Normalizer/TestNormalizer.php | 37 - .../serializer/Tests/SerializerTest.php | 413 -- vendor/symfony/serializer/composer.json | 37 +- vendor/symfony/serializer/phpunit.xml.dist | 30 - vendor/webmozart/assert/.composer-auth.json | 7 - vendor/webmozart/assert/.editorconfig | 12 + vendor/webmozart/assert/.styleci.yml | 11 - vendor/webmozart/assert/CHANGELOG.md | 124 +- vendor/webmozart/assert/README.md | 77 +- vendor/webmozart/assert/composer.json | 24 +- vendor/webmozart/assert/psalm.xml | 14 + vendor/webmozart/assert/src/Assert.php | 1589 ++++- vendor/webmozart/assert/src/Mixin.php | 1971 ++++++ 2173 files changed, 176545 insertions(+), 28753 deletions(-) create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/facebook/php-business-sdk/.github/ISSUE_TEMPLATE.md create mode 100644 vendor/facebook/php-business-sdk/.gitignore create mode 100644 vendor/facebook/php-business-sdk/.travis.yml create mode 100644 vendor/facebook/php-business-sdk/CHANGELOG.md create mode 100644 vendor/facebook/php-business-sdk/CODE_OF_CONDUCT.md create mode 100644 vendor/facebook/php-business-sdk/CONTRIBUTING.md create mode 100644 vendor/facebook/php-business-sdk/DEVELOPER_GUIDE.md create mode 100644 vendor/facebook/php-business-sdk/LICENSE create mode 100644 vendor/facebook/php-business-sdk/README.md create mode 100755 vendor/facebook/php-business-sdk/bin/clean_account.php create mode 100644 vendor/facebook/php-business-sdk/bin/create_phar.php create mode 100755 vendor/facebook/php-business-sdk/bin/docsmith.php create mode 100755 vendor/facebook/php-business-sdk/bin/get_version.php create mode 100644 vendor/facebook/php-business-sdk/composer.json create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountActivityNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateAdCreativeLinkAd.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateCarouselCallToActionAppInstall.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdCallToActionAppInstall.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdImageCrop.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateMAIDPA.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoLeadAd.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoPageLikeAd.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreative.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCanvas.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasDV.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasImage.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasVideo.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeLinkAd.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativePageLike.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAssetFeedSpec.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateCarouselCallToActionAppInstall.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateDynamicAdCustomization.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdCallToActionAppInstall.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdImageCrop.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdNotToPage.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateMAIDPA.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoLeadAd.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoPageLikeAd.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPost2CreateMAIA.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpa.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpaAppEvents.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBehaviorTargeting.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBidMultiplier.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAdSet.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAudienceNetwork.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateCampaign.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDailyBudget20.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDemographicTargeting.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostInterestTargeting.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostLifetimeBudget200Duration10Days.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOfferClaim.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOptimizePostEngagement.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPageLikes.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPlacementTargeting.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostReach.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdVideosPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelEdgeGetPixelCode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdsPostAdsRedownload.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdsPostOfferClaim.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountAdsPostTrackingPostEngagement.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostConversions.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostEventResponses.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLeadGen.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLinkClicks.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLocalAwareness.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIA.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIDPA.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostOfferClaims.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPageLikes.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPostEngagement.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostStoreCampaign.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostVideoViews.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdgeDataSourceSubtype.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostCreateCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicEventValueBasedLookalikeCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicValueBasedLookalikeCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformCustomAudienceMACARule.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAExclusions.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiFilters.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiPages.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformEngagementCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformWebsiteCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedLookalikeCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeDesktopWithStoryId.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeInstagramStandards.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeMaiaWithObjectStorySpec.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostIphoneViewNoPurchase.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostNoPurchase.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdAccountReachEstimate.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignActivityNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignGroupActivityNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdgeAdgroupsWithStatusArchived.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsetsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCampaignPostAdsetUpdateCpa.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativeCreativeInsightsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativeNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativeNodeRead.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativeNodeReadInstagramPermalinkUrl.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreview.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAds.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAdsWithCustomizations.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdgroupActivityNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeads.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsDPA.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsFiltered.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdgroupPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdgroupPostUpdateStatus.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeAdCampaignInsights.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeStoreVisitsAdCampaignInsights.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsPixelEventsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsPixelEventsPostCustom.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsPixelNodeGetPixelCode.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/AdsPixelSharedAgenciesEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostDestinationCatalog.php create mode 100644 vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostFlightCatalog.php create mode 100644 vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostHotelCatalog.php create mode 100644 vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostProductCatalog.php create mode 100644 vendor/facebook/php-business-sdk/examples/CustomAudienceDelete.php create mode 100644 vendor/facebook/php-business-sdk/examples/CustomAudienceNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/CustomAudienceNodeReadRule.php create mode 100644 vendor/facebook/php-business-sdk/examples/CustomAudiencePost.php create mode 100644 vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPostCrossPlatform.php create mode 100644 vendor/facebook/php-business-sdk/examples/MultiPageFeedCreateThenDelete.php create mode 100644 vendor/facebook/php-business-sdk/examples/MultiPromoteYourPage.php create mode 100644 vendor/facebook/php-business-sdk/examples/OfflineConversionsCreateOfflineSet.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageFeedEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageFeedPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageFeedPostFeedImageDeepLink.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageNodePageSearch.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePhotosEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePhotosPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePictureEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostCommentsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostCommentsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostDelete.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/PagePostsEdgePagePostCreateCarousel.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageRolesEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/PageSubscribedAppsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/ProductCatalogEventStatsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPost.php create mode 100644 vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPostUpdateHotelsCatalogSettings.php create mode 100644 vendor/facebook/php-business-sdk/examples/ProductCatalogProductFeedsPostProductFeed.php create mode 100644 vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostHotelSet.php create mode 100644 vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostProductSet.php create mode 100644 vendor/facebook/php-business-sdk/examples/UserAccountsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/UserAdAccountsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/UserLeadGenInfoNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/UserNode.php create mode 100644 vendor/facebook/php-business-sdk/examples/VideoThumbnailsEdge.php create mode 100644 vendor/facebook/php-business-sdk/examples/adgroup_creation.php create mode 100644 vendor/facebook/php-business-sdk/examples/aggregator_onboarding/README.md create mode 100644 vendor/facebook/php-business-sdk/examples/aggregator_onboarding/api.php create mode 100644 vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.css create mode 100644 vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.html create mode 100644 vendor/facebook/php-business-sdk/examples/curl_log.php create mode 100644 vendor/facebook/php-business-sdk/examples/custom_audiences.php create mode 100644 vendor/facebook/php-business-sdk/examples/server_side_api.php create mode 100644 vendor/facebook/php-business-sdk/fb_ca_chain_bundle.crt create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/AnonymousSession.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Api.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/ApiConfig.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/ApiRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/CrashReporter.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Cursor.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Enum/AbstractEnum.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Enum/EmptyEnum.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Enum/EnumInstanceInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Exception/Exception.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/AbstractAdapter.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/AdapterInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/AbstractCurl.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl55.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/CurlInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/CurlAdapter.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Client.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/AuthorizationException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/ClientException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/EmptyResponseException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/PermissionException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/RequestException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/ServerException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/ThrottleException.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/FileParameter.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Headers.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Parameters.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Request.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/RequestInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Response.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/ResponseInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/SimpleRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Http/Util.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonAwareParameters.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonNode.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Logger/LoggerInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Logger/NullLogger.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractArchivableCrudObject.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractCrudObject.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractObject.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Ad.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccount.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountActivity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdRulesHistory.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdVolume.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountContentFilterLevelsInheritance.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountCreationRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDefaultDestination.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDefaultObjective.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDeliveryEstimate.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMatchedSearchApplicationsEdgeData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMaxBid.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountPromotableObjects.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountReachEstimate.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountRecommendedCamapaignBudget.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountRoas.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountSubscribedApps.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountTargetingUnified.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountTrackingData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountUser.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdActivity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecAssetLabel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecBody.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecCaption.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecDescription.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecGroupRule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecImage.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecLinkURL.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecTitle.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecVideo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSetNotificationResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdBidAdjustments.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignActivity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignBidConstraint.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignDeliveryEstimate.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignDeliveryStatsUnsupportedReasons.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignFrequencyControlSpecs.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignGroupActivity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignIssuesInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignLearningStageInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignOptimizationEvent.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignPacedBidInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreative.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeAdDisclaimer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeCollectionThumbnailInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeInsights.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeInteractiveComponentsSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataAppLinkSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataCallToAction.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataCallToActionValue.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataChildAttachment.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataImageLayerSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataImageOverlaySpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataSponsorshipInfoSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataTemplateVideoSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeObjectStorySpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativePhotoData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativePhotoDataMediaElements.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativePlaceData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativePlatformCustomization.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativePortraitCustomizations.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativePostClickConfiguration.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeRecommenderSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeStaticFallbackSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeTemplateURLSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeTextData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeVideoData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCustomizationRuleSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdDynamicCreative.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdEntityTargetSpend.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdImage.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdKeywords.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdLabel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdMonetizationProperty.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdNetworkAnalyticsAsyncQueryResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdNetworkAnalyticsSyncQueryResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSetMetadata.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPreview.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPromotedObject.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendationData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdReportRun.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdReportSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleEvaluationSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionOptions.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleFilters.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistory.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResultAction.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleSchedule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleScheduleSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleTrigger.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdSet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudy.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyCell.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjective.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjectiveID.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdVideo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupActivity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupIssuesInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupPlacementSpecificReviewFeedback.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupRelevanceScore.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupReviewFeedback.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdoptablePet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsActionStats.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsImageCrops.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsInsights.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsOptimalDeliveryGrowthOpportunity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsPixel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsPixelStats.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsPixelStatsResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AgeRange.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AgencyClientDeclaration.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Album.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AndroidAppLink.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AppRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AppRequestFormerRecipient.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Application.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AssignedUser.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AsyncRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AsyncSession.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AtlasCampaign.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AttributionSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AudienceInsightsStudySpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AudiencePermissionForActions.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AudioCopyright.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/AutomotiveModel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BilledAmountDetails.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BrandSafetyBlockListUsage.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BroadTargetingCategories.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Business.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAdAccountRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAgreement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessApplicationRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAssetGroup.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAssetSharingAgreement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessOwnedObjectOnBehalfOfRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessPageRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessRoleRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUnit.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUser.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASAdvertiserPartnershipRecommendation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASCollaborationRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASParentCatalogSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Campaign.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CampaignGroupBrandConfiguration.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CampaignGroupCollaborativeAdsPartnerInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanRedownloadInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Canvas.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanvasAdSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanvasBodyElement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanvasCollectionThumbnail.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CatalogBasedTargeting.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CatalogItemAppLinks.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CatalogItemAppealStatus.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CatalogSubVerticalList.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CheckBatchRequestStatus.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ChildEvent.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ClickTrackingTag.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CollaborativeAdsPartnerInfoListItem.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CollaborativeAdsShareSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Comment.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettingsSetupStatus.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceOrder.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceOrderTransactionDetail.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommercePayout.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ConnectionsTargeting.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ContentDeliveryReport.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ConversionActionQuery.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CopyrightReferenceContainer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CoverPhoto.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CreativeHistory.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CreditPartitionActionOptions.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Currency.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CurrencyAmount.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceAdAccount.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceDataSource.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceMultiKey.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/BirthYearNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/CityNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/CountryNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/DateNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/EmailNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/FirstNameInitialNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/FirstNameNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/GenderNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/HashNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/LastNameNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/MadidNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/PhoneNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/StateNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/ValueNormalizerInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/ZipNormalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceSession.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceSharingStatus.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceStatus.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudiencesTOS.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudiencesharedAccountInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomConversion.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomConversionStatsResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomUserSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DACheck.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DayPart.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DeliveryCheck.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DeliveryCheckExtraInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Destination.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DestinationCatalogSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Domain.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicContentSet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicPostChildAttachment.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicPriceConfigByDate.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Engagement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/EntityAtTextRange.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Event.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventSourceGroup.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventTour.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Experience.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCredit.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditAllocationConfig.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditInvoiceGroup.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExternalEventSource.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/FAMEExportConfig.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AbstractArchivableCrudObjectFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountActivityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdRulesHistoryFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdVolumeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountContentFilterLevelsInheritanceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountCreationRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultDestinationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultObjectiveFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDeliveryEstimateFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMatchedSearchApplicationsEdgeDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMaxBidFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountPromotableObjectsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountReachEstimateFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRecommendedCamapaignBudgetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRoasFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountSubscribedAppsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTargetingUnifiedFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTrackingDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountUserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdActivityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecAssetLabelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecBodyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecCaptionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecDescriptionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecGroupRuleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecImageFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecLinkURLFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecTitleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecVideoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetNotificationResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdBidAdjustmentsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignActivityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignBidConstraintFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryEstimateFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryStatsUnsupportedReasonsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignFrequencyControlSpecsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignGroupActivityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignIssuesInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignLearningStageInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignOptimizationEventFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignPacedBidInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeAdDisclaimerFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeCollectionThumbnailInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInsightsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInteractiveComponentsSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataAppLinkSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionValueFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataChildAttachmentFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageLayerSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageOverlaySpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataSponsorshipInfoSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataTemplateVideoSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeObjectStorySpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataMediaElementsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlaceDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlatformCustomizationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePortraitCustomizationsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePostClickConfigurationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeRecommenderSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeStaticFallbackSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTemplateURLSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTextDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeVideoDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCustomizationRuleSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdDynamicCreativeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdEntityTargetSpendFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdImageFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdKeywordsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdLabelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdMonetizationPropertyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsAsyncQueryResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsSyncQueryResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetMetadataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPreviewFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPromotedObjectFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportRunFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleEvaluationSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionOptionsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFiltersFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultActionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleTriggerFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdSetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyCellFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveIDFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdVideoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupActivityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupIssuesInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupPlacementSpecificReviewFeedbackFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupRelevanceScoreFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupReviewFeedbackFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdoptablePetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsActionStatsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsImageCropsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsInsightsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsOptimalDeliveryGrowthOpportunityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AgeRangeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/Agency.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AgencyClientDeclarationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AlbumFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AndroidAppLinkFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFormerRecipientFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ApplicationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AssignedUserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncSessionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AtlasCampaignFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AttributionSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudienceInsightsStudySpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudiencePermissionForActionsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudioCopyrightFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AutomotiveModelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BilledAmountDetailsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BrandSafetyBlockListUsageFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BroadTargetingCategoriesFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAdAccountRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAgreementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessApplicationRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetGroupFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetSharingAgreementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessOwnedObjectOnBehalfOfRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessPageRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessRoleRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUnitFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASAdvertiserPartnershipRecommendationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASCollaborationRequestFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASParentCatalogSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupBrandConfigurationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupCollaborativeAdsPartnerInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasAdSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasBodyElementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasCollectionThumbnailFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogBasedTargetingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppLinksFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppealStatusFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogSubVerticalListFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CheckBatchRequestStatusFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ChildEventFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ClickTrackingTagFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CollaborativeAdsPartnerInfoListItemFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CollaborativeAdsShareSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommentFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsSetupStatusFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderTransactionDetailFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommercePayoutFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConnectionsTargetingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ContentDeliveryReportFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConversionActionQueryFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CopyrightReferenceContainerFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CoverPhotoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreativeHistoryFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreditPartitionActionOptionsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyAmountFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceAdAccountFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceDataSourceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceMultikeySchemaFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceSessionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceSharingStatusFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceStatusFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesTOSFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesharedAccountInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionStatsResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomUserSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DACheckFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DayPartFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckExtraInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationCatalogSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DomainFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicContentSetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPostChildAttachmentFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPriceConfigByDateFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EngagementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EntityAtTextRangeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventSourceGroupFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventTourFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExperienceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditAllocationConfigFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditInvoiceGroupFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExternalEventSourceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FAMEExportConfigFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlexibleTargetingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlightFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FriendListFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsCouponFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/GroupFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HomeListingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelRoomFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IDNameFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGCommentFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGMediaFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGUserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InsightsResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsValueFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramUserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleInsightsQueryResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InvoiceCampaignFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IosAppLinkFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/KeyValueFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenAppointmentBookingInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupChoicesFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupQuestionsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenDraftQuestionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenPostSubmissionCheckResultFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionOptionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadgenFormFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LifeEventFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LinkFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveEncoderFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoAdBreakConfigFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoErrorFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoInputStreamFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoTargetingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LocationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LookalikeSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MailingAddressFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MeasurementUploadEventFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MediaFingerprintFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessagingFeatureReviewFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerDestinationPageWelcomeMessageFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerProfileFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MinimumBudgetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MusicVideoCopyrightFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferDiscountFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferViewFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NullNodeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OfflineConversionDataSetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OfflineTermsOfServiceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OffsitePixelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OpenGraphContextFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OracleTransactionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OutcomePredictionPointFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageAdminNoteFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCallToActionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCategoryFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageChangeProposalFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageParkingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePaymentOptionsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePostFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantServicesFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantSpecialtiesFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSavedFilterFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageStartInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageThreadOwnerFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUpcomingChangeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUserMessageThreadLabelFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PartnerStudyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentPricepointsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentSubscriptionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PermissionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PersonaFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PhotoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceTopicFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlatformImageSourceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlayableContentFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PostFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PrivacyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductAudienceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogCategoryFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogHotelRoomsBatchFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsOperationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogPricingVariablesBatchFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogProductSetsBatchFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductEventStatFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedMissingFeedItemReplacementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleSuggestionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedScheduleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadDiagnosticsReportFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorReportFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorSampleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductGroupFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemCommerceInsightsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetMetadataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductVariantFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfileFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfilePictureSourceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PublisherBlockListFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RTBDynamicPostFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RawCustomAudienceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyActivityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyAdFormatFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveLowerConfidenceRangeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveUpperConfidenceRangeFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyDayPartFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesCurveFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesPlacementBreakdownFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyPredictionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencySpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReadOnlyAnalyticsUserPropertyConfigFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RecommendationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReferralFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RevSharePolicyFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RichMediaElementFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedAudienceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedMessageResponseFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SecuritySettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SplitTestWinnerFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/StoreCatalogSettingsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SystemUserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TabFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingDynamicRuleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCityFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCustomLocationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationElectoralDistrictFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationGeoEntitiesFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationClusterFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationExpansionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationMarketFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPlaceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPoliticalDistrictFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationRegionFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationZipFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSubSpecFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProspectingAudienceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingRelaxationFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingSentenceLineFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ThirdPartyMeasurementReportDatasetFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TrackingAndConversionWithDefaultsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/URLFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UnifiedThreadFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserCoverPhotoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserDeviceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForAppFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForPageFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenDisclaimerResponseFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenFieldDataFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMethodsInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMobilePricepointsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentModulesOptionsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ValueBasedEligibleSourceFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleOfferFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightConditionGroupFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightGeoGateFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightRuleFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightSegmentFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoListFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoPollFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoThumbnailFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoUploadLimitsFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VoipInfoFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WebAppLinkFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WhatsAppBusinessAccountFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsAppLinkFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsPhoneAppLinkFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WorkUserFrontlineFields.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/FlexibleTargeting.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Flight.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/FriendList.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/FundingSourceDetails.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/FundingSourceDetailsCoupon.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Group.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/HomeListing.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Hotel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/HotelRoom.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/IDName.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGComment.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGMedia.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGUser.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InsightsResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsValue.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramUser.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticle.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticleInsightsQueryResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/InvoiceCampaign.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/IosAppLink.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/KeyValue.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Lead.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenAppointmentBookingInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenConditionalQuestionsGroupChoices.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenConditionalQuestionsGroupQuestions.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenDraftQuestion.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenPostSubmissionCheckResult.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenQuestion.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenQuestionOption.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadgenForm.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LifeEvent.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Link.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveEncoder.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoAdBreakConfig.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoError.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoInputStream.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoTargeting.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Location.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/LookalikeSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MailingAddress.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MeasurementUploadEvent.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MediaFingerprint.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessagingFeatureReview.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessengerDestinationPageWelcomeMessage.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessengerProfile.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MinimumBudget.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/MusicVideoCopyright.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOffer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOfferDiscount.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOfferView.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/NullNode.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ObjectStorySpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/OfflineConversionDataSet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/OfflineTermsOfService.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/OffsitePixel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/OpenGraphContext.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/OracleTransaction.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/OutcomePredictionPoint.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Page.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageAdminNote.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCallToAction.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCategory.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageChangeProposal.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageParking.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PagePaymentOptions.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PagePost.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageRestaurantServices.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageRestaurantSpecialties.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageSavedFilter.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageStartInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageThreadOwner.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageUpcomingChange.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageUserMessageThreadLabel.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PartnerStudy.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PaymentPricepoints.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PaymentSubscription.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Permission.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Persona.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Photo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Place.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlaceTopic.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlatformImageSource.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlayableContent.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Post.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Privacy.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductAudience.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalog.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogCategory.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogHotelRoomsBatch.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogImageSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogImageSettingsOperation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogPricingVariablesBatch.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogProductSetsBatch.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductEventStat.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeed.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedMissingFeedItemReplacement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedRule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedRuleSuggestion.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedSchedule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUpload.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadDiagnosticsReport.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadError.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadErrorReport.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadErrorSample.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductGroup.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItem.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItemCommerceInsights.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductSet.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductSetMetadata.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductVariant.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Profile.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProfilePictureSource.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/PublisherBlockList.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/RTBDynamicPost.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/RawCustomAudience.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyActivity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyAdFormat.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyCurveLowerConfidenceRange.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyCurveUpperConfidenceRange.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyDayPart.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyEstimatesCurve.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyEstimatesPlacementBreakdown.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencyPrediction.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencySpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReadOnlyAnalyticsUserPropertyConfig.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Recommendation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Referral.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/RevSharePolicy.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/RichMediaElement.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/SavedAudience.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/SavedMessageResponse.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Search/DemographicSearchClasses.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Search/TargetingSearchTypes.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/SecuritySettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/AdsPixelSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/AsyncClient.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/BatchProcessor.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Content.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/CustomData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/DeliveryCategory.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Event.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequest.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequestAsync.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventResponse.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Gender.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpMethod.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpServiceClientConfig.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpServiceInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Normalizer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Singleton.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/UserData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Util.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/SplitTestWinner.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/StoreCatalogSettings.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/SystemUser.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Tab.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Targeting.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingDynamicRule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationCity.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationCustomLocation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationElectoralDistrict.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationGeoEntities.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationLocationCluster.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationLocationExpansion.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationMarket.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationPlace.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationPoliticalDistrict.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationRegion.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingGeoLocationZip.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingProductAudienceSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingProductAudienceSubSpec.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingProspectingAudience.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingRelaxation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingSearch.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingSentenceLine.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ThirdPartyMeasurementReportDataset.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/TrackingAndConversionWithDefaults.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/AdLabelAwareCrudObjectTrait.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/FieldValidation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/ObjectValidation.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/URL.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UnifiedThread.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/User.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserCoverPhoto.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserDevice.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserIDForApp.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserIDForPage.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserLeadGenDisclaimerResponse.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserLeadGenFieldData.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserPaymentMethodsInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserPaymentMobilePricepoints.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserPaymentModulesOptions.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/ValueBasedEligibleSource.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountAdRulesHistoryActionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountAdRulesHistoryEvaluationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountAdVolumeRecommendationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountClaimObjectiveValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountCurrencyValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountDefaultObjectiveDefaultObjectiveForUserValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountDefaultObjectiveObjectiveForLevelValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountDeliveryEstimateOptimizationGoalValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountMatchedSearchApplicationsEdgeDataAppStoreValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountPermittedTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountSubtypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTargetingUnifiedAppStoreValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTargetingUnifiedLimitTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTargetingUnifiedModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTargetingUnifiedObjectiveValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTargetingUnifiedRegulatedCategoriesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTargetingUnifiedWhitelistedTypesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAccountTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdActivityCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdActivityDataSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdActivityEventTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAssetFeedSpecCallToActionTypesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAsyncRequestSetNotificationModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAsyncRequestSetNotificationStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdAsyncRequestStatusesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdBidTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignActivityBidStrategyNewValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignActivityBidStrategyOldValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignActivityBillingEventNewValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignActivityBillingEventOldValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignActivityOptimizationGoalNewValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignActivityOptimizationGoalOldValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignDeliveryEstimateOptimizationGoalValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignGroupActivityObjectiveNewValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCampaignGroupActivityObjectiveOldValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdConfiguredStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeApplinkTreatmentValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeAuthorizationCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeCallToActionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeCategorizationCriteriaValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeCategoryMediaSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeDynamicAdVoiceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeInstantCheckoutSettingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataAttachmentStyleValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataCallToActionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataFormatOptionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecBlendingModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecFrameSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecImageSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecLayerTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecOverlayPositionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecOverlayShapeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageLayerSpecTextFontValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageOverlaySpecCustomTextTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageOverlaySpecOverlayTemplateValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageOverlaySpecPositionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageOverlaySpecTextFontValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageOverlaySpecTextTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeLinkDataImageOverlaySpecThemeColorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeObjectTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdCreativeStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdDatePresetValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdEffectiveStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdExecutionOptionsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdImageStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdNetworkAnalyticsSyncQueryResultBreakdownsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdNetworkAnalyticsSyncQueryResultMetricsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdNetworkAnalyticsSyncQueryResultOrderingColumnValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdNetworkAnalyticsSyncQueryResultOrderingTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdPlacePageSetCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdPlacePageSetLocationTypesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdPlacePageSetTargetedAreaTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdPreviewAdFormatValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdPreviewRenderTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdPromotedObjectCustomEventTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRecommendationConfidenceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRecommendationImportanceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleEvaluationSpecEvaluationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleExecutionOptionsOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleExecutionSpecExecutionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleFiltersOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleHistoryActionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleHistoryResultObjectTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleTriggerOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdRuleTriggerTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetBidStrategyValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetBillingEventValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetConfiguredStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetDatePresetValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetDestinationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetEffectiveStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetExecutionOptionsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetFullFunnelExplorationModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetMultiOptimizationGoalWeightValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetOptimizationGoalValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetOptimizationSubEventValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetStatusOptionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdSetTuneForCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdStatusOptionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdStudyCellCreationTemplateValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdStudyObjectiveTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdStudyTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoBackdatedTimeGranularityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoContainerTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoContentCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoFormattingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoOriginalProjectionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoSwapModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoUnpublishedContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdVideoUploadPhaseValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdgroupActivityObjectiveNewValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdgroupActivityObjectiveOldValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsActionAttributionWindowsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsActionBreakdownsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsActionReportTimeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsBreakdownsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsDatePresetValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsLevelValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsInsightsSummaryActionBreakdownsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsPixelAutomaticMatchingFieldsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsPixelDataUseSettingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsPixelFirstPartyCookieStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsPixelSortByValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsPixelStatsResultAggregationValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AdsPixelTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AppRoles.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationAnPlatformsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationLoggingSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationLoggingTargetValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationMutationMethodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationPlatformValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationPostMethodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationRequestTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationScoreTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationSortOrderValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ApplicationSupportedPlatformsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ArchivableCrudObjectEffectiveStatuses.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AsyncRequestStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/AsyncRequestTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BillingEvents.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessAgreementRequestStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessAssetGroupAdaccountTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessAssetGroupOfflineConversionDataSetTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessAssetGroupPageTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessAssetGroupPixelTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessAssetSharingAgreementRequestStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessOwnedObjectOnBehalfOfRequestStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessPagePermittedTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessPermittedTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessRoleRequestRoleValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessRoles.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessSurveyBusinessTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessTwoFactorTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessUserRoleValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/BusinessVerticalValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CPASCollaborationRequestRequesterAgencyOrBrandValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CPASParentCatalogSettingsAttributionWindowsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignBidStrategyValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignBuyingTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignConfiguredStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignDatePresetValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignEffectiveStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignExecutionOptionsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignObjectiveValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignOperatorValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignSmartPromotionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignSpecialAdCategoriesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignSpecialAdCategoryCountryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignSpecialAdCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignStatusOptionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CampaignStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommentCommentPrivacyValueValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommentFilterValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommentLiveFilterValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommentOrderValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommerceOrderFiltersValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommerceOrderReasonCodeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CommerceOrderStateValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ConnectionObjectTypes.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ContentDeliveryReportPlatformValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ContentDeliveryReportPositionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceClaimObjectiveValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceCustomerFileSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceDataSourceSubTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceDataSourceTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceSubtypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceSubtypes.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomAudienceTypes.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomConversionCustomEventTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/CustomConversionStatsResultAggregationValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/DACheckConnectionMethodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/EntityAtTextRangeTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/EventCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/EventEventStateFilterValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/EventOnlineEventFormatValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/EventTimeFilterValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/EventTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ExtendedCreditAllocationConfigLiabilityTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ExtendedCreditAllocationConfigPartitionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ExtendedCreditAllocationConfigSendBillToValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/FeedEncoding.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/GroupGroupTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/GroupJoinSettingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/GroupPostPermissionsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/GroupPurposeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/GroupSuggestionCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InsightsIncrements.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InsightsOperators.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InsightsResultDatePresetValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InsightsResultPeriodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InstagramInsightsResultMetricValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InstagramInsightsResultPeriodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InstantArticleInsightsQueryResultBreakdownValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/InstantArticleInsightsQueryResultPeriodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LeadgenFormLocaleValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LeadgenFormStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveEncoderCapAudioCodecsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveEncoderCapStreamingProtocolsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveEncoderCapVideoCodecsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveEncoderStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoBroadcastStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoLiveCommentModerationSettingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoProjectionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoSpatialAudioFormatValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoStereoscopicModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/LiveVideoStreamTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/MeasurementUploadEventAggregationLevelValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/MeasurementUploadEventEventStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/MeasurementUploadEventLookbackWindowValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/MeasurementUploadEventMatchUniverseValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/MeasurementUploadEventTimezoneValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/MediaFingerprintFingerprintContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/NativeOfferBarcodeTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/NativeOfferLocationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/NativeOfferUniqueCodesFileCodeTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/OfflineConversionDataSetPermittedRolesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/OfflineConversionDataSetRelationshipTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/OracleTransactionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageAttireValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageBackdatedTimeGranularityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageCallToActionAndroidDestinationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageCallToActionIphoneDestinationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageCallToActionTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageCallToActionWebDestinationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageCheckinEntryPointValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageFoodStylesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageFormattingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageMessagingTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageModelValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageNotificationTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePermittedTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePickupOptionsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePlaceAttachmentSettingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePostBackdatedTimeGranularityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePostFeedStoryVisibilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePostSurfacesBlacklistValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePostTimelineVisibilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePostWithValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePostingToRedspaceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PagePublishStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageRoles.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageSenderActionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageSubscribedFieldsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageTargetSurfaceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageTemporaryStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageTypes.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PageUnpublishedContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PermissionStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PhotoBackdatedTimeGranularityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PhotoTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PhotoUnpublishedContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostBackdatedTimeGranularityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostCheckinEntryPointValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostFeedStoryVisibilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostFormattingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostPlaceAttachmentSettingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostPostSurfacesBlacklistValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostPostingToRedspaceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostTargetSurfaceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostTimelineVisibilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/PostUnpublishedContentTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogCategoryCategorizationCriteriaValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogItemSubTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogPermittedRolesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogPermittedTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogStandardValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductCatalogVerticalValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductEventStatBreakdownsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductEventStatDeviceTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductEventStatEventValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedDelimiterValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedEncodingValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedFeedTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedItemSubTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedOverrideTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedQuotedFieldsModeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedRuleRuleTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedScheduleDayOfWeekValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedScheduleIntervalValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedUploadErrorAffectedSurfacesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedUploadErrorSeverityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductFeedUploadInputMethodValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemAgeGroupValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemAvailabilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemCommerceTaxCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemConditionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemGenderValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemReviewStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemShippingWeightUnitValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProductItemVisibilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProfilePictureSourceBreakingChangeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProfilePictureSourceTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProfileProfileTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ProfileTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ReachFrequencyPredictionActionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ReachFrequencyPredictionBuyingTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ReachFrequencyPredictionInstreamPackagesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/ReachFrequencyPredictionStatuses.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/TargetingDevicePlatformsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/TargetingEffectiveDevicePlatformsValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/TermsOfService.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/URLScopesValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/UserFilteringValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/UserLocalNewsMegaphoneDismissStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/UserLocalNewsSubscriptionStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/UserPermissionRoles.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/UserTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleAvailabilityValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleBodyStyleValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleConditionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleDrivetrainValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleFuelTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleStateOfVehicleValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleTransmissionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VehicleVehicleTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VideoCopyrightContentCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VideoCopyrightMonitoringTypeValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VideoCopyrightRuleSourceValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VideoPollActionValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/VideoPollStatusValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/WhatsAppBusinessAccountCategoryValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Values/WhatsAppBusinessAccountTasksValues.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/Vehicle.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VehicleOffer.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyright.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightConditionGroup.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightGeoGate.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightRule.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightSegment.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoList.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoPoll.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoThumbnail.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoUploadLimits.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/VoipInfo.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/WebAppLink.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/WhatsAppBusinessAccount.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/WindowsAppLink.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/WindowsPhoneAppLink.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Object/WorkUserFrontline.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/Session.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/SessionInterface.php create mode 100644 vendor/facebook/php-business-sdk/src/FacebookAds/TypeChecker.php create mode 100644 vendor/facebook/php-business-sdk/test/.gitignore create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractIntegrationTestCase.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractTestCase.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractUnitTestCase.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/ApiTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/Bootstrap.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/IntegrationBootstrap.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Config/Config.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Config/SkippableFeatureTestInterface.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Config/SkippableFeaturesManager.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorDegradationTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Enum/DummyEnum.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Enum/EnumTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Exception/PHPUnitRequestExceptionWrapper.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/AbstractAdapterTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/CurlAdapterTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ClientTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Exception/RequestExceptionTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/FileParameterTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ParametersTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/RequestTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ResponseTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/AbstractLoggerTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareParametersTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareTestTrait.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonNodeTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLoggerTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/NullLoggerTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractAsyncJobTestCase.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTestCase.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountGroupTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdConversionPixelTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdCreativeTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdImageTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdLabelTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdPreviewTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdSetTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdUserTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdVideoTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdsPixelTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AsyncJobInsightsTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/BusinessTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CampaignTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceMultikeyTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceNormalizers/EmailNormalizerTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/DynamicProductAdsAdvertTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/EmptyCrudObject.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/EmptyObject.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/LeadTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/LeadgenFormTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PageTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PartnerCategoryTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductAudienceTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductCatalogTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductFeedTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductSetTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProjectTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachEstimateTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachFrequencyPredictionTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/AsyncClientTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/BatchProcessorTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ContentTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/CustomDataTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestAsyncTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideEventTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideNormalizeTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideUtilTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/TestHelpers/AnotherHttpService.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/TestHelpers/FakeHttpService.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/UserDataTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/TargetingSearchTest.php create mode 100644 vendor/facebook/php-business-sdk/test/FacebookAdsTest/SessionTest.php create mode 100644 vendor/facebook/php-business-sdk/test/config.php create mode 100644 vendor/facebook/php-business-sdk/test/init_integration.php create mode 100644 vendor/facebook/php-business-sdk/test/init_unit.php create mode 100755 vendor/facebook/php-business-sdk/test/misc/image.png create mode 100644 vendor/facebook/php-business-sdk/test/misc/images.zip create mode 100644 vendor/facebook/php-business-sdk/test/misc/video.mp4 create mode 100644 vendor/facebook/php-business-sdk/test/phpunit-travis.xml create mode 100644 vendor/facebook/php-business-sdk/test/phpunit.xml create mode 100644 vendor/firebase/php-jwt/src/JWK.php delete mode 100644 vendor/google/auth/.editorconfig delete mode 100644 vendor/google/auth/.gitignore delete mode 100644 vendor/google/auth/.php_cs delete mode 100644 vendor/google/auth/.travis.yml create mode 100644 vendor/google/auth/CODE_OF_CONDUCT.md delete mode 100644 vendor/google/auth/CONTRIBUTING.md delete mode 100644 vendor/google/auth/phpunit.xml.dist create mode 100644 vendor/google/auth/src/AccessToken.php create mode 100644 vendor/google/auth/src/Cache/SysVCacheItemPool.php create mode 100644 vendor/google/auth/src/Credentials/InsecureCredentials.php create mode 100644 vendor/google/auth/src/GCECache.php rename vendor/google/auth/{tests/Middleware/SimpleMiddlewareTest.php => src/GetQuotaProjectInterface.php} (56%) create mode 100644 vendor/google/auth/src/HttpHandler/Guzzle7HttpHandler.php create mode 100644 vendor/google/auth/src/HttpHandler/HttpClientCache.php create mode 100644 vendor/google/auth/src/Iam.php create mode 100644 vendor/google/auth/src/ProjectIdProviderInterface.php create mode 100644 vendor/google/auth/src/ServiceAccountSignerTrait.php create mode 100644 vendor/google/auth/src/SignBlobInterface.php create mode 100644 vendor/google/auth/src/UpdateMetadataInterface.php delete mode 100644 vendor/google/auth/tests/ApplicationDefaultCredentialsTest.php delete mode 100644 vendor/google/auth/tests/BaseTest.php delete mode 100644 vendor/google/auth/tests/Cache/ItemTest.php delete mode 100644 vendor/google/auth/tests/Cache/MemoryCacheItemPoolTest.php delete mode 100644 vendor/google/auth/tests/CacheTraitTest.php delete mode 100644 vendor/google/auth/tests/Credentials/AppIndentityCredentialsTest.php delete mode 100644 vendor/google/auth/tests/Credentials/GCECredentialsTest.php delete mode 100644 vendor/google/auth/tests/Credentials/IAMCredentialsTest.php delete mode 100644 vendor/google/auth/tests/Credentials/ServiceAccountCredentialsTest.php delete mode 100644 vendor/google/auth/tests/Credentials/UserRefreshCredentialsTest.php delete mode 100644 vendor/google/auth/tests/FetchAuthTokenCacheTest.php delete mode 100644 vendor/google/auth/tests/FetchAuthTokenTest.php delete mode 100644 vendor/google/auth/tests/HttpHandler/Guzzle5HttpHandlerTest.php delete mode 100644 vendor/google/auth/tests/HttpHandler/Guzzle6HttpHandlerTest.php delete mode 100644 vendor/google/auth/tests/HttpHandler/HttpHandlerFactoryTest.php delete mode 100644 vendor/google/auth/tests/Middleware/AuthTokenMiddlewareTest.php delete mode 100644 vendor/google/auth/tests/Middleware/ScopedAccessTokenMiddlewareTest.php delete mode 100644 vendor/google/auth/tests/OAuth2Test.php delete mode 100644 vendor/google/auth/tests/Subscriber/AuthTokenSubscriberTest.php delete mode 100644 vendor/google/auth/tests/Subscriber/ScopedAccessTokenSubscriberTest.php delete mode 100644 vendor/google/auth/tests/Subscriber/SimpleSubscriberTest.php delete mode 100644 vendor/google/auth/tests/bootstrap.php delete mode 100644 vendor/google/auth/tests/fixtures/.config/gcloud/application_default_credentials.json delete mode 100644 vendor/google/auth/tests/fixtures/private.json delete mode 100644 vendor/google/auth/tests/fixtures/private.pem delete mode 100644 vendor/google/auth/tests/fixtures/public.pem delete mode 100644 vendor/google/auth/tests/fixtures2/.config/gcloud/application_default_credentials.json delete mode 100644 vendor/google/auth/tests/fixtures2/private.json delete mode 100644 vendor/google/auth/tests/mocks/AppIdentityService.php create mode 100644 vendor/guzzlehttp/guzzle/.php_cs create mode 100644 vendor/guzzlehttp/guzzle/Dockerfile create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Utils.php create mode 100644 vendor/guzzlehttp/promises/.php_cs.dist create mode 100644 vendor/guzzlehttp/promises/phpstan-baseline.neon create mode 100644 vendor/guzzlehttp/promises/phpstan.neon.dist create mode 100644 vendor/guzzlehttp/promises/psalm.xml create mode 100644 vendor/guzzlehttp/promises/src/Create.php create mode 100644 vendor/guzzlehttp/promises/src/Each.php create mode 100644 vendor/guzzlehttp/promises/src/Is.php create mode 100644 vendor/guzzlehttp/promises/src/Utils.php create mode 100644 vendor/guzzlehttp/psr7/src/Header.php create mode 100644 vendor/guzzlehttp/psr7/src/Message.php create mode 100644 vendor/guzzlehttp/psr7/src/MimeType.php create mode 100644 vendor/guzzlehttp/psr7/src/Query.php create mode 100644 vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 vendor/guzzlehttp/psr7/src/Utils.php create mode 100644 vendor/league/oauth2-client/LICENSE create mode 100644 vendor/league/oauth2-client/README.md create mode 100644 vendor/league/oauth2-client/composer.json create mode 100644 vendor/league/oauth2-client/src/Grant/AbstractGrant.php create mode 100644 vendor/league/oauth2-client/src/Grant/AuthorizationCode.php create mode 100644 vendor/league/oauth2-client/src/Grant/ClientCredentials.php create mode 100644 vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php create mode 100644 vendor/league/oauth2-client/src/Grant/GrantFactory.php create mode 100644 vendor/league/oauth2-client/src/Grant/Password.php create mode 100644 vendor/league/oauth2-client/src/Grant/RefreshToken.php create mode 100644 vendor/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php create mode 100644 vendor/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php create mode 100644 vendor/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php create mode 100644 vendor/league/oauth2-client/src/Provider/AbstractProvider.php create mode 100644 vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php create mode 100644 vendor/league/oauth2-client/src/Provider/GenericProvider.php create mode 100644 vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php create mode 100644 vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php create mode 100644 vendor/league/oauth2-client/src/Token/AccessToken.php create mode 100644 vendor/league/oauth2-client/src/Token/AccessTokenInterface.php create mode 100644 vendor/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php create mode 100644 vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/GuardedPropertyTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php create mode 100644 vendor/league/oauth2-client/src/Tool/RequestFactory.php create mode 100644 vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php create mode 100755 vendor/league/oauth2-facebook/LICENSE create mode 100755 vendor/league/oauth2-facebook/composer.json create mode 100644 vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php create mode 100755 vendor/league/oauth2-facebook/src/Provider/AppSecretProof.php create mode 100644 vendor/league/oauth2-facebook/src/Provider/Exception/FacebookProviderException.php create mode 100755 vendor/league/oauth2-facebook/src/Provider/Facebook.php create mode 100755 vendor/league/oauth2-facebook/src/Provider/FacebookUser.php delete mode 100644 vendor/monolog/monolog/.php_cs delete mode 100644 vendor/monolog/monolog/doc/01-usage.md delete mode 100644 vendor/monolog/monolog/doc/02-handlers-formatters-processors.md delete mode 100644 vendor/monolog/monolog/doc/03-utilities.md delete mode 100644 vendor/monolog/monolog/doc/04-extending.md delete mode 100644 vendor/monolog/monolog/doc/sockets.md delete mode 100644 vendor/monolog/monolog/phpunit.xml.dist create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/ResettableInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/SignalHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Utils.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/LoggerTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/RegistryTest.php delete mode 100644 vendor/monolog/monolog/tests/Monolog/TestCase.php create mode 100644 vendor/paragonie/random_compat/LICENSE create mode 100755 vendor/paragonie/random_compat/build-phar.sh create mode 100644 vendor/paragonie/random_compat/composer.json create mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey create mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc create mode 100644 vendor/paragonie/random_compat/lib/random.php create mode 100644 vendor/paragonie/random_compat/other/build_phar.php create mode 100644 vendor/paragonie/random_compat/psalm-autoload.php create mode 100644 vendor/paragonie/random_compat/psalm.xml create mode 100644 vendor/phpdocumentor/reflection-common/.github/dependabot.yml create mode 100644 vendor/phpdocumentor/reflection-common/.github/workflows/push.yml delete mode 100644 vendor/phpdocumentor/reflection-common/.travis.yml create mode 100644 vendor/phpdocumentor/reflection-docblock/appveyor.yml create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php create mode 100644 vendor/phpdocumentor/type-resolver/composer.lock create mode 100644 vendor/phpdocumentor/type-resolver/phpbench.json create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoType.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ClassString.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Collection.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Expression.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Intersection.php delete mode 100644 vendor/psr/log/.gitignore create mode 100644 vendor/psr/log/Psr/Log/Test/DummyTest.php create mode 100644 vendor/psr/log/Psr/Log/Test/TestLogger.php create mode 100644 vendor/ralouphie/getallheaders/LICENSE create mode 100644 vendor/ralouphie/getallheaders/README.md create mode 100644 vendor/ralouphie/getallheaders/composer.json create mode 100644 vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 vendor/symfony/polyfill-ctype/LICENSE create mode 100644 vendor/symfony/polyfill-ctype/README.md create mode 100644 vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 vendor/symfony/polyfill-ctype/composer.json create mode 100644 vendor/symfony/polyfill-intl-idn/Idn.php create mode 100644 vendor/symfony/polyfill-intl-idn/Info.php create mode 100644 vendor/symfony/polyfill-intl-idn/LICENSE create mode 100644 vendor/symfony/polyfill-intl-idn/README.md create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php create mode 100644 vendor/symfony/polyfill-intl-idn/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-idn/composer.json create mode 100644 vendor/symfony/polyfill-intl-normalizer/LICENSE create mode 100644 vendor/symfony/polyfill-intl-normalizer/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/README.md create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/composer.json create mode 100644 vendor/symfony/polyfill-php72/LICENSE create mode 100644 vendor/symfony/polyfill-php72/Php72.php create mode 100644 vendor/symfony/polyfill-php72/README.md create mode 100644 vendor/symfony/polyfill-php72/bootstrap.php create mode 100644 vendor/symfony/polyfill-php72/composer.json delete mode 100644 vendor/symfony/serializer/.gitignore create mode 100644 vendor/symfony/serializer/Annotation/DiscriminatorMap.php create mode 100644 vendor/symfony/serializer/Annotation/SerializedName.php delete mode 100644 vendor/symfony/serializer/Encoder/SerializerAwareEncoder.php rename vendor/symfony/serializer/{Tests/Fixtures/ProxyDummy.php => Exception/MissingConstructorArgumentsException.php} (59%) create mode 100644 vendor/symfony/serializer/Extractor/ObjectPropertyListExtractor.php create mode 100644 vendor/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php create mode 100644 vendor/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.php create mode 100644 vendor/symfony/serializer/Mapping/ClassDiscriminatorMapping.php create mode 100644 vendor/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.php create mode 100644 vendor/symfony/serializer/NameConverter/AdvancedNameConverterInterface.php create mode 100644 vendor/symfony/serializer/NameConverter/MetadataAwareNameConverter.php create mode 100644 vendor/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php create mode 100644 vendor/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.php create mode 100644 vendor/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php create mode 100644 vendor/symfony/serializer/Normalizer/ProblemNormalizer.php delete mode 100644 vendor/symfony/serializer/Normalizer/SerializerAwareNormalizer.php delete mode 100644 vendor/symfony/serializer/Tests/Annotation/GroupsTest.php delete mode 100644 vendor/symfony/serializer/Tests/Annotation/MaxDepthTest.php delete mode 100644 vendor/symfony/serializer/Tests/DependencyInjection/SerializerPassTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/ChainDecoderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/ChainEncoderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/CsvEncoderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/JsonDecodeTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/JsonEncodeTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/JsonEncoderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/XmlEncoderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Encoder/YamlEncoderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/AbstractNormalizerDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/CircularReferenceDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/DenormalizableDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/Dummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/GroupDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/GroupDummyChild.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/GroupDummyInterface.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/GroupDummyParent.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/JsonSerializableDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/MaxDepthDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/NormalizableTraversableDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/PropertyCircularReferenceDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/PropertySiblingHolder.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/ScalarDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/SiblingHolder.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/StaticConstructorDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/StaticConstructorNormalizer.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/ToBeProxyfiedDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/TraversableDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/VariadicConstructorArgsDummy.php delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/empty-mapping.yml delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/invalid-mapping.yml delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/serialization.xml delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/serialization.yml delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/test.gif delete mode 100644 vendor/symfony/serializer/Tests/Fixtures/test.txt delete mode 100644 vendor/symfony/serializer/Tests/Mapping/AttributeMetadataTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/ClassMetadataTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/Factory/ClassMetadataFactoryTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php delete mode 100644 vendor/symfony/serializer/Tests/Mapping/TestClassMetadataFactory.php delete mode 100644 vendor/symfony/serializer/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/AbstractNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/ArrayDenormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/CustomNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/DataUriNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/DateIntervalNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/DateTimeNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/ObjectNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/ObjectToPopulateTraitTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/PropertyNormalizerTest.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/TestDenormalizer.php delete mode 100644 vendor/symfony/serializer/Tests/Normalizer/TestNormalizer.php delete mode 100644 vendor/symfony/serializer/Tests/SerializerTest.php delete mode 100644 vendor/symfony/serializer/phpunit.xml.dist delete mode 100644 vendor/webmozart/assert/.composer-auth.json create mode 100644 vendor/webmozart/assert/.editorconfig delete mode 100644 vendor/webmozart/assert/.styleci.yml create mode 100644 vendor/webmozart/assert/psalm.xml create mode 100644 vendor/webmozart/assert/src/Mixin.php diff --git a/Platforms/FacebookAds/Controller.php b/Platforms/FacebookAds/Controller.php index 11e5faf6..61c360f1 100644 --- a/Platforms/FacebookAds/Controller.php +++ b/Platforms/FacebookAds/Controller.php @@ -4,11 +4,11 @@ * * @author Daniel Stonies */ + namespace Piwik\Plugins\AOM\Platforms\FacebookAds; -use Facebook\Exceptions\FacebookResponseException; -use Facebook\Exceptions\FacebookSDKException; -use Facebook\Facebook; +use Exception; +use League\OAuth2\Client\Provider\Facebook; use Piwik\Common; use Piwik\Option; use Piwik\Piwik; @@ -32,12 +32,12 @@ public function addAccount($websiteId, $clientId, $clientSecret, $accountId) $configuration = $settings->getConfiguration(); $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][uniqid('', true)] = [ - 'websiteId' => $websiteId, - 'clientId' => $clientId, + 'websiteId' => $websiteId, + 'clientId' => $clientId, 'clientSecret' => $clientSecret, - 'accountId' => $accountId, - 'accessToken' => null, - 'active' => true, + 'accountId' => $accountId, + 'accessToken' => null, + 'active' => true, ]; $settings->setConfiguration($configuration); @@ -66,15 +66,13 @@ public function getAccessToken() $idSites = [$configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['websiteId']] ); - $fb = $this->getFacebookApiClient($configuration, $id); - $helper = $fb->getRedirectLoginHelper(); - $loginUrl = $helper->getLoginUrl( - Option::get('piwikUrl') - . '?module=AOM&action=platformAction&platform=FacebookAds&method=processAccessTokenCode&id=' . $id, - ['ads_read'] - ); + $provider = $this->getFacebookAuthProvider($configuration, $id); + // If we don't have an authorization code then get one + $authUrl = $provider->getAuthorizationUrl(['scope' => ['ads_read']]); + $_SESSION['oauth2state'] = $provider->getState(); + $_SESSION['aom_facebook_website_id'] = $id; - header('Location: ' . $loginUrl); + header('Location: ' . $authUrl); exit; } @@ -88,8 +86,14 @@ public function processAccessTokenCode() $settings = new SystemSettings(); $configuration = $settings->getConfiguration(); - // Does the account exist? - $id = Common::getRequestVar('id', false); + if (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + echo 'Invalid state.'; + exit; + } + + $id = $_SESSION['aom_facebook_website_id']; + if (!array_key_exists($id, $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'])) { throw new \Exception('Facebook Ads account "' . $id . '" does not exist.'); } @@ -98,28 +102,24 @@ public function processAccessTokenCode() $idSites = [$configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['websiteId']] ); - $fb = $this->getFacebookApiClient($configuration, $id); - $helper = $fb->getRedirectLoginHelper(); + $provider = $this->getFacebookAuthProvider($configuration, $id); + + $token = $provider->getAccessToken('authorization_code', [ + 'code' => $_GET['code'], + ]); try { - $accessToken = $helper->getAccessToken(); - } catch (FacebookResponseException $e) { - throw new \Exception('Graph returned an error: ' . $e->getMessage()); - } catch (FacebookSDKException $e) { - throw new \Exception('Facebook SDK returned an error: ' . $e->getMessage()); + $token = $provider->getLongLivedAccessToken($token); + } catch (Exception $e) { + echo 'Failed to exchange the token: ' . $e->getMessage(); + exit(); } - if (isset($accessToken)) { - - $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['accessToken'] = $accessToken->getValue(); - $settings->setConfiguration($configuration); - - header('Location: ?module=AOM&action=settings'); - exit; + $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['accessToken'] = $token->getToken(); + $settings->setConfiguration($configuration); - } elseif ($helper->getError()) { - throw new \Exception('The user denied the request.'); - } + header('Location: ?module=AOM&action=settings'); + exit; } /** @@ -127,14 +127,13 @@ public function processAccessTokenCode() * @param string $id * @return Facebook */ - private function getFacebookApiClient($configuration, $id) + private function getFacebookAuthProvider($configuration, $id) { - $fb = new Facebook([ - 'app_id' => $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['clientId'], - 'app_secret' => $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['clientSecret'], - 'default_graph_version' => 'v2.5', + return new Facebook([ + 'clientId' => $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['clientId'], + 'clientSecret' => $configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'][$id]['clientSecret'], + 'redirectUri' => Option::get('piwikUrl') . '?module=AOM&action=platformAction&platform=FacebookAds&method=processAccessTokenCode', + 'graphApiVersion' => 'v9.0', ]); - - return $fb; } } diff --git a/Platforms/FacebookAds/Importer.php b/Platforms/FacebookAds/Importer.php index 8885a513..63ef5ebb 100644 --- a/Platforms/FacebookAds/Importer.php +++ b/Platforms/FacebookAds/Importer.php @@ -7,15 +7,45 @@ */ namespace Piwik\Plugins\AOM\Platforms\FacebookAds; +use DateTime; use Exception; +use FacebookAds\Object\Fields\AdsInsightsFields; +use FacebookAds\Object\Values\AdsInsightsLevelValues; use Monolog\Logger; use Piwik\Plugins\AOM\AOM; use Piwik\Plugins\AOM\Platforms\AbstractImporter; use Piwik\Plugins\AOM\Platforms\ImporterInterface; use Piwik\Plugins\AOM\SystemSettings; +use FacebookAds\Api; +use FacebookAds\Logger\CurlLogger; +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Campaign; +use FacebookAds\Object\Fields\CampaignFields; + + class Importer extends AbstractImporter implements ImporterInterface { + + /** + * @var array + */ + protected $adsInsightsFields = [ + AdsInsightsFields::DATE_START, + AdsInsightsFields::ACCOUNT_NAME, + AdsInsightsFields::ACCOUNT_ID, + AdsInsightsFields::CAMPAIGN_ID, + AdsInsightsFields::CAMPAIGN_NAME, + AdsInsightsFields::ADSET_ID, + AdsInsightsFields::ADSET_NAME, + AdsInsightsFields::AD_NAME, + AdsInsightsFields::AD_ID, + AdsInsightsFields::IMPRESSIONS, + AdsInsightsFields::CLICKS, + AdsInsightsFields::INLINE_LINK_CLICKS, + AdsInsightsFields::SPEND, + ]; + /** * Imports all active accounts day by day */ @@ -27,7 +57,7 @@ public function import() foreach ($configuration[AOM::PLATFORM_FACEBOOK_ADS]['accounts'] as $accountId => $account) { if (array_key_exists('active', $account) && true === $account['active']) { foreach (AOM::getPeriodAsArrayOfDates($this->startDate, $this->endDate) as $date) { - $this->importAccount($accountId, $account, $date); + $this->importAccount($account, $date); } } else { $this->log(Logger::INFO, 'Skipping inactive account.'); @@ -41,14 +71,97 @@ public function import() * @param string $date * @throws \Exception */ - private function importAccount($accountId, $account, $date) + private function importAccount($account, $date) { $this->log(Logger::INFO, 'Will import FacebookAds account ' . $accountId. ' for date ' . $date . ' now.'); - $this->deleteExistingData(AOM::PLATFORM_FACEBOOK_ADS, $accountId, $account['websiteId'], $date); - throw new Exception('Not implemented'); +// var_dump($account); + +// var_dump([$account['clientId'], $account['clientSecret'], $account['accessToken']]); + $api = Api::init($account['clientId'], $account['clientSecret'], $account['accessToken']); + + $adAccount = new AdAccount($account['accountId'], null, $api); + + + foreach ($this->fetchAdsInsights($adAccount, $date) as $insight) { + var_dump([ +$insight->{AdsInsightsFields::ACCOUNT_NAME}, +$insight->{AdsInsightsFields::ACCOUNT_ID}, +$insight->{AdsInsightsFields::CAMPAIGN_NAME}, +$insight->{AdsInsightsFields::CAMPAIGN_ID}, +$insight->{AdsInsightsFields::ADSET_NAME}, +$insight->{AdsInsightsFields::ADSET_ID}, +$insight->{AdsInsightsFields::AD_NAME}, +$insight->{AdsInsightsFields::AD_ID}, +$insight->{AdsInsightsFields::CLICKS}, +$insight->{AdsInsightsFields::IMPRESSIONS}, +$insight->{AdsInsightsFields::SPEND}, + ] + ); + die(); +// $ad = new FacebookAds(); +// $ad +// ->setDate(new DateTime($date)) +// ->setSaasUserId($user->getId()) +// ->setAccountName($insight->{AdsInsightsFields::ACCOUNT_NAME}) +// ->setAccountId($insight->{AdsInsightsFields::ACCOUNT_ID}) +// ->setCampaignName($insight->{AdsInsightsFields::CAMPAIGN_NAME}) +// ->setCampaignId($insight->{AdsInsightsFields::CAMPAIGN_ID}) +// ->setAdsetName($insight->{AdsInsightsFields::ADSET_NAME}) +// ->setAdSetId($insight->{AdsInsightsFields::ADSET_ID}) +// ->setAdName($insight->{AdsInsightsFields::AD_NAME}) +// ->setAdId($insight->{AdsInsightsFields::AD_ID}) +// ->setClicks($insight->{AdsInsightsFields::CLICKS}) +// ->setImpressions($insight->{AdsInsightsFields::IMPRESSIONS}) +// ->setCosts($insight->{AdsInsightsFields::SPEND}); +// +// $this->entityManager->persist($ad); + } + + + +// $adAccount = new AdAccount($account['accountId']); + + + var_dump($adAccount->getData()); + + $cursor = $adAccount->getCampaigns(); + +// Loop over objects + foreach ($cursor as $campaign) { + echo $campaign->{CampaignFields::NAME}.PHP_EOL; + } + + + + + +// $this->deleteExistingData(AOM::PLATFORM_FACEBOOK_ADS, $accountId, $account['websiteId'], $date); + +// throw new Exception('Not implemented'); + } + + /** + * @param AdAccount $adAccount + * @param string $date + * @return \FacebookAds\ApiRequest|\FacebookAds\Cursor|\FacebookAds\Http\ResponseInterface|null + */ + protected function fetchAdsInsights(AdAccount $adAccount, $date) + { + $insights = $adAccount->getInsights($this->adsInsightsFields, [ + 'level' => AdsInsightsLevelValues::AD, + 'time_range' => [ + 'since' => $date, + 'until' => $date, + ], + ]); + + $insights->setUseImplicitFetch(true); + + return $insights; } + /** * Convenience function for shorter logging statements * diff --git a/composer.json b/composer.json index a6ca181b..e3cae2a7 100644 --- a/composer.json +++ b/composer.json @@ -2,6 +2,8 @@ "require": { "php": ">=5.5.0", "bramus/monolog-colored-line-formatter": "~2.0", - "googleads/googleads-php-lib": "^34.0.0" + "facebook/php-business-sdk": "^9.0.1", + "googleads/googleads-php-lib": "^34.0.0", + "league/oauth2-facebook": "^2.0" } } \ No newline at end of file diff --git a/composer.lock b/composer.lock index 86003bb6..96adec9d 100644 --- a/composer.lock +++ b/composer.lock @@ -1,23 +1,23 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "56b641eafcb4ee5a5c35231ded3a7684", + "content-hash": "bb7808a7f0f16e9c04cf110e9af8f5dd", "packages": [ { "name": "bramus/ansi-php", - "version": "3.0.1", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/bramus/ansi-php.git", - "reference": "c0dcf9a949e1c6111bbbb52a8ead34776064b209" + "reference": "fb0be33f36053af7454d462e3ddc0a2ac0b2f311" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bramus/ansi-php/zipball/c0dcf9a949e1c6111bbbb52a8ead34776064b209", - "reference": "c0dcf9a949e1c6111bbbb52a8ead34776064b209", + "url": "https://api.github.com/repos/bramus/ansi-php/zipball/fb0be33f36053af7454d462e3ddc0a2ac0b2f311", + "reference": "fb0be33f36053af7454d462e3ddc0a2ac0b2f311", "shasum": "" }, "require": { @@ -44,7 +44,11 @@ } ], "description": "ANSI Control Functions and ANSI Control Sequences (Colors, Erasing, etc.) for PHP CLI Apps", - "time": "2015-01-08T15:02:37+00:00" + "support": { + "issues": "https://github.com/bramus/ansi-php/issues", + "source": "https://github.com/bramus/ansi-php/tree/master" + }, + "time": "2019-12-03T09:04:38+00:00" }, { "name": "bramus/monolog-colored-line-formatter", @@ -86,27 +90,75 @@ } ], "description": "Colored Line Formatter for Monolog", + "support": { + "issues": "https://github.com/bramus/monolog-colored-line-formatter/issues", + "source": "https://github.com/bramus/monolog-colored-line-formatter/tree/master" + }, "time": "2015-01-07T22:12:35+00:00" }, + { + "name": "facebook/php-business-sdk", + "version": "9.0.1", + "source": { + "type": "git", + "url": "https://github.com/facebook/facebook-php-business-sdk.git", + "reference": "7edcdcfcd551196c90246875f875dbb48d35cd98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/facebook-php-business-sdk/zipball/7edcdcfcd551196c90246875f875dbb48d35cd98", + "reference": "7edcdcfcd551196c90246875f875dbb48d35cd98", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.5 || ^7.0" + }, + "require-dev": { + "mockery/mockery": "1.3.3", + "phpunit/phpunit": "~8", + "symfony/finder": "~2.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "FacebookAds\\": "src/FacebookAds/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "description": "PHP SDK for Facebook Business", + "homepage": "https://developers.facebook.com/", + "keywords": [ + "ads", + "business", + "facebook", + "instagram", + "page", + "sdk" + ], + "support": { + "source": "https://github.com/facebook/facebook-php-business-sdk/tree/9.0.1" + }, + "time": "2020-11-17T23:35:14+00:00" + }, { "name": "firebase/php-jwt", - "version": "v5.0.0", + "version": "v5.2.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", "shasum": "" }, "require": { "php": ">=5.3.0" }, "require-dev": { - "phpunit/phpunit": " 4.8.35" + "phpunit/phpunit": ">=4.8 <=9" }, "type": "library", "autoload": { @@ -132,35 +184,48 @@ ], "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", "homepage": "https://github.com/firebase/php-jwt", - "time": "2017-06-27T22:17:23+00:00" + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/master" + }, + "time": "2020-03-25T18:49:23+00:00" }, { "name": "google/auth", - "version": "v1.2.1", + "version": "v1.14.3", "source": { "type": "git", - "url": "https://github.com/google/google-auth-library-php.git", - "reference": "da0062d279c9459350808a4fb63dbc08b90d6b90" + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "c1503299c779af0cbc99b43788f75930988852cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/google/google-auth-library-php/zipball/da0062d279c9459350808a4fb63dbc08b90d6b90", - "reference": "da0062d279c9459350808a4fb63dbc08b90d6b90", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/c1503299c779af0cbc99b43788f75930988852cf", + "reference": "c1503299c779af0cbc99b43788f75930988852cf", "shasum": "" }, "require": { "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "~5.3.1|~6.0", - "guzzlehttp/psr7": "~1.2", + "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", + "guzzlehttp/psr7": "^1.2", "php": ">=5.4", "psr/cache": "^1.0", "psr/http-message": "^1.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", "guzzlehttp/promises": "0.1.1|^1.3", + "kelvinmo/simplejwt": "^0.2.5", + "phpseclib/phpseclib": "^2", "phpunit/phpunit": "^4.8.36|^5.7", - "sebastian/comparator": ">=1.2.3" + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." }, "type": "library", "autoload": { @@ -179,7 +244,12 @@ "google", "oauth2" ], - "time": "2018-01-24T18:28:42+00:00" + "support": { + "docs": "https://googleapis.github.io/google-auth-library-php/master/", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.14.3" + }, + "time": "2020-10-16T21:33:48+00:00" }, { "name": "googleads/googleads-php-lib", @@ -232,31 +302,37 @@ ], "description": "Google Ads APIs Client Library for PHP (AdWords and DFP)", "homepage": "https://github.com/googleads/googleads-php-lib", + "support": { + "issues": "https://github.com/googleads/googleads-php-lib/issues", + "source": "https://github.com/googleads/googleads-php-lib/tree/34.0.0" + }, "time": "2018-03-28T06:13:06+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.3.2", + "version": "6.5.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90" + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/68d0ea14d5a3f42a20e87632a5f84931e2709c90", - "reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "" }, "require": { + "ext-json": "*", "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4", - "psr/log": "^1.0" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" }, "suggest": { "psr/log": "Required for using the Log middleware" @@ -264,16 +340,16 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.3-dev" + "dev-master": "6.5-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\": "src/" - } + }, + "files": [ + "src/functions_include.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -297,27 +373,31 @@ "rest", "web service" ], - "time": "2018-03-26T16:33:04+00:00" + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, + "time": "2020-06-16T21:01:06+00:00" }, { "name": "guzzlehttp/promises", - "version": "v1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "reference": "60d379c243457e073cff02bc323a2a86cb355631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { @@ -348,36 +428,45 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.0" + }, + "time": "2020-09-30T07:37:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.4.2", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", "shasum": "" }, "require": { "php": ">=5.4.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -407,26 +496,157 @@ "keywords": [ "http", "message", + "psr-7", "request", "response", "stream", "uri", "url" ], - "time": "2017-03-20T17:10:46+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.7.0" + }, + "time": "2020-09-30T07:37:11+00:00" + }, + { + "name": "league/oauth2-client", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "badb01e62383430706433191b82506b6df24ad98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/badb01e62383430706433191b82506b6df24ad98", + "reference": "badb01e62383430706433191b82506b6df24ad98", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.6.0" + }, + "time": "2020-10-28T02:03:40+00:00" + }, + { + "name": "league/oauth2-facebook", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-facebook.git", + "reference": "093cf588b9d508ee426c71d6bc68f138fe914ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-facebook/zipball/093cf588b9d508ee426c71d6bc68f138fe914ddc", + "reference": "093cf588b9d508ee426c71d6bc68f138fe914ddc", + "shasum": "" + }, + "require": { + "league/oauth2-client": "^2.0", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "ext-json": "*", + "mockery/mockery": "~1.3.0", + "phpunit/phpunit": "^5.7|^6.0", + "squizlabs/php_codesniffer": "~3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sammy Kaye Powers", + "email": "me@sammyk.me", + "homepage": "http://www.sammyk.me" + } + ], + "description": "Facebook OAuth 2.0 Client Provider for The PHP League OAuth2-Client", + "keywords": [ + "Authentication", + "authorization", + "client", + "facebook", + "oauth", + "oauth2" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-facebook/issues", + "source": "https://github.com/thephpleague/oauth2-facebook/tree/2.0.3" + }, + "time": "2020-10-01T15:22:47+00:00" }, { "name": "monolog/monolog", - "version": "1.23.0", + "version": "1.25.5", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", "shasum": "" }, "require": { @@ -440,11 +660,10 @@ "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", "ruflin/elastica": ">=0.90 <3.0", "sentry/sentry": "^0.13", "swiftmailer/swiftmailer": "^5.3|^6.0" @@ -491,39 +710,98 @@ "logging", "psr-3" ], - "time": "2017-06-19T01:22:40+00:00" + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/1.25.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-07-23T08:35:51+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", + "name": "paragonie/random_compat", + "version": "v9.99.100", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", "shasum": "" }, "require": { - "php": ">=5.5" + "php": ">= 7" }, "require-dev": { - "phpunit/phpunit": "^4.6" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] + "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -545,31 +823,36 @@ "reflection", "static analysis" ], - "time": "2017-09-11T18:02:19+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", + "version": "4.3.4", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" + "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", + "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", "shasum": "" }, "require": { "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", + "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", + "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", "webmozart/assert": "^1.0" }, "require-dev": { - "doctrine/instantiator": "~1.0.5", + "doctrine/instantiator": "^1.0.5", "mockery/mockery": "^1.0", + "phpdocumentor/type-resolver": "0.4.*", "phpunit/phpunit": "^6.4" }, "type": "library", @@ -596,41 +879,42 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-30T07:14:17+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x" + }, + "time": "2019-12-28T18:55:12+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.4.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "shasum": "" }, "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" + "ext-tokenizer": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -643,7 +927,12 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-07-14T14:27:02+00:00" + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, + "time": "2020-09-17T18:55:26+00:00" }, { "name": "psr/cache", @@ -689,6 +978,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -739,20 +1031,23 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", - "version": "1.0.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", "shasum": "" }, "require": { @@ -761,7 +1056,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -786,60 +1081,432 @@ "psr", "psr-3" ], - "time": "2016-10-10T12:19:37+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "time": "2020-03-23T09:12:05+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "727d1096295d807c309fb01a851577302394c897" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", + "reference": "727d1096295d807c309fb01a851577302394c897", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.20.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930", + "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T14:02:19+00:00" }, { "name": "symfony/serializer", - "version": "v3.4.6", + "version": "v4.4.17", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "11bea1aebe9c8d506f47c01931b0df9f18629a8f" + "reference": "5719c6d5913375e453efb51d168510cc848471ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/11bea1aebe9c8d506f47c01931b0df9f18629a8f", - "reference": "11bea1aebe9c8d506f47c01931b0df9f18629a8f", + "url": "https://api.github.com/repos/symfony/serializer/zipball/5719c6d5913375e453efb51d168510cc848471ff", + "reference": "5719c6d5913375e453efb51d168510cc848471ff", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", - "symfony/dependency-injection": "<3.2", - "symfony/property-access": ">=3.0,<3.0.4|>=2.8,<2.8.4", - "symfony/property-info": "<3.1", + "symfony/dependency-injection": "<3.4", + "symfony/property-access": "<3.4", + "symfony/property-info": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/cache": "~3.1|~4.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.2|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/property-access": "~2.8|~3.0|~4.0", - "symfony/property-info": "~3.1|~4.0", - "symfony/yaml": "~3.4|~4.0" + "phpdocumentor/reflection-docblock": "^3.2|^4.0", + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4.13|~4.0|^5.0", + "symfony/validator": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" }, "suggest": { "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", "doctrine/cache": "For using the default cached annotation reader and metadata cache.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", - "symfony/http-foundation": "To use the DataUriNormalizer.", + "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", "symfony/property-access": "For using the ObjectNormalizer.", "symfony/property-info": "To deserialize relations.", "symfony/yaml": "For using the default YAML mapping loader." }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Serializer\\": "" @@ -864,35 +1531,51 @@ ], "description": "Symfony Serializer Component", "homepage": "https://symfony.com", - "time": "2018-02-14T14:07:03+00:00" + "support": { + "source": "https://github.com/symfony/serializer/tree/v4.4.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-11-25T11:55:08+00:00" }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" }, "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "phpunit/phpunit": "^4.8.36 || ^7.5.13" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -914,7 +1597,11 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "support": { + "issues": "https://github.com/webmozart/assert/issues", + "source": "https://github.com/webmozart/assert/tree/master" + }, + "time": "2020-07-08T17:02:28+00:00" } ], "packages-dev": [], @@ -926,5 +1613,6 @@ "platform": { "php": ">=5.5.0" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/vendor/bramus/ansi-php/.travis.yml b/vendor/bramus/ansi-php/.travis.yml index dbaf7bff..d126fd90 100644 --- a/vendor/bramus/ansi-php/.travis.yml +++ b/vendor/bramus/ansi-php/.travis.yml @@ -1,7 +1,12 @@ language: php + +dist: trusty + php: - - "5.6" - - "5.5" - - "5.4" + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - 7.3 before_script: composer install \ No newline at end of file diff --git a/vendor/bramus/ansi-php/composer.lock b/vendor/bramus/ansi-php/composer.lock index d4d9efe1..6d4a153c 100644 --- a/vendor/bramus/ansi-php/composer.lock +++ b/vendor/bramus/ansi-php/composer.lock @@ -1,24 +1,24 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "hash": "78f60fae1bfd21b20603c9098734f37e", + "content-hash": "2bd803cd6028d92b2de740f9bff2af1d", "packages": [], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.0.4", + "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { @@ -29,7 +29,7 @@ "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { @@ -38,8 +38,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -59,20 +59,229 @@ "constructor", "instantiate" ], - "time": "2014-10-13 12:58:55" + "time": "2015-06-14T21:17:01+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2017-09-11T18:02:19+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", + "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "phpdocumentor/reflection-common": "^1.0.0", + "phpdocumentor/type-resolver": "^0.4.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2017-11-10T14:09:06+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", + "shasum": "" + }, + "require": { + "php": "^5.5 || ^7.0", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2017-07-14T14:27:02+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "2.0.14", + "version": "2.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca158276c1200cc27f5409a5e338486bc0b4fc94" + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca158276c1200cc27f5409a5e338486bc0b4fc94", - "reference": "ca158276c1200cc27f5409a5e338486bc0b4fc94", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", "shasum": "" }, "require": { @@ -80,12 +289,12 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-text-template": "~1.2", "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "~1.0", + "sebastian/environment": "^1.3.2", "sebastian/version": "~1.0" }, "require-dev": { "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4.1" + "phpunit/phpunit": "~4" }, "suggest": { "ext-dom": "*", @@ -95,7 +304,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.2.x-dev" } }, "autoload": { @@ -104,9 +313,6 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -124,35 +330,37 @@ "testing", "xunit" ], - "time": "2014-12-26 13:28:33" + "time": "2015-10-06T15:47:00+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.3.4", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", - "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", + "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, "autoload": { "classmap": [ - "File/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -169,20 +377,20 @@ "filesystem", "iterator" ], - "time": "2013-10-10 15:34:57" + "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { @@ -191,20 +399,17 @@ "type": "library", "autoload": { "classmap": [ - "Text/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -213,35 +418,40 @@ "keywords": [ "template" ], - "time": "2014-01-30 17:20:04" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", - "version": "1.0.5", + "version": "1.0.9", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, "autoload": { "classmap": [ - "PHP/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -257,20 +467,20 @@ "keywords": [ "timer" ], - "time": "2013-08-02 07:42:54" + "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", - "version": "1.3.0", + "version": "1.4.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "f8d5d08c56de5cfd592b3340424a81733259a876" + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876", - "reference": "f8d5d08c56de5cfd592b3340424a81733259a876", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", + "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", "shasum": "" }, "require": { @@ -283,7 +493,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -306,20 +516,20 @@ "keywords": [ "tokenizer" ], - "time": "2014-08-31 06:12:13" + "time": "2017-12-04T08:55:13+00:00" }, { "name": "phpunit/phpunit", - "version": "4.4.1", + "version": "4.8.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6a5e49a86ce5e33b8d0657abe145057fc513543a" + "reference": "46023de9a91eec7dfb06cc56cb4e260017298517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6a5e49a86ce5e33b8d0657abe145057fc513543a", - "reference": "6a5e49a86ce5e33b8d0657abe145057fc513543a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517", + "reference": "46023de9a91eec7dfb06cc56cb4e260017298517", "shasum": "" }, "require": { @@ -329,18 +539,19 @@ "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", - "phpunit/php-code-coverage": "~2.0", - "phpunit/php-file-iterator": "~1.3.2", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "~2.1", + "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "~1.0.2", + "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.0", - "sebastian/diff": "~1.1", - "sebastian/environment": "~1.1", - "sebastian/exporter": "~1.0", + "sebastian/comparator": "~1.2.2", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.3", + "sebastian/exporter": "~1.2", "sebastian/global-state": "~1.0", "sebastian/version": "~1.0", - "symfony/yaml": "~2.0" + "symfony/yaml": "~2.1|~3.0" }, "suggest": { "phpunit/php-invoker": "~1.1" @@ -351,7 +562,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4.x-dev" + "dev-master": "4.8.x-dev" } }, "autoload": { @@ -377,29 +588,30 @@ "testing", "xunit" ], - "time": "2014-12-28 07:57:05" + "time": "2017-06-21T08:07:12+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.0", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "c63d2367247365f688544f0d500af90a11a44c65" + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65", - "reference": "c63d2367247365f688544f0d500af90a11a44c65", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", "shasum": "" }, "require": { - "doctrine/instantiator": "~1.0,>=1.0.1", + "doctrine/instantiator": "^1.0.2", "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2" + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" }, "require-dev": { - "phpunit/phpunit": "~4.3" + "phpunit/phpunit": "~4.4" }, "suggest": { "ext-soap": "*" @@ -432,34 +644,34 @@ "mock", "xunit" ], - "time": "2014-10-03 05:12:11" + "time": "2015-10-02T06:51:40+00:00" }, { "name": "sebastian/comparator", - "version": "1.1.0", + "version": "1.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "c484a80f97573ab934e37826dba0135a3301b26a" + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c484a80f97573ab934e37826dba0135a3301b26a", - "reference": "c484a80f97573ab934e37826dba0135a3301b26a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/diff": "~1.1", - "sebastian/exporter": "~1.0" + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" }, "require-dev": { - "phpunit/phpunit": "~4.1" + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -496,32 +708,32 @@ "compare", "equality" ], - "time": "2014-11-16 21:32:38" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", - "version": "1.2.0", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "5843509fed39dee4b356a306401e9dd1a931fec7" + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7", - "reference": "5843509fed39dee4b356a306401e9dd1a931fec7", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -544,36 +756,36 @@ } ], "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", + "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff" ], - "time": "2014-08-15 10:29:00" + "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", - "version": "1.2.1", + "version": "1.3.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7" + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7", - "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea", + "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.3" + "phpunit/phpunit": "^4.8 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -598,32 +810,34 @@ "environment", "hhvm" ], - "time": "2014-10-25 08:00:45" + "time": "2016-08-18T05:49:44+00:00" }, { "name": "sebastian/exporter", - "version": "1.0.2", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0" + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", - "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -663,20 +877,20 @@ "export", "exporter" ], - "time": "2014-09-10 00:51:36" + "time": "2016-06-17T09:04:28+00:00" }, { "name": "sebastian/global-state", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", - "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", "shasum": "" }, "require": { @@ -714,20 +928,73 @@ "keywords": [ "global state" ], - "time": "2014-10-06 09:23:50" + "time": "2015-10-12T03:26:01+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2016-10-03T07:41:43+00:00" }, { "name": "sebastian/version", - "version": "1.0.4", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b" + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b", - "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", "shasum": "" }, "type": "library", @@ -749,36 +1016,41 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2014-12-15 14:25:24" + "time": "2015-06-21T13:59:46+00:00" }, { - "name": "symfony/yaml", - "version": "v2.6.3", - "target-dir": "Symfony/Component/Yaml", + "name": "symfony/polyfill-ctype", + "version": "v1.10.0", "source": { "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "82462a90848a52c2533aa6b598b107d68076b018" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/82462a90848a52c2533aa6b598b107d68076b018", - "reference": "82462a90848a52c2533aa6b598b107d68076b018", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "suggest": { + "ext-ctype": "For best performance" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6-dev" + "dev-master": "1.9-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" - } + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -787,16 +1059,132 @@ "authors": [ { "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "homepage": "https://symfony.com/contributors" }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.4.22", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "ba11776e9e6c15ad5759a07bffb15899bac75c2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ba11776e9e6c15ad5759a07bffb15899bac75c2d", + "reference": "ba11776e9e6c15ad5759a07bffb15899bac75c2d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Yaml Component", - "homepage": "http://symfony.com", - "time": "2015-01-03 15:33:07" + "homepage": "https://symfony.com", + "time": "2019-01-16T10:59:17+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2018-12-25T11:19:39+00:00" } ], "aliases": [], diff --git a/vendor/bramus/ansi-php/readme.md b/vendor/bramus/ansi-php/readme.md index 28254a16..f7ab33b5 100644 --- a/vendor/bramus/ansi-php/readme.md +++ b/vendor/bramus/ansi-php/readme.md @@ -1,11 +1,11 @@ # ANSI PHP +[![Build Status](https://img.shields.io/travis/bramus/ansi-php.svg?style=flat-square)](http://travis-ci.org/bramus/ansi-php) [![Source](http://img.shields.io/badge/source-bramus/ansi--php-blue.svg?style=flat-square)](https://github.com/bramus/ansi-php) [![Version](https://img.shields.io/packagist/v/bramus/ansi-php.svg?style=flat-square)](https://packagist.org/packages/bramus/ansi-php) [![Downloads](https://img.shields.io/packagist/dt/bramus/ansi-php.svg?style=flat-square)](https://packagist.org/packages/bramus/ansi-php/stats) [![License](https://img.shields.io/packagist/l/bramus/ansi-php.svg?style=flat-square)](https://github.com/bramus/ansi-php/blob/master/LICENSE) + ANSI Control Functions and ANSI Control Sequences for PHP CLI Apps Built by Bramus! - [https://www.bram.us/](https://www.bram.us/) -[![Build Status](https://api.travis-ci.org/bramus/ansi-php.png)](http://travis-ci.org/bramus/ansi-php) - ## About `bramus/ansi-php` is a set of classes to working with ANSI Control Functions and ANSI Control Sequences on text based terminals. @@ -36,7 +36,7 @@ Other Control Sequences – such as moving the cursor – are not (yet) supporte An example library that uses `bramus/ansi-php` is [`bramus/monolog-colored-line-formatter`](https://github.com/bramus/monolog-colored-line-formatter). It uses `bramus/ansi-php`'s SGR support to colorize the output: -![Monolog Colored Line Formatter](https://raw.githubusercontent.com/bramus/monolog-colored-line-formatter/master/screenshots/colorscheme-default.gif) +![Monolog Colored Line Formatter](https://user-images.githubusercontent.com/11269635/28756233-c9f63abe-756a-11e7-883f-a084f35c55e7.gif) ## Prerequisites/Requirements @@ -46,7 +46,7 @@ An example library that uses `bramus/ansi-php` is [`bramus/monolog-colored-line- Installation is possible using Composer -``` +```shell composer require bramus/ansi-php ~3.0 ``` @@ -58,7 +58,7 @@ If you're feeling adventurous, you're of course free to use the raw `ControlFunc ### Quick example -``` +```php use \Bramus\Ansi\Ansi; use \Bramus\Ansi\Writers\StreamWriter; use \Bramus\Ansi\ControlSequences\EscapeSequences\Enums\SGR; @@ -69,7 +69,7 @@ $ansi = new Ansi(new StreamWriter('php://stdout')); // Output some styled text on screen, along with a Line Feed and a Bell $ansi->color(array(SGR::COLOR_FG_RED, SGR::COLOR_BG_WHITE)) ->blink() - ->text('I will be blinking red on a wite background.) + ->text('I will be blinking red on a white background.') ->nostyle() ->text(' And I will be normally styled.') ->lf() @@ -150,7 +150,7 @@ These shorthands write EL ANSI Escape Sequences to the writer. ### The Basics -``` +```php // Create Ansi Instance $ansi = new \Bramus\Ansi\Ansi(); @@ -161,9 +161,13 @@ $ansi->bell(); $ansi->text('Hello World!'); ``` +_NOTE:_ As no `$writer` is passed into the constructor of `\Bramus\Ansi\Ansi`, the default `StreamWriter` writing to `php://stdout` is used. + ### Using a `FlushableWriter` -``` +Flushable Writers are writers that cache the data and only output it when flushed using its `flush()` function. The `BufferWriter` and `ProxyWriter` implement this interface. + +```php // Create Ansi Instance $ansi = new \Bramus\Ansi\Ansi(new \Bramus\Ansi\Writers\BufferWriter()); @@ -181,7 +185,7 @@ echo $ansi->get(); `bramus/ansi-php`'s wrapper `Ansi` class supports chaining. -``` +```php // Create Ansi Instance $ansi = new \Bramus\Ansi\Ansi(); @@ -192,7 +196,7 @@ $ansi->lf()->text('hello')->bell()->lf(); ### Styling Text: The Basics -``` +```php $ansi = new \Bramus\Ansi\Ansi(); $ansi->bold()->underline()->text('I will be bold and underlined')->lf(); ``` @@ -200,7 +204,7 @@ $ansi->bold()->underline()->text('I will be bold and underlined')->lf(); __IMPORTANT__ Select Graphic Rendition works in such a way that text styling you have set will remain active until you call `nostyle()` or `reset()` to return to the default styling. -``` +```php $ansi = new \Bramus\Ansi\Ansi(); $ansi->bold()->underline()->text('I will be bold and underlined')->lf(); @@ -232,7 +236,7 @@ Colors, and other text styling options, are defined as contants on `\Bramus\Ansi - `SGR::COLOR_FG_PURPLE_BRIGHT`: Purple Foreground Color (Bright) - `SGR::COLOR_FG_CYAN_BRIGHT`: Cyan Foreground Color (Bright) - `SGR::COLOR_FG_WHITE_BRIGHT`: White Foreground Color (Bright) -- `SGR::COLOR_FG_RESET': Default Foreground Color +- `SGR::COLOR_FG_RESET`: Default Foreground Color #### Background Colors @@ -252,11 +256,11 @@ Colors, and other text styling options, are defined as contants on `\Bramus\Ansi - `SGR::COLOR_BG_PURPLE_BRIGHT`: Purple Background Color (Bright) - `SGR::COLOR_BG_CYAN_BRIGHT`: Cyan Background Color (Bright) - `SGR::COLOR_BG_WHITE_BRIGHT`: White Background Color (Bright) -- `SGR::COLOR_BG_RESET': Default Background Color +- `SGR::COLOR_BG_RESET`: Default Background Color Pass one of these into `$ansi->color()` and the color will be set. -``` +```php use \Bramus\Ansi\ControlSequences\EscapeSequences\Enums\SGR; $ansi = new \Bramus\Ansi\Ansi(); @@ -267,7 +271,8 @@ $ansi->color(SGR::COLOR_FG_RED) ``` To set the foreground and background color in one call, pass them using an array to `$ansi->color()` -``` + +```php use \Bramus\Ansi\ControlSequences\EscapeSequences\Enums\SGR; $ansi = new \Bramus\Ansi\Ansi(); @@ -282,7 +287,7 @@ $ansi->color(array(SGR::COLOR_FG_RED, SGR::COLOR_BG_WHITE)) As all raw `ControlFunction` and `ControlSequence` classes are provided with a `__toString()` function it's perfectly possible to directly `echo` some `bramus/ansi-php` instance. -``` +```php // Output a Bell Control Character echo new \Bramus\Ansi\ControlFunctions\Bell(); @@ -294,7 +299,7 @@ echo new \Bramus\Ansi\ControlSequences\EscapeSequences\ED( To fetch their contents, use the `get()` function: -``` +```php // Get ANSI string for a Bell Control Character $bell = (new \Bramus\Ansi\ControlFunctions\Bell())->get(); diff --git a/vendor/bramus/ansi-php/src/ControlSequences/Base.php b/vendor/bramus/ansi-php/src/ControlSequences/Base.php index 7599b7c5..33e43747 100644 --- a/vendor/bramus/ansi-php/src/ControlSequences/Base.php +++ b/vendor/bramus/ansi-php/src/ControlSequences/Base.php @@ -68,12 +68,12 @@ public function get() // Append Parameter Byte (if any) if (isset($this->parameterBytes) && sizeof((array) $this->parameterBytes) > 0) { - $toReturn .= implode($this->parameterBytes, ';'); + $toReturn .= implode(';', $this->parameterBytes); } // Append Intermediate Bytes (if any) if (isset($this->intermediateBytes) && sizeof((array) $this->intermediateBytes) > 0) { - $toReturn .= implode($this->intermediateBytes, ';'); // @TODO: Verify that ';' is the glue for intermediate bytes + $toReturn .= implode(';', $this->intermediateBytes); // @TODO: Verify that ';' is the glue for intermediate bytes } // Append Final Byte (if any) diff --git a/vendor/bramus/ansi-php/src/Writers/FlushableInterface.php b/vendor/bramus/ansi-php/src/Writers/FlushableInterface.php index fd727f31..c492c73f 100644 --- a/vendor/bramus/ansi-php/src/Writers/FlushableInterface.php +++ b/vendor/bramus/ansi-php/src/Writers/FlushableInterface.php @@ -10,4 +10,10 @@ interface FlushableInterface * @return string The data */ public function flush($resetAfterwards = true); + + /** + * Reset/Clear the buffer + * @return BufferedStreamWriter self, for chaining + */ + public function clear(); } diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index dc02dfb1..1a58957d 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -37,8 +37,8 @@ * * @author Fabien Potencier * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { @@ -60,7 +60,7 @@ class ClassLoader public function getPrefixes() { if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); @@ -279,7 +279,7 @@ public function isClassMapAuthoritative() */ public function setApcuPrefix($apcuPrefix) { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** @@ -377,7 +377,7 @@ private function findFileWithExtension($class, $ext) $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); - $search = $subPath.'\\'; + $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 00000000..b92c4825 --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,457 @@ + + array ( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'aliases' => + array ( + ), + 'reference' => '047c8545016c74d510c1503cbf9eb4563ef1915a', + 'name' => '__root__', + ), + 'versions' => + array ( + '__root__' => + array ( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'aliases' => + array ( + ), + 'reference' => '047c8545016c74d510c1503cbf9eb4563ef1915a', + ), + 'bramus/ansi-php' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => 'fb0be33f36053af7454d462e3ddc0a2ac0b2f311', + ), + 'bramus/monolog-colored-line-formatter' => + array ( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '6bff15eee00afe2690642535b0f1541f10852c2b', + ), + 'facebook/php-business-sdk' => + array ( + 'pretty_version' => '9.0.1', + 'version' => '9.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '7edcdcfcd551196c90246875f875dbb48d35cd98', + ), + 'firebase/php-jwt' => + array ( + 'pretty_version' => 'v5.2.0', + 'version' => '5.2.0.0', + 'aliases' => + array ( + ), + 'reference' => 'feb0e820b8436873675fd3aca04f3728eb2185cb', + ), + 'google/auth' => + array ( + 'pretty_version' => 'v1.14.3', + 'version' => '1.14.3.0', + 'aliases' => + array ( + ), + 'reference' => 'c1503299c779af0cbc99b43788f75930988852cf', + ), + 'googleads/googleads-php-lib' => + array ( + 'pretty_version' => '34.0.0', + 'version' => '34.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '7f086c308c3abd9198a64d70da7302085c73b19d', + ), + 'guzzlehttp/guzzle' => + array ( + 'pretty_version' => '6.5.5', + 'version' => '6.5.5.0', + 'aliases' => + array ( + ), + 'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e', + ), + 'guzzlehttp/promises' => + array ( + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '60d379c243457e073cff02bc323a2a86cb355631', + ), + 'guzzlehttp/psr7' => + array ( + 'pretty_version' => '1.7.0', + 'version' => '1.7.0.0', + 'aliases' => + array ( + ), + 'reference' => '53330f47520498c0ae1f61f7e2c90f55690c06a3', + ), + 'league/oauth2-client' => + array ( + 'pretty_version' => '2.6.0', + 'version' => '2.6.0.0', + 'aliases' => + array ( + ), + 'reference' => 'badb01e62383430706433191b82506b6df24ad98', + ), + 'league/oauth2-facebook' => + array ( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '093cf588b9d508ee426c71d6bc68f138fe914ddc', + ), + 'monolog/monolog' => + array ( + 'pretty_version' => '1.25.5', + 'version' => '1.25.5.0', + 'aliases' => + array ( + ), + 'reference' => '1817faadd1846cd08be9a49e905dc68823bc38c0', + ), + 'paragonie/random_compat' => + array ( + 'pretty_version' => 'v9.99.100', + 'version' => '9.99.100.0', + 'aliases' => + array ( + ), + 'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a', + ), + 'phpdocumentor/reflection-common' => + array ( + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', + 'aliases' => + array ( + ), + 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', + ), + 'phpdocumentor/reflection-docblock' => + array ( + 'pretty_version' => '4.3.4', + 'version' => '4.3.4.0', + 'aliases' => + array ( + ), + 'reference' => 'da3fd972d6bafd628114f7e7e036f45944b62e9c', + ), + 'phpdocumentor/type-resolver' => + array ( + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', + ), + 'psr/cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', + ), + 'psr/http-message' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + ), + 'psr/http-message-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', + ), + 'psr/log-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0.0', + ), + ), + 'ralouphie/getallheaders' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41', + ), + 'symfony/polyfill-intl-idn' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => '3b75acd829741c768bc8b1f84eb33265e7cc5117', + ), + 'symfony/polyfill-intl-normalizer' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => '727d1096295d807c309fb01a851577302394c897', + ), + 'symfony/polyfill-php72' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => 'cede45fcdfabdd6043b3592e83678e42ec69e930', + ), + 'symfony/serializer' => + array ( + 'pretty_version' => 'v4.4.17', + 'version' => '4.4.17.0', + 'aliases' => + array ( + ), + 'reference' => '5719c6d5913375e453efb51d168510cc848471ff', + ), + 'webmozart/assert' => + array ( + 'pretty_version' => '1.9.1', + 'version' => '1.9.1.0', + 'aliases' => + array ( + ), + 'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', + ), + ), +); + + + + + + + +public static function getInstalledPackages() +{ +return array_keys(self::$installed['versions']); +} + + + + + + + + + +public static function isInstalled($packageName) +{ +return isset(self::$installed['versions'][$packageName]); +} + + + + + + + + + + + + + + +public static function satisfies(VersionParser $parser, $packageName, $constraint) +{ +$constraint = $parser->parseConstraints($constraint); +$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + +return $provided->matches($constraint); +} + + + + + + + + + + +public static function getVersionRanges($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +$ranges = array(); +if (isset(self::$installed['versions'][$packageName]['pretty_version'])) { +$ranges[] = self::$installed['versions'][$packageName]['pretty_version']; +} +if (array_key_exists('aliases', self::$installed['versions'][$packageName])) { +$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']); +} +if (array_key_exists('replaced', self::$installed['versions'][$packageName])) { +$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']); +} +if (array_key_exists('provided', self::$installed['versions'][$packageName])) { +$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']); +} + +return implode(' || ', $ranges); +} + + + + + +public static function getVersion($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +if (!isset(self::$installed['versions'][$packageName]['version'])) { +return null; +} + +return self::$installed['versions'][$packageName]['version']; +} + + + + + +public static function getPrettyVersion($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) { +return null; +} + +return self::$installed['versions'][$packageName]['pretty_version']; +} + + + + + +public static function getReference($packageName) +{ +if (!isset(self::$installed['versions'][$packageName])) { +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + +if (!isset(self::$installed['versions'][$packageName]['reference'])) { +return null; +} + +return self::$installed['versions'][$packageName]['reference']; +} + + + + + +public static function getRootPackage() +{ +return self::$installed['root']; +} + + + + + + + +public static function getRawData() +{ +return self::$installed; +} + + + + + + + + + + + + + + + + + + + +public static function reload($data) +{ +self::$installed = $data; +} +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 7a91153b..fd407a3a 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -6,4 +6,6 @@ $baseDir = dirname($vendorDir); return array( + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', ); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 5a823eee..519a94fc 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -6,7 +6,12 @@ $baseDir = dirname($vendorDir); return array( + '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 23358168..93ad1a9d 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -8,17 +8,23 @@ return array( 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'), 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), + 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), + 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Symfony\\Component\\Serializer\\' => array($vendorDir . '/symfony/serializer'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), + 'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src', $vendorDir . '/league/oauth2-facebook/src'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), 'Google\\Auth\\' => array($vendorDir . '/google/auth/src'), 'Google\\AdsApi\\' => array($vendorDir . '/googleads/googleads-php-lib/src/Google/AdsApi'), 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), + 'FacebookAds\\' => array($vendorDir . '/facebook/php-business-sdk/src/FacebookAds'), 'Bramus\\Monolog\\' => array($vendorDir . '/bramus/monolog-colored-line-formatter/src'), 'Bramus\\Ansi\\' => array($vendorDir . '/bramus/ansi-php/src'), ); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 92963ba6..7bdd58e6 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -13,19 +13,24 @@ public static function loadClassLoader($class) } } + /** + * @return \Composer\Autoload\ClassLoader + */ public static function getLoader() { if (null !== self::$loader) { return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInit5e406f6a9ae827e5412c990fd060b3d8', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit5e406f6a9ae827e5412c990fd060b3d8', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; + require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8::getInitializer($loader)); } else { diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 6dbf07ef..224eda10 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,8 +7,13 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 { public static $files = array ( + '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', ); @@ -23,6 +28,10 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 ), 'S' => array ( + 'Symfony\\Polyfill\\Php72\\' => 23, + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, + 'Symfony\\Polyfill\\Intl\\Idn\\' => 26, + 'Symfony\\Polyfill\\Ctype\\' => 23, 'Symfony\\Component\\Serializer\\' => 29, ), 'P' => @@ -35,6 +44,10 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 array ( 'Monolog\\' => 8, ), + 'L' => + array ( + 'League\\OAuth2\\Client\\' => 21, + ), 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, @@ -46,6 +59,7 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 'F' => array ( 'Firebase\\JWT\\' => 13, + 'FacebookAds\\' => 12, ), 'B' => array ( @@ -65,6 +79,22 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), + 'Symfony\\Polyfill\\Php72\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', + ), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', + ), + 'Symfony\\Polyfill\\Intl\\Idn\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), 'Symfony\\Component\\Serializer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/serializer', @@ -85,6 +115,11 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), + 'League\\OAuth2\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/league/oauth2-client/src', + 1 => __DIR__ . '/..' . '/league/oauth2-facebook/src', + ), 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', @@ -109,6 +144,10 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), + 'FacebookAds\\' => + array ( + 0 => __DIR__ . '/..' . '/facebook/php-business-sdk/src/FacebookAds', + ), 'Bramus\\Monolog\\' => array ( 0 => __DIR__ . '/..' . '/bramus/monolog-colored-line-formatter/src', @@ -119,11 +158,17 @@ class ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8 ), ); + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + ); + public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit5e406f6a9ae827e5412c990fd060b3d8::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 5f049e59..c6683f26 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,946 +1,1666 @@ -[ - { - "name": "bramus/ansi-php", - "version": "3.0.1", - "version_normalized": "3.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/bramus/ansi-php.git", - "reference": "c0dcf9a949e1c6111bbbb52a8ead34776064b209" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bramus/ansi-php/zipball/c0dcf9a949e1c6111bbbb52a8ead34776064b209", - "reference": "c0dcf9a949e1c6111bbbb52a8ead34776064b209", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "time": "2015-01-08T15:02:37+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Bramus\\Ansi\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bramus Van Damme", - "email": "bramus@bram.us", - "homepage": "https://www.bram.us/" - } - ], - "description": "ANSI Control Functions and ANSI Control Sequences (Colors, Erasing, etc.) for PHP CLI Apps" - }, - { - "name": "bramus/monolog-colored-line-formatter", - "version": "2.0.3", - "version_normalized": "2.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/bramus/monolog-colored-line-formatter.git", - "reference": "6bff15eee00afe2690642535b0f1541f10852c2b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bramus/monolog-colored-line-formatter/zipball/6bff15eee00afe2690642535b0f1541f10852c2b", - "reference": "6bff15eee00afe2690642535b0f1541f10852c2b", - "shasum": "" - }, - "require": { - "bramus/ansi-php": "~3.0", - "php": ">=5.4.0" - }, - "require-dev": { - "monolog/monolog": "~1.0", - "phpunit/phpunit": "~4.0" - }, - "time": "2015-01-07T22:12:35+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Bramus\\Monolog\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bramus Van Damme", - "email": "bramus@bram.us", - "homepage": "https://www.bram.us/" - } - ], - "description": "Colored Line Formatter for Monolog" - }, - { - "name": "firebase/php-jwt", - "version": "v5.0.0", - "version_normalized": "5.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": " 4.8.35" - }, - "time": "2017-06-27T22:17:23+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt" - }, - { - "name": "google/auth", - "version": "v1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/google/google-auth-library-php.git", - "reference": "da0062d279c9459350808a4fb63dbc08b90d6b90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/google/google-auth-library-php/zipball/da0062d279c9459350808a4fb63dbc08b90d6b90", - "reference": "da0062d279c9459350808a4fb63dbc08b90d6b90", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "~5.3.1|~6.0", - "guzzlehttp/psr7": "~1.2", - "php": ">=5.4", - "psr/cache": "^1.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.11", - "guzzlehttp/promises": "0.1.1|^1.3", - "phpunit/phpunit": "^4.8.36|^5.7", - "sebastian/comparator": ">=1.2.3" - }, - "time": "2018-01-24T18:28:42+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Google\\Auth\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Auth Library for PHP", - "homepage": "http://github.com/google/google-auth-library-php", - "keywords": [ - "Authentication", - "google", - "oauth2" - ] - }, - { - "name": "googleads/googleads-php-lib", - "version": "34.0.0", - "version_normalized": "34.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/googleads/googleads-php-lib.git", - "reference": "7f086c308c3abd9198a64d70da7302085c73b19d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleads/googleads-php-lib/zipball/7f086c308c3abd9198a64d70da7302085c73b19d", - "reference": "7f086c308c3abd9198a64d70da7302085c73b19d", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-soap": "*", - "google/auth": "^1.0.0", - "guzzlehttp/guzzle": "^6.0", - "guzzlehttp/psr7": "^1.2", - "monolog/monolog": "^1.17.1", - "php": ">=5.5.9", - "phpdocumentor/reflection-docblock": "^4.0.0 || ^3.0.3", - "symfony/serializer": "^2.8.0 || ^3.0.3 || ^4.0.0" - }, - "require-dev": { - "php": ">=5.5.17", - "phpunit/phpunit": "^4.8.35 || ^5.7", - "squizlabs/php_codesniffer": "^2.9 || ^3.2" - }, - "suggest": { - "php-64bit": ">=5.5.9" - }, - "time": "2018-03-28T06:13:06+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Google\\AdsApi\\": "src/Google/AdsApi/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "authors": [ - { - "name": "Google", - "homepage": "https://github.com/googleads/googleads-php-lib/contributors" - } - ], - "description": "Google Ads APIs Client Library for PHP (AdWords and DFP)", - "homepage": "https://github.com/googleads/googleads-php-lib" - }, - { - "name": "guzzlehttp/guzzle", - "version": "6.3.2", - "version_normalized": "6.3.2.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/68d0ea14d5a3f42a20e87632a5f84931e2709c90", - "reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90", - "shasum": "" - }, - "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4", - "psr/log": "^1.0" - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "time": "2018-03-26T16:33:04+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.3-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ] - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "version_normalized": "1.3.1.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" - }, - "time": "2016-12-20T10:07:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ] - }, - { - "name": "guzzlehttp/psr7", - "version": "1.4.2", - "version_normalized": "1.4.2.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "time": "2017-03-20T17:10:46+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "request", - "response", - "stream", - "uri", - "url" - ] - }, - { - "name": "monolog/monolog", - "version": "1.23.0", - "version_normalized": "1.23.0.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", - "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" - }, - "time": "2017-06-19T01:22:40+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ] - }, - { - "name": "phpdocumentor/reflection-common", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "time": "2017-09-11T18:02:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" +{ + "packages": [ + { + "name": "bramus/ansi-php", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/bramus/ansi-php.git", + "reference": "fb0be33f36053af7454d462e3ddc0a2ac0b2f311" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bramus/ansi-php/zipball/fb0be33f36053af7454d462e3ddc0a2ac0b2f311", + "reference": "fb0be33f36053af7454d462e3ddc0a2ac0b2f311", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2019-12-03T09:04:38+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Bramus\\Ansi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bramus Van Damme", + "email": "bramus@bram.us", + "homepage": "https://www.bram.us/" + } + ], + "description": "ANSI Control Functions and ANSI Control Sequences (Colors, Erasing, etc.) for PHP CLI Apps", + "support": { + "issues": "https://github.com/bramus/ansi-php/issues", + "source": "https://github.com/bramus/ansi-php/tree/master" + }, + "install-path": "../bramus/ansi-php" + }, + { + "name": "bramus/monolog-colored-line-formatter", + "version": "2.0.3", + "version_normalized": "2.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/bramus/monolog-colored-line-formatter.git", + "reference": "6bff15eee00afe2690642535b0f1541f10852c2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bramus/monolog-colored-line-formatter/zipball/6bff15eee00afe2690642535b0f1541f10852c2b", + "reference": "6bff15eee00afe2690642535b0f1541f10852c2b", + "shasum": "" + }, + "require": { + "bramus/ansi-php": "~3.0", + "php": ">=5.4.0" + }, + "require-dev": { + "monolog/monolog": "~1.0", + "phpunit/phpunit": "~4.0" + }, + "time": "2015-01-07T22:12:35+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Bramus\\Monolog\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bramus Van Damme", + "email": "bramus@bram.us", + "homepage": "https://www.bram.us/" + } + ], + "description": "Colored Line Formatter for Monolog", + "install-path": "../bramus/monolog-colored-line-formatter" + }, + { + "name": "facebook/php-business-sdk", + "version": "9.0.1", + "version_normalized": "9.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/facebook/facebook-php-business-sdk.git", + "reference": "7edcdcfcd551196c90246875f875dbb48d35cd98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/facebook-php-business-sdk/zipball/7edcdcfcd551196c90246875f875dbb48d35cd98", + "reference": "7edcdcfcd551196c90246875f875dbb48d35cd98", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.5 || ^7.0" + }, + "require-dev": { + "mockery/mockery": "1.3.3", + "phpunit/phpunit": "~8", + "symfony/finder": "~2.6" + }, + "time": "2020-11-17T23:35:14+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "FacebookAds\\": "src/FacebookAds/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "description": "PHP SDK for Facebook Business", + "homepage": "https://developers.facebook.com/", + "keywords": [ + "ads", + "business", + "facebook", + "instagram", + "page", + "sdk" + ], + "support": { + "source": "https://github.com/facebook/facebook-php-business-sdk/tree/9.0.1" + }, + "install-path": "../facebook/php-business-sdk" + }, + { + "name": "firebase/php-jwt", + "version": "v5.2.0", + "version_normalized": "5.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", + "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8 <=9" + }, + "time": "2020-03-25T18:49:23+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/master" + }, + "install-path": "../firebase/php-jwt" + }, + { + "name": "google/auth", + "version": "v1.14.3", + "version_normalized": "1.14.3.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "c1503299c779af0cbc99b43788f75930988852cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/c1503299c779af0cbc99b43788f75930988852cf", + "reference": "c1503299c779af0cbc99b43788f75930988852cf", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", + "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", + "guzzlehttp/psr7": "^1.2", + "php": ">=5.4", + "psr/cache": "^1.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "guzzlehttp/promises": "0.1.1|^1.3", + "kelvinmo/simplejwt": "^0.2.5", + "phpseclib/phpseclib": "^2", + "phpunit/phpunit": "^4.8.36|^5.7", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "time": "2020-10-16T21:33:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "http://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "support": { + "docs": "https://googleapis.github.io/google-auth-library-php/master/", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.14.3" + }, + "install-path": "../google/auth" + }, + { + "name": "googleads/googleads-php-lib", + "version": "34.0.0", + "version_normalized": "34.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/googleads/googleads-php-lib.git", + "reference": "7f086c308c3abd9198a64d70da7302085c73b19d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleads/googleads-php-lib/zipball/7f086c308c3abd9198a64d70da7302085c73b19d", + "reference": "7f086c308c3abd9198a64d70da7302085c73b19d", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-soap": "*", + "google/auth": "^1.0.0", + "guzzlehttp/guzzle": "^6.0", + "guzzlehttp/psr7": "^1.2", + "monolog/monolog": "^1.17.1", + "php": ">=5.5.9", + "phpdocumentor/reflection-docblock": "^4.0.0 || ^3.0.3", + "symfony/serializer": "^2.8.0 || ^3.0.3 || ^4.0.0" + }, + "require-dev": { + "php": ">=5.5.17", + "phpunit/phpunit": "^4.8.35 || ^5.7", + "squizlabs/php_codesniffer": "^2.9 || ^3.2" + }, + "suggest": { + "php-64bit": ">=5.5.9" + }, + "time": "2018-03-28T06:13:06+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\AdsApi\\": "src/Google/AdsApi/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Google", + "homepage": "https://github.com/googleads/googleads-php-lib/contributors" + } + ], + "description": "Google Ads APIs Client Library for PHP (AdWords and DFP)", + "homepage": "https://github.com/googleads/googleads-php-lib", + "install-path": "../googleads/googleads-php-lib" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "version_normalized": "6.5.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "time": "2020-06-16T21:01:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ] - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "4.3.0", - "version_normalized": "4.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", - "reference": "94fd0001232e47129dd3504189fa1c7225010d08", - "shasum": "" - }, - "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "doctrine/instantiator": "~1.0.5", - "mockery/mockery": "^1.0", - "phpunit/phpunit": "^6.4" - }, - "time": "2017-11-30T07:14:17+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, + "install-path": "../guzzlehttp/guzzle" + }, + { + "name": "guzzlehttp/promises", + "version": "1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "60d379c243457e073cff02bc323a2a86cb355631" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "time": "2020-09-30T07:37:28+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock." - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", - "version_normalized": "0.4.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" - }, - "time": "2017-07-14T14:27:02+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.0" + }, + "install-path": "../guzzlehttp/promises" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.7.0", + "version_normalized": "1.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2020-09-30T07:37:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ] - }, - { - "name": "psr/cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-08-06T20:24:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ] - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-08-06T14:39:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ] - }, - { - "name": "psr/log", - "version": "1.0.2", - "version_normalized": "1.0.2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-10-10T12:19:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ] - }, - { - "name": "symfony/serializer", - "version": "v3.4.6", - "version_normalized": "3.4.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/serializer.git", - "reference": "11bea1aebe9c8d506f47c01931b0df9f18629a8f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/11bea1aebe9c8d506f47c01931b0df9f18629a8f", - "reference": "11bea1aebe9c8d506f47c01931b0df9f18629a8f", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "phpdocumentor/type-resolver": "<0.2.1", - "symfony/dependency-injection": "<3.2", - "symfony/property-access": ">=3.0,<3.0.4|>=2.8,<2.8.4", - "symfony/property-info": "<3.1", - "symfony/yaml": "<3.4" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/cache": "~3.1|~4.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.2|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/property-access": "~2.8|~3.0|~4.0", - "symfony/property-info": "~3.1|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", - "psr/cache-implementation": "For using the metadata cache.", - "symfony/config": "For using the XML mapping loader.", - "symfony/http-foundation": "To use the DataUriNormalizer.", - "symfony/property-access": "For using the ObjectNormalizer.", - "symfony/property-info": "To deserialize relations.", - "symfony/yaml": "For using the default YAML mapping loader." - }, - "time": "2018-02-14T14:07:03+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Serializer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Serializer Component", - "homepage": "https://symfony.com" - }, - { - "name": "webmozart/assert", - "version": "1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "time": "2018-01-29T19:49:41+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ] - } -] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.7.0" + }, + "install-path": "../guzzlehttp/psr7" + }, + { + "name": "league/oauth2-client", + "version": "2.6.0", + "version_normalized": "2.6.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-client.git", + "reference": "badb01e62383430706433191b82506b6df24ad98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-client/zipball/badb01e62383430706433191b82506b6df24ad98", + "reference": "badb01e62383430706433191b82506b6df24ad98", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99", + "php": "^5.6 || ^7.0 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "time": "2020-10-28T02:03:40+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + ], + "description": "OAuth 2.0 Client Library", + "keywords": [ + "Authentication", + "SSO", + "authorization", + "identity", + "idp", + "oauth", + "oauth2", + "single sign on" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-client/issues", + "source": "https://github.com/thephpleague/oauth2-client/tree/2.6.0" + }, + "install-path": "../league/oauth2-client" + }, + { + "name": "league/oauth2-facebook", + "version": "2.0.3", + "version_normalized": "2.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-facebook.git", + "reference": "093cf588b9d508ee426c71d6bc68f138fe914ddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-facebook/zipball/093cf588b9d508ee426c71d6bc68f138fe914ddc", + "reference": "093cf588b9d508ee426c71d6bc68f138fe914ddc", + "shasum": "" + }, + "require": { + "league/oauth2-client": "^2.0", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "ext-json": "*", + "mockery/mockery": "~1.3.0", + "phpunit/phpunit": "^5.7|^6.0", + "squizlabs/php_codesniffer": "~3.0" + }, + "time": "2020-10-01T15:22:47+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sammy Kaye Powers", + "email": "me@sammyk.me", + "homepage": "http://www.sammyk.me" + } + ], + "description": "Facebook OAuth 2.0 Client Provider for The PHP League OAuth2-Client", + "keywords": [ + "Authentication", + "authorization", + "client", + "facebook", + "oauth", + "oauth2" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-facebook/issues", + "source": "https://github.com/thephpleague/oauth2-facebook/tree/2.0.3" + }, + "install-path": "../league/oauth2-facebook" + }, + { + "name": "monolog/monolog", + "version": "1.25.5", + "version_normalized": "1.25.5.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", + "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "php-parallel-lint/php-parallel-lint": "^1.0", + "phpunit/phpunit": "~4.5", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "time": "2020-07-23T08:35:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/1.25.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "install-path": "../monolog/monolog" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "version_normalized": "9.99.100.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2020-10-15T08:29:30+00:00", + "type": "library", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "install-path": "../paragonie/random_compat" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "time": "2020-06-27T09:03:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "install-path": "../phpdocumentor/reflection-common" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.4", + "version_normalized": "4.3.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", + "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", + "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.0.5", + "mockery/mockery": "^1.0", + "phpdocumentor/type-resolver": "0.4.*", + "phpunit/phpunit": "^6.4" + }, + "time": "2019-12-28T18:55:12+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x" + }, + "install-path": "../phpdocumentor/reflection-docblock" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.4.0", + "version_normalized": "1.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*" + }, + "time": "2020-09-17T18:55:26+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, + "install-path": "../phpdocumentor/type-resolver" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T20:24:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "install-path": "../psr/cache" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "install-path": "../psr/http-message" + }, + { + "name": "psr/log", + "version": "1.1.3", + "version_normalized": "1.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", + "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2020-03-23T09:12:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, + "install-path": "../psr/log" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "install-path": "../ralouphie/getallheaders" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.20.0", + "version_normalized": "1.20.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2020-10-23T14:02:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.20.0", + "version_normalized": "1.20.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", + "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-10-23T14:02:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-idn" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.20.0", + "version_normalized": "1.20.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "727d1096295d807c309fb01a851577302394c897" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", + "reference": "727d1096295d807c309fb01a851577302394c897", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-10-23T14:02:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-intl-normalizer" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.20.0", + "version_normalized": "1.20.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930", + "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2020-10-23T14:02:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.20.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php72" + }, + { + "name": "symfony/serializer", + "version": "v4.4.17", + "version_normalized": "4.4.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "5719c6d5913375e453efb51d168510cc848471ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/5719c6d5913375e453efb51d168510cc848471ff", + "reference": "5719c6d5913375e453efb51d168510cc848471ff", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "phpdocumentor/type-resolver": "<0.2.1", + "symfony/dependency-injection": "<3.4", + "symfony/property-access": "<3.4", + "symfony/property-info": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "doctrine/cache": "~1.0", + "phpdocumentor/reflection-docblock": "^3.2|^4.0", + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4.13|~4.0|^5.0", + "symfony/validator": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", + "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "psr/cache-implementation": "For using the metadata cache.", + "symfony/config": "For using the XML mapping loader.", + "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", + "symfony/property-access": "For using the ObjectNormalizer.", + "symfony/property-info": "To deserialize relations.", + "symfony/yaml": "For using the default YAML mapping loader." + }, + "time": "2020-11-25T11:55:08+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Serializer Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v4.4.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/serializer" + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "version_normalized": "1.9.1.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "time": "2020-07-08T17:02:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozart/assert/issues", + "source": "https://github.com/webmozart/assert/tree/master" + }, + "install-path": "../webmozart/assert" + } + ], + "dev": true +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 00000000..8e339299 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,272 @@ + + array ( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'aliases' => + array ( + ), + 'reference' => '047c8545016c74d510c1503cbf9eb4563ef1915a', + 'name' => '__root__', + ), + 'versions' => + array ( + '__root__' => + array ( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'aliases' => + array ( + ), + 'reference' => '047c8545016c74d510c1503cbf9eb4563ef1915a', + ), + 'bramus/ansi-php' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => 'fb0be33f36053af7454d462e3ddc0a2ac0b2f311', + ), + 'bramus/monolog-colored-line-formatter' => + array ( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '6bff15eee00afe2690642535b0f1541f10852c2b', + ), + 'facebook/php-business-sdk' => + array ( + 'pretty_version' => '9.0.1', + 'version' => '9.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '7edcdcfcd551196c90246875f875dbb48d35cd98', + ), + 'firebase/php-jwt' => + array ( + 'pretty_version' => 'v5.2.0', + 'version' => '5.2.0.0', + 'aliases' => + array ( + ), + 'reference' => 'feb0e820b8436873675fd3aca04f3728eb2185cb', + ), + 'google/auth' => + array ( + 'pretty_version' => 'v1.14.3', + 'version' => '1.14.3.0', + 'aliases' => + array ( + ), + 'reference' => 'c1503299c779af0cbc99b43788f75930988852cf', + ), + 'googleads/googleads-php-lib' => + array ( + 'pretty_version' => '34.0.0', + 'version' => '34.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '7f086c308c3abd9198a64d70da7302085c73b19d', + ), + 'guzzlehttp/guzzle' => + array ( + 'pretty_version' => '6.5.5', + 'version' => '6.5.5.0', + 'aliases' => + array ( + ), + 'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e', + ), + 'guzzlehttp/promises' => + array ( + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '60d379c243457e073cff02bc323a2a86cb355631', + ), + 'guzzlehttp/psr7' => + array ( + 'pretty_version' => '1.7.0', + 'version' => '1.7.0.0', + 'aliases' => + array ( + ), + 'reference' => '53330f47520498c0ae1f61f7e2c90f55690c06a3', + ), + 'league/oauth2-client' => + array ( + 'pretty_version' => '2.6.0', + 'version' => '2.6.0.0', + 'aliases' => + array ( + ), + 'reference' => 'badb01e62383430706433191b82506b6df24ad98', + ), + 'league/oauth2-facebook' => + array ( + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '093cf588b9d508ee426c71d6bc68f138fe914ddc', + ), + 'monolog/monolog' => + array ( + 'pretty_version' => '1.25.5', + 'version' => '1.25.5.0', + 'aliases' => + array ( + ), + 'reference' => '1817faadd1846cd08be9a49e905dc68823bc38c0', + ), + 'paragonie/random_compat' => + array ( + 'pretty_version' => 'v9.99.100', + 'version' => '9.99.100.0', + 'aliases' => + array ( + ), + 'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a', + ), + 'phpdocumentor/reflection-common' => + array ( + 'pretty_version' => '2.2.0', + 'version' => '2.2.0.0', + 'aliases' => + array ( + ), + 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', + ), + 'phpdocumentor/reflection-docblock' => + array ( + 'pretty_version' => '4.3.4', + 'version' => '4.3.4.0', + 'aliases' => + array ( + ), + 'reference' => 'da3fd972d6bafd628114f7e7e036f45944b62e9c', + ), + 'phpdocumentor/type-resolver' => + array ( + 'pretty_version' => '1.4.0', + 'version' => '1.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0', + ), + 'psr/cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', + ), + 'psr/http-message' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + ), + 'psr/http-message-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.3', + 'version' => '1.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '0f73288fd15629204f9d42b7055f72dacbe811fc', + ), + 'psr/log-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0.0', + ), + ), + 'ralouphie/getallheaders' => + array ( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'aliases' => + array ( + ), + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => 'f4ba089a5b6366e453971d3aad5fe8e897b37f41', + ), + 'symfony/polyfill-intl-idn' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => '3b75acd829741c768bc8b1f84eb33265e7cc5117', + ), + 'symfony/polyfill-intl-normalizer' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => '727d1096295d807c309fb01a851577302394c897', + ), + 'symfony/polyfill-php72' => + array ( + 'pretty_version' => 'v1.20.0', + 'version' => '1.20.0.0', + 'aliases' => + array ( + ), + 'reference' => 'cede45fcdfabdd6043b3592e83678e42ec69e930', + ), + 'symfony/serializer' => + array ( + 'pretty_version' => 'v4.4.17', + 'version' => '4.4.17.0', + 'aliases' => + array ( + ), + 'reference' => '5719c6d5913375e453efb51d168510cc848471ff', + ), + 'webmozart/assert' => + array ( + 'pretty_version' => '1.9.1', + 'version' => '1.9.1.0', + 'aliases' => + array ( + ), + 'reference' => 'bafc69caeb4d49c39fd0779086c03a3738cbb389', + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 00000000..fb9d296b --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,23 @@ += 70200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.'; +} + +$missingExtensions = array(); +extension_loaded('json') || $missingExtensions[] = 'json'; +extension_loaded('openssl') || $missingExtensions[] = 'openssl'; +extension_loaded('soap') || $missingExtensions[] = 'soap'; + +if ($missingExtensions) { + $issues[] = 'Your Composer dependencies require the following PHP extensions to be installed: ' . implode(', ', $missingExtensions); +} + +if ($issues) { + echo 'Composer detected issues in your platform:' . "\n\n" . implode("\n", $issues); + exit(104); +} diff --git a/vendor/facebook/php-business-sdk/.github/ISSUE_TEMPLATE.md b/vendor/facebook/php-business-sdk/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..7f47c835 --- /dev/null +++ b/vendor/facebook/php-business-sdk/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,3 @@ +# Facebook PHP Business SDK Issue +Since we want to handle bugs more efficiently, we've decided to close issue reporting in Github and move to our dedicated bug reporting channel. +If you encounter a bug with Business SDK (PHP), please report the issue at [our developer bug reporting channel](https://developers.facebook.com/support/bugs/). diff --git a/vendor/facebook/php-business-sdk/.gitignore b/vendor/facebook/php-business-sdk/.gitignore new file mode 100644 index 00000000..745892ff --- /dev/null +++ b/vendor/facebook/php-business-sdk/.gitignore @@ -0,0 +1,12 @@ +/local +/vendor +/composer.lock +/composer.local.* +/composer.phar +/coverage.clover +.DS_Store +/.idea +/builds +# VIM Swap Files # +*.swp +*.swo diff --git a/vendor/facebook/php-business-sdk/.travis.yml b/vendor/facebook/php-business-sdk/.travis.yml new file mode 100644 index 00000000..1c29d6ee --- /dev/null +++ b/vendor/facebook/php-business-sdk/.travis.yml @@ -0,0 +1,30 @@ +language: php + +dist: trusty + +php: + - 7.2 + - 7.3 + - 7.4 + - hhvm + +sudo: false + +install: + - composer self-update && composer --version + - composer install --dev --prefer-source + +script: + - vendor/bin/phpunit -v -c $PWD/test/phpunit-travis.xml --coverage-clover=coverage.clover + +after_script: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover coverage.clover + +notifications: + email: false + +matrix: + fast_finish: true + allow_failures: + - php: hhvm diff --git a/vendor/facebook/php-business-sdk/CHANGELOG.md b/vendor/facebook/php-business-sdk/CHANGELOG.md new file mode 100644 index 00000000..4dd5ee3c --- /dev/null +++ b/vendor/facebook/php-business-sdk/CHANGELOG.md @@ -0,0 +1,122 @@ +# Changelog + +All notable changes to this project will be documented in this file. + + +## Unreleased + +## v9.0.0 + + +### Added +- `delivery_category` field to Content for Conversions API. + +### Changed +- Add empty to the list of reserved keywords. +- Change empty value enum name in AdsPixelFirstPartyCookieStatusValues and AdsPixelDataUseSettingValues + +## v8.0.3 + +### Changed +- Fixed a normalization issue for zero values in CustomData in Conversions API +- Start passing in the appsecret_proof to Conversions API custom http_clients when an appsecret is set +- A Conversions API EventRequest custom http_client must now be an object instead of a class name + +## v8.0.2 + +### Added +- Added batching support to Conversions API. Create batched event requests by using BatchProcessor. + +### Added +- `lead_id` field to the Conversions API `user_data` section. +- Added HttpServiceInterface to enable the default request object to be overridden by a user-defined HTTP Request Service class. Can be used to create Conversions API event requests. + +## v8.0.1 + +### Added +- Added async support to Conversions API - Create event request promises by using EventRequestAsync. + +## v8.0.0 + +### Changed +- Graph API call upgrade to [v8.0](https://developers.facebook.com/docs/graph-api/changelog/version8.0) + +### Added +- `delivery_category` field in custom_data section for Conversions API(formerly Serverside API). + +## v7.0.2 +### Added +- Added support for data processing options in Serverside API. For more details see : https://developers.facebook.com/docs/marketing-apis/data-processing-options + +## v7.0.0 +### Changed +- Graph API call upgrade to [v7.0](https://developers.facebook.com/docs/graph-api/changelog/version7.0) + +## v6.0.2 +### Added +- Add support for custom properties in the Server-Side API + +## v6.0.0 +### Changed +- Graph API call upgrade to [v6.0](https://developers.facebook.com/docs/graph-api/changelog/version6.0) + +## v5.0.5 +### Added +- Server-side API added search_string to CustomData and fixed setLastName in UserData object. + +## v5.0.3 +### Added +- Added function `getHeaders` in RequestException class which provides header information +### Fixed +- Server Side API CustomData model normalization fix + +## v5.0.2 + +### Added + - Added `CrashRepoter`, more context available [here](https://developers.facebook.com/docs/business-sdk/guides/crash-reports) + +## v5.0.1 +### Added + - Added strongly typed Server-Side API for Web (https://developers.facebook.com/docs/marketing-api/facebook-pixel/server-side-api/using-the-api) + +## v5.0.0 +### Changed +- Graph API call upgrade to [v5.0](https://developers.facebook.com/docs/graph-api/changelog/version5.0) + +## v4.0.6 + +### Fixed + - Add back `source` param in `Adaccount->createAdVideo`. + +## v4.0.5 + +### Fixed + - Introduce `addUsersMultiKey` and `removeUsersMultiKey` in `CustomAudience` to still allow add users to `CustomAudience` with multiple keys after `CustomAudienceMultiKey` been deprecated. + +## v4.0.0 +### Changed +- Graph API call upgrade to [v4.0](https://developers.facebook.com/docs/graph-api/changelog/version4.0) + +## v3.3.1 +### Changed +- Remove list of API call from Business SDK, any [these APIs](https://developers.facebook.com/docs/graph-api/changelog/4-30-2019-endpoint-deprecations) included in Business SDK will be deprecated. + +## v3.3.0 +### Changed +- Graph API call upgrade to [v3.3](https://developers.facebook.com/docs/graph-api/changelog/version3.3) +### Deprecated +- Deprecated `parentID` in `AbstractCrudObject`. +- Deprecated `CustomAudienceMultiKey`, use class `CustomAudience` instead. +- Deprecated functions `create`, `read`, `update` in `AbstractCrudObject`. Check out our [recommended way](https://github.com/facebook/facebook-php-business-sdk#object-classes) to make API call. +***`read` will reset the object fields, while `getSelf` will get a new object.*** For example : + ``` + $async_job = $adaccount->getInsightsAsync($fields, $params); + + $async_job = $async_job->getSelf(); + + while (!$async_job->isComplete()) { + sleep(1); + $async_job = $async_job->getSelf(); + } + ``` + diff --git a/vendor/facebook/php-business-sdk/CODE_OF_CONDUCT.md b/vendor/facebook/php-business-sdk/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..0a45f9bd --- /dev/null +++ b/vendor/facebook/php-business-sdk/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +# Code of Conduct + +Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.facebook.com/codeofconduct) so that you can understand what actions will and will not be tolerated. diff --git a/vendor/facebook/php-business-sdk/CONTRIBUTING.md b/vendor/facebook/php-business-sdk/CONTRIBUTING.md new file mode 100644 index 00000000..6935e7f9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/CONTRIBUTING.md @@ -0,0 +1,45 @@ +# Contributing to Facebook Ads API SDK for PHP +We want to make contributing to this project as easy and transparent as +possible. + +## Code of Conduct +The code of conduct is described in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) + +## Our Development Process +The Facebook Ads API SDK for PHP is currently developed in Facebook's internal +repositories and then exported out to GitHub by a Facebook team member. We invite +you to submit pull requests directly to GitHub and, after review, these can be +merged into the project. + +## Pull Requests +We actively welcome your pull requests. + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. If you've changed APIs, update the documentation. +4. Ensure the test suite passes. +5. Make sure your code lints. +6. If you haven't already, complete the Contributor License Agreement ("CLA"). + +## Contributor License Agreement ("CLA") +In order to accept your pull request, we need you to submit a CLA. You only need +to do this once to work on any of Facebook's open source projects. + +Complete your CLA [here](https://code.facebook.com/cla) + +## Issues +Since we want to handle bugs more efficiently, we encourage you report bug to +our dedicated bug reporting channel. If you encounter a bug with Business SDK +(PHP), please report the issue at +[our developer bug reporting channel](https://developers.facebook.com/support/bugs/). + +Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe +disclosure of security bugs. In those cases, please go through the process +outlined on that page + +## Coding Style +Please follow [PHP Coding Standards](https://secure.phabricator.com/book/phabcontrib/article/php_coding_standards/) + +## License +By contributing to Facebook Ads API SDK for PHP, you agree that your contributions +will be licensed under the LICENSE file in the root directory of this source tree. diff --git a/vendor/facebook/php-business-sdk/DEVELOPER_GUIDE.md b/vendor/facebook/php-business-sdk/DEVELOPER_GUIDE.md new file mode 100644 index 00000000..ffb9bd4e --- /dev/null +++ b/vendor/facebook/php-business-sdk/DEVELOPER_GUIDE.md @@ -0,0 +1,495 @@ +# Facebook Ads SDK - Developer Guide + +## Introduction + +This guide assumes you have an app that has been whitelisted for the Facebook Ads API, that you have a fully working development environment with all required dependencies and that are ready to start coding. If you haven't done this, please see the [README](./README.md) file. + +We also assume you are somewhat familiar with namespaces in PHP. If not, we recommend you take some time to read the [namespace basics](http://www.php.net/manual/en/language.namespaces.basics.php) in the PHP Manual. + +You should also have the documentation for the [Facebook Marketing APIs](https://developers.facebook.com/docs/ads-api) available as you will need to refer to this to understand which combination of parameters are required for the different object types. + +## Bootstrapping +The classes within the Facebook Ads SDK are designed to be included using an autoloader compliant with the [PSR-4](http://www.php-fig.org/psr/psr-4/). If you are using [Composer](https://getcomposer.org/) to include dependencies, you will find an implementation available within the vendor folder. This guide assumes you are using this autoloader. + +```php + +To make any request to the Ads API, you will need to have a valid access token and the user has accepted the `ads_management` permission. + +## The Api Object + +The `FacebookAds\Api` object is the basis of the Ads SDK which encapsulates a `FacebookAds\Session` and is used to execute requests against the Graph API. + +An easy to use init method is provided: + +```php +use FacebookAds\Api; + +// Set the default application to be used with this session and register an instance of the Api object +Api::init('', '', ''); + +// The instace is now retrivable +$api = Api::instance(); +``` + +### Making requests to the Graph + +Generally you should not need to make requests to the Graph API directly as these calls are handled by the implementation of objects within the SDK. However, there may be some case where you do want to query the Graph directly. In this case, you can use the `call` method of the `Api` class which returns a `FacebookAds\Http\RequestInterface`, by default the registered class is `FacebookAds\Http\Request`: + +```php +$response = $api->call( + '/61405622', + Api::HTTP_METHOD_GET, + array('fields'=>'name') +); +var_dump($response->getContent()); +``` + +### Handling Multiple Access Tokens +The first time an `Api` object is instantiated, we store a static reference to that object within the `Api` class and this is used as the default instance within the SDK. This saves you from having to pass around a reference to an `Api` instance within your application. + +A common requirement amongst Facebook Ads API developers however is to be able to handle multiple sessions within a single script execution. For example, you may have a process which syncs updated objects for multiple app users into some local datastore. + +To enable this, we provide two ways to manage sessions. + +The first is by mutating the default instance used by the application. The default instance can be accessed using the method `Api::instance()`. You can also change the default instance using the static method `Api::setInstance($api)`. + +The second is to explicitly define the `Api` instance you want to use when querying the Graph. This is achieved by passing an instance to the constructor of any class that extends from `Object\AbstractCrudObject`. + +```php +use FacebookAds\Object\Ad; +$my_ad = new Ad($id, $parent_id=null, $api); +``` + +## Objects Types + + +### CRUD Objects +For any entity that can be directly queried from the Graph API we have provided classes which extend `Object\AbstractCrudObject`. This provides `create`, `read`, `update` and `delete` methods for the majority of these entities. However, in some cases the Graph API does not support all of these operations and you will receive an `\Exception` if you attempt to call an unsupported method. + +When setting class variables on an object of this type we perform some basic validation to ensure the field is a valid field and an `\Exception` will be thrown if a field name is not found within the [field definition](#field_definition) for that class. + +### Simple Objects +There is another set of entities which cannot be directly queried from the Graph such as an `AdPreview`. This type of object extends `Object\AbstractObject` which provides methods to access the response data. + +### Field definitions + +For each object type, we provide a class enumerating the available fields of that object. These can be found within the `FacebookAds\Object\Fields` namespace and provide a way to reference fields without using strings. You can alternatively use strings if you find this easier. + +For example, you can set the data of an object using the field definitions in the following way: + +```php +$someObject->setData(array( + MyObjectFields::ID => 1234, + MyObjectFields::NAME => 'My Name', +)); +``` + +Alternatively, you can use the string equivalent: + +```php +$someObject->setData(array( + 'id'=>1234, + 'name'=>'My Name', +)); +``` + +Similarly the same applies for direct assignation: + +```php +//Using field definitions: +$someObject->{SomeObjectFields::ID} = 123; + +//Equivalent to using the variable name directly: +$someObject->id = 123; +``` + +### The Cursor Class +When requesting multiple objects from the Graph, responses may be returned in pages of data which can be traversed using cursors. We encapsulate this information into a `Cursor` class which represents the set of objects in the current page along with information about how to access subsequent pages of objects. This class implements the `\Iterable` and `\Countable` interfaces. + +## Reading Objects + +### Reading a single object +To read an object from the Graph you will need its `id`. By default, only the `id` field of an object is queried and you should specify when reading an object the fields you need. It is not recommended that you request all fields unless you require them all. + +```php +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdAccountFields; + +$required_fields = array( + AdAccountFields::ID, + AdAccountFields::NAME, + AdAccountFields::DAILY_SPEND_LIMIT, +); + +$adaccount = (new AdAccount($id))->read($required_fields); +``` +See [Defining Default Fields](#default_fields) within the section about Extending the SDK for an example of how to avoid defining the fields you require every request. + + +### Reading multiple objects +We provide the static method `readIds($ids = array(...), $fields = array(...))` to enable you to request many objects of a single type and will return a `Cursor`: + +```php +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdAccountFields; + +$required_fields = array( + AdAccountFields::ID, + AdAccountFields::NAME, + AdAccountFields::DAILY_SPEND_LIMIT, +); +$account_ids = array('act_x', 'act_y'...) +$adaccounts = AdAccount::readIds($account_ids, $required_fields); +foreach($adaccounts as $account) { + echo $account->id."\n"; +} +``` + +## Creating Objects + +When creating objects on the Graph, they are generally created by making a POST request to an edge of a parent object. For example, ads are created using the endpoint `https://graph.facebook.com/act_123123/ads`. Therefore when creating an object, you must know the `id` of the parent object which is generally the id of an AdAccount. You should consult the [Facebook Developer Documentation](https://developers.facebook.com/docs/ads-api) to see which parent object to use. + +```php +use FacebookAds\Object\Ad; +use FacebookAds\Object\Fields\AdFields; + +$account_id = 'act_123123'; +$ad = new Ad($id=null, $account_id); + +$ad->setData(array( + AdFields::NAME => 'My Test Ad', + AdFields::ADSET_ID => $adset_id, +)); + +$ad->create(array( + Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED, +)); +echo $ad->{AdFields::ID}; +``` + +## Updating Objects + +When you mutate an AdObject, we record which variables have changed and make it easy for you to write these change to the Graph API by calling the `update` method. + +Please note that in some cases the variable name used to update an attribute of an entity differs from the one read from Graph API. Any variable you change will be included in the request to update an object an you will likely receive an `\Exception` if the field name is incorrect. Please consult the [Facebook Developer Documentation](https://developers.facebook.com/docs/ads-api) to see which fields are required. + +```php +use FacebookAds\Object\Ad; +use FacebookAds\Object\Fields\AdFields; + +$ad = new Ad($id); +$ad->name = 'Updated Name'; +$ad->update(); +``` + +## Deleting Objects + + +### Deleting a single object + +To delete an object, you only need call the `delete` method on an instance of that object. Note, you do not have had to have read the object from the Graph API, all you need is the `id` of the object. + +```php +use FacebookAds\Object\Ad; +use FacebookAds\Object\Fields\AdFields; + +$ad = new Ad($id); +$ad->delete(); +``` + +### Deleting multiple objects + +We provide the static method `deleteIds($ids = array(...))` to enable you to delete many objects at the same time. This method returns a boolean value and will only return `true` if all objects were successfully deleted. A return value of `false` means one or more failed to be deleted. Please also note that we do not verify the type of the `id` you have passed into this function. + +```php +use FacebookAds\Object\Ad; +$status = Ad::deleteIds($ids = array(...)); +``` + +### Save Helper + +On object that extends `AbstractCrudObject` you can call the `save` method which will call `create` if the object does not have a value for `id` set, or will call `update` a value is present. + + +## Connections + +Objects on the Graph API may also have connections. A connection provides a way to retrieve objects which relate to the current object, for example, you can retrieve all the ads relative to an ad account using the URL `https://graph.facebook.com/act_123123/ads`. + +For each connection an object has, we provide a helper method to retrieve its related objects. In the case of `ObjectObject\AdAccount` we provide several of these methods including `getAds($required_fields)` which will return a `Cursor` containing a page of `Object\Ad` objects. + +```php +use FacebookAds\Object\AdAccount; +$account = new AdAccount($id); +$ads = $account->getAds($fields = array('name'))); +foreach($ads as $ad) { + echo $ad->name."\n"; +} +``` + +You only need the `id` of the object on which you want to call a connection method, therefore you do not need to have read the object from the Graph API first. + +For cases where these helper methods are not available, see [Requesting Connections Without Helper Methods](#generic_connections). + +## Targeting + +Facebook's targeting can generally be broken down into [interests](https://developers.facebook.com/docs/reference/ads-api/interest-targeting), [demographics](https://developers.facebook.com/docs/reference/ads-api/demographic-targeting), [behaviors](https://developers.facebook.com/docs/reference/ads-api/behavior-targeting) and [geo targeting](https://developers.facebook.com/docs/reference/ads-api/targeting-specs/#location). Many of these need to be queried from the Graph API search endpoint. + +To query targeting using the Ads SDK, you can use the `Object\TargetingSearch` class. + +## Examples + +This set of examples will walk you through: + +1. Reading AdAccounts for a user +* Creating a Campaign +* Searching targeting criteria +* Creating an AdSet +* Creating an AdImage +* Creating an AdCreative +* Creating an Ad + +Examples can be found within the `examples/` folder of the SDK. This assumes you have bootstrap code with an access token: + +```php +read(array(AdUserFields::ID)); + +$accounts = $user->getAdAccounts(array( + AdAccountFields::ID, + AdAccountFields::NAME, +)); + +// Print out the accounts +echo "Accounts:\n"; +foreach($accounts as $account) { + echo $account->id . ' - ' .$account->name."\n"; +} + +// Grab the first account for next steps (you should probably choose one) +$account = (count($accounts)) ? $accounts->getObjects()[0] : null; +echo "\nUsing this account: "; +echo $account->id."\n"; +``` + +### 2. Creating a Campaign + +Now we have an `AdAccount` for the current user we can go ahead an create our [Campaign](https://developers.facebook.com/docs/reference/ads-api/adcampaign). All `ads` within your `campaign` should have the same objective. You can find the available objectives within the [`AdObjectives`](src/FacebookAds/Object/Values/AdObjectives.php) class. + +In the following example we create a paused campaign so your ads do not go live, however you can omit the status field if you want your ad to run. + +```php +use FacebookAds\Object\Campaign; +use FacebookAds\Object\Fields\CampaignFields; +use FacebookAds\Object\Values\AdObjectives; +use FacebookAds\Object\Values\AdBuyingTypes; + +$campaign = new Campaign(null, $account->id); +$campaign->setData(array( + CampaignFields::NAME => 'My First Campaign', + CampaignFields::OBJECTIVE => AdObjectives::LINK_CLICKS, +)); + +$campaign->create(array( + Campaign::STATUS_PARAM_NAME => Campaign::STATUS_PAUSED, +)); +echo "Campaign ID:".$campaign->id."\n"; +``` + + +### 3. Searching Targeting + +The final thing we need before creating an `Ad` is some targeting. Many attributes of targeting can be found defined in the developer documentation, however some categories need you to search, such as interests. For this, we provide the `TargetingSearch` class. + +```php +use FacebookAds\Object\TargetingSearch; +use FacebookAds\Object\Search\TargetingSearchTypes; + +$results = TargetingSearch::search( + $type = TargetingSearchTypes::INTEREST, + $class = null, + $query = 'facebook london', +); + +// we'll take the top result for now +$target = (count($results)) ? $results->getObjects()[0] : null; +echo "Using target: ".$target->name."\n"; +``` + +Targeting for the moment is expressed in the form of a multidimensional array: + +```php +$targeting = array( + 'geo_locations' => array( + 'countries' => array('GB'), + ), + 'interests' => array( + array( + 'id' => $target->id, + 'name'=>$target->name, + ), + ), +); +``` + + +### 4. Creating an AdSet + +An [`AdSet`](https://developers.facebook.com/docs/reference/ads-api/adset) is a set of [`Ad`](https://developers.facebook.com/docs/reference/ads-api/adgroup) objects and it is best practice to ensure all `Ad` objects within an `AdSet` have the same targeting. + +The `AdSet` holds the attributes about the duration of a campaign and the budget. When deciding a budget, you should also choose between `lifetime_budget` and `daily_budget`. + +```php +use FacebookAds\Object\AdSet; +use FacebookAds\Object\Fields\AdSetFields; +use FacebookAds\Object\Values\BillingEvents; +use FacebookAds\Object\Values\OptimizationGoals; + +$adset = new AdSet(null, $account->id); +$adset->setData(array( + AdSetFields::NAME => 'My First AdSet', + AdSetFields::CAMPAIGN_ID => $campaign->id, + AdSetFields::DAILY_BUDGET => '150', + AdSetFields::OPTIMIZATION_GOAL => OptimizationGoals::REACH, + AdSetFields::BILLING_EVENT => BillingEvents::IMPRESSIONS, + AdSetFields::BID_AMOUNT => 2, + AdSetFields::TARGETING => $targeting, + AdSetFields::START_TIME => + (new \DateTime("+1 week"))->format(\DateTime::ISO8601), + AdSetFields::END_TIME => + (new \DateTime("+2 week"))->format(\DateTime::ISO8601), +)); + +$adset->create(); +echo 'AdSet ID: '.$adset->id."\n"; +``` +### 5. Create an AdImage + +Now you have a `AdSet`, you will be able to create an `Ad`, however, first you will need to upload the image you want to use as part of the `AdCreative`. + +```php +use FacebookAds\Object\AdImage; +use FacebookAds\Object\Fields\AdImageFields; + +$image = new AdImage(null, $account->id); +$image->filename = SDK_DIR.'/test/misc/FB-f-Logo__blue_512.png'; + +$image->create(); +echo 'Image Hash: '.$image->hash."\n"; +``` + +### 6. Creating an AdCreative + +You can create an `AdCreative` in two ways. The first is by including a JSON object when creating an `Ad` and the second, which we will demonstrate here, is by explicitly creation an `AdCreative` and using its `id` when creating an `Ad`. + +```php +use FacebookAds\Object\AdCreative; +use FacebookAds\Object\Fields\AdCreativeFields; + +$creative = new AdCreative(null, $account->id); +$creative->setData(array( + AdCreativeFields::NAME => 'Sample Creative', + AdCreativeFields::TITLE => 'Welcome to the Jungle', + AdCreativeFields::BODY => 'We\'ve got fun \'n\' games', + AdCreativeFields::IMAGE_HASH => $image->hash, + AdCreativeFields::OBJECT_URL => 'http://www.example.com/', +)); + +$creative->create(); +echo 'Creative ID: '.$creative->id . "\n"; +``` + +### 7. Creating an Ad + +The final step is to create the [`Ad`](https://developers.facebook.com/docs/reference/ads-api/adgroup/). The `Ad` contains all of the information about bid, creative and targeting. It should also have the asme objective as the `Campaign` we created. + +```php +use FacebookAds\Object\Ad; +use FacebookAds\Object\Fields\AdFields; + +$ad = new Ad(null, $account->id); +$ad->setData(array( + AdFields::CREATIVE => array('creative_id' => $creative->id), + AdFields::NAME => 'My First Ad', + AdFields::ADSET_ID => $adset->id, +)); + +$ad->create(); +echo 'Ad ID:'.$ad->id."\n"; +``` +## Extending the SDK + +There are many scenarios in which you may want to extend the SDK, and when developing this SDK we attempted to balance extensibility with ease of use for new developers. + +### Defining Default Fields to Read +We noted earlier that by default no fields are requested when calling the `read` method of a class implementing `AbstractCrudObject`, however if you always require the same set of fields throughout your application we have provided a simple way to do this. + +Within your own namespace, you can extend the any class implementing `AbstractCrudObject` and override the static variable `$defaultReadFields` to be an array of fields you want to be read by default. You should try to not change the classes in the SDK directly as this may break forward compatibly. + +```php +namespace MyNamespace\Object; + +use FacebookAds\Object\Fields\AdAccountFields; + +class AdAccount extends FacebookAds\Object\AdAccount { + + protected static $defaultReadFields = array( + AdAccountFields::ID, + AdAccountFields::NAME, + AdAccountFields::DAILY_SPEND_LIMIT, + AdAccountFields::CURRENCY, + ); +} +``` + +Within your application, whenever you use an `AdAccount`, you should use the one within your namespace instead of the `FacebookAds` one. + +```php +use MyNamespace\Object\AdAccount; +$adaccount = (new AdAccount($id))->read(); +echo $adaccount->name; +``` + +### Requesting Connections Without Helper Methods + +As detailed in the [Connections](#connections) section, we provide helper methods to request objects relative to an object. However, in some cases these methods may not have been implemented, or if you have extended our based objects as in the example of [defining default fields to read](#default_fields), calling a connection helper method on a base object will return objects of the \FacebookAds namespace type. + +In this case, you can use our generic connection methods to retrieve the correct type of object for any class extending `AbstractCrudObject`. To enable this, we provide two methods, `getOneByConnection` and `getManyByConnection` or which the latter is the most commonly used. + +```php +use FacebookAds\Object\AdAccount; + +// Ad in your namespace which you have used to extend the +// FacebookAds\Object\Ad class +use MyNamespace\Object\Ad; + +$account = new AdAccount($id); +$my_adaccount_objects = $account->getManyByConnection( + Ad::className(), $fields = array(...), $params = array(...)); + +``` diff --git a/vendor/facebook/php-business-sdk/LICENSE b/vendor/facebook/php-business-sdk/LICENSE new file mode 100644 index 00000000..42f447b2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-present, Facebook, Inc. All rights reserved. + +You are hereby granted a non-exclusive, worldwide, royalty-free license to +use, copy, modify, and distribute this software in source code or binary +form for use in connection with the web services and APIs provided by +Facebook. + +As with any software that integrates with the Facebook platform, your use +of this software is subject to the Facebook Developer Principles and +Policies [http://developers.facebook.com/policy/]. This copyright notice +shall be included in all copies or substantial portions of the software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/vendor/facebook/php-business-sdk/README.md b/vendor/facebook/php-business-sdk/README.md new file mode 100644 index 00000000..46b72984 --- /dev/null +++ b/vendor/facebook/php-business-sdk/README.md @@ -0,0 +1,360 @@ +# Facebook Business SDK for PHP + +[![Packagist](https://img.shields.io/packagist/v/facebook/php-business-sdk.svg?style=flat-square)](https://packagist.org/packages/facebook/php-business-sdk) +[![License](https://img.shields.io/badge/license-Facebook%20Platform-blue.svg?style=flat-square)](https://github.com/facebook/facebook-php-business-sdk/blob/master/LICENSE) +[![Travis](https://img.shields.io/travis/facebook/facebook-php-business-sdk.svg?style=flat-square)](https://travis-ci.org/facebook/facebook-php-business-sdk) +[![Scrutinizer](https://img.shields.io/scrutinizer/g/facebook/facebook-php-business-sdk.svg?style=flat-square)](https://scrutinizer-ci.com/g/facebook/facebook-php-business-sdk) +[![Scrutinizer Coverage](https://img.shields.io/scrutinizer/coverage/g/facebook/facebook-php-business-sdk.svg?style=flat-square)](https://scrutinizer-ci.com/g/facebook/facebook-php-business-sdk) + +## Introduction + +The Facebook Business SDK is a one-stop shop to help our partners better serve their businesses. Partners are using multiple Facebook API's to server the needs of their clients. Adopting all these API's and keeping them up to date across the various platforms can be time consuming and ultimately prohibitive. For this reason Facebook has developed the Business SDK bundling many of its APIs into one SDK to ease implementation and upkeep. The Business SDK is an upgraded version of the Marketing API SDK that includes the Marketing API as well as many Facebook APIs from different platforms such as Pages, Business Manager, Instagram, etc. + +## Quick Start + +Business SDK Getting Started Guide + +## Pre-requisites + +### Register An App + +To get started with the SDK, you must have an app +registered on developers.facebook.com. + +To manage the Marketing API, please visit your + App Dashboard +and add the Marketing API product to your app. + +**IMPORTANT**: For security, it is recommended that you turn on 'App Secret +Proof for Server API calls' in your app's Settings->Advanced page. + +### Obtain An Access Token + +When someone connects with an app using Facebook Login and approves the request +for permissions, the app obtains an access token that provides temporary, secure +access to Facebook APIs. + +An access token is an opaque string that identifies a User, app, or Page. + +For example, to access the Marketing API, you need to generate a User access token +for your app and ask for the ``ads_management`` permission; to access Pages API, +you need to generate a Page access token for your app and ask for the ``manage_page`` permission. + +Refer to our + +Access Token Guide to learn more. + +For now, we can use the +Graph Explorer +to get an access token. + +## Installation + +The Facebook Business SDK requires PHP 5.6 or greater. + +### Composer + +The Facebook Business SDK uses composer to manage dependencies. Visit the composer documentation to learn how to install composer. + +Add the following to your `composer.json` file: + +```json +{ + "require": { + "facebook/php-business-sdk": "5.0.5" + } +} +``` +then install it through composer: + +```shell +php composer.phar install --no-dev +``` + +This SDK and its dependencies will be installed under `./vendor`. + +### Alternatives + +This repository is written following the [psr-4 autoloading standard](http://www.php-fig.org/psr/psr-4/). Any psr-4 compatible autoloader can be used. + +## Usage + +### Api main class + +The `FacebookAds\Api` object is the foundation of the Business SDK which encapsulates a `FacebookAds\Session` and is used to execute requests against the Graph API. + +To instantiate an Api object you will need a valid access token: +```php +use FacebookAds\Api; + +// Initialize a new Session and instantiate an Api object +Api::init($app_id, $app_secret, $access_token); + +// The Api object is now available through singleton +$api = Api::instance(); + +``` + +Once instantiated, the Api object will allow you to start making requests to the Graph API. + +### Fields names + +Due to the high number of field names in the Graph API existing objects, in order to facilitate your code maintainability, enum-like classes are provided. +These files are stored under the `FacebookAds/Object/Fields` directory. +You can access object properties in the same manner you would usually do in php: + +```php +use FacebookAds\Object\AdAccount; + +$account = new AdAccount(); +$account->name = 'My account name'; +echo $account->name; +``` + +or using the enums: + +```php +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdAccountFields; + +$account = new AdAccount(); +$account->{AdAccountFields::NAME} = 'My account name'; +echo $account->{AdAccountFields::NAME}; +``` + +### Object classes + +Facebook Ads entities are defined as classes under the `FacebookAds/Object` directory. + +#### Read Objects + +```php +use FacebookAds\Object\AdAccount; + +$account = (new AdAccount($account_id))->getSelf(); +``` + +For some objects, the Ads API doesn't return all available fields by default. The first argument of the object's read method is an array of field names to be requested. + +```php +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdAccountFields; + +$fields = array( + AdAccountFields::ID, + AdAccountFields::NAME, +); + +$account = (new AdAccount($account_id))->getSelf($fields); +``` +Requesting an high number of fields may cause the response time to visibly increase, you should always request only the fields you really need. + +#### Create Objects + +```php +use FacebookAds\Object\AdSet; +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdSetFields; + +$account_id = 'act_123123'; +$campaign_id = '123456'; + +$account = new AdAccount($account_id); +$adset = $account->createAdSet( + array(), + array( + AdSetFields::NAME => 'My Test AdSet', + AdSetFields::CAMPAIGN_ID => campaign_id, + AdSetFields::DAILY_BUDGET => 150, + AdSetFields::START_TIME => (new \DateTime("+1 week"))->format(\DateTime::ISO8601), + AdSetFields::END_TIME => (new \DateTime("+2 week"))->format(\DateTime::ISO8601), + AdSetFields::BILLING_EVENT => 'IMPRESSIONS', + AdSetFields::TARGETING => array('geo_locations' => array('countries' => array('US'))), + AdSetFields::BID_AMOUNT => '1000', + ) +); + +echo $adset->id; +``` + +#### Update Objects + +```php +use FacebookAds\Object\AdSet; +use FacebookAds\Object\Fields\AdSetFields; + +$ad_set_id = '123456'; + +$set = new AdSet($ad_set_id); +$fields = array( +); +$params = array( + AdSetFields::NAME => 'My new AdSet name', +); +$set->updateSelf($fields, $params); +``` + +#### Delete Objects + +```php +use FacebookAds\Object\AdSet; + +$ad_set_id = '123456'; + +$set = new AdSet($ad_set_id); +$set->deleteSelf(); +``` + +### Cursors + +Since the release of the Facebook Graph API 2.0, pagination is handled through [cursors](https://developers.facebook.com/docs/graph-api/using-graph-api/v2.2#paging). +Here cursors are defined as in `\FacebookAds\Cursor`. Cursors are generally returned from connection methods: + +```php +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\CampaignFields; + +$account = new AdAccount(''); +$cursor = $account->getCampaigns(['id','name']); + +// Loop over objects +foreach ($cursor as $campaign) { + echo $campaign->{CampaignFields::NAME}.PHP_EOL; +} + +// Access objects by index +if ($cursor->count() > 0) { + echo "The first campaign in the cursor is: ".$cursor[0]->{CampaignFields::NAME}.PHP_EOL; +} + +// Fetch the next page +$cursor->fetchAfter(); +// New Objects will be appended to the cursor +``` + +#### Implicit Fetching + +Whenever all object connected to a parent are required (carelessly from the number of HTTP requests) implicit fetching can help reducing the amount of code required. +If cursor has Implicit Fetching enabled, while iterating (foreach, Cursor::next(), Cursor::prev()) the page end is reached, the SDK will automatically fetch and append a new page, until cursor end. +Implicit Fetching will make you lose control of the number of HTTP request that will be sent and, for this reason, is disabled by default. +Implicit Fetching can be enabled for a specific cursor: + +```php +$cursor->setUseImplicitFetch(true); +``` + +Or globally: + +```php +use FacebookAds\Cursor; + +Cursor::setDefaultUseImplicitFetch(true); +``` + +#### Reverse Iterations + +Cursors are bi-directional, and can be iterated in reverse order: + +```php +use FacebookAds\Object\AbstractCrudObject; + +/** @var \FacebookAds\Cursor $cursor */ +$cursor->setUseImplicitFetch(true); + +$cursor->end(); +while ($cursor->valid()) { + echo $cursor->current()->{AbstractCrudObject::FIELD_ID}.PHP_EOL; + $cursor->prev(); +} + +``` + +## Tests + +The 'test' folder contains the test cases. These are logically divided in unit and integration tests. +Integration tests require an active Facebook Ad Account, a Facebook Application and a valid Access Token. + +Note: we are currently unable to securely and reliably run integration tests on a public CI system. Our integrations with Travis and Scrutinizer (including badges at the top of this file) include only unit tests. + + +### Install dependencies + +From the root folder run: + +```shell +php composer.phar install --dev +``` + +### Execute unit tests only + +```shell +./vendor/bin/phpunit -c test/phpunit-travis.xml +``` + +To run tests individually (be sure not to be pointing to an integration test file): + +```shell +./vendor/bin/phpunit -c test/phpunit-travis.xml path/to/class/file +``` + + +### Execute all tests (unit + integration) + +Setup your integration config: + +1 - Copy the config file template. + +```shell +cp test/config.php.dist test/config.php +``` + +2 - Edit `test/config.php` with your informations. + +Execute: + +```shell +./vendor/bin/phpunit -c test/ +``` + +To run tests individually: + +```shell +./vendor/bin/phpunit -c test/ path/to/class/file +``` + +## Debug + +If this SDK is not working as expected, it may be either a SDK issue or API issue. + +This can be identified by constructing a raw cURL request and seeing if the response is as expected + +for example: + +```php +require __DIR__ . '/vendor/autoload.php'; +use FacebookAds\Api; +use FacebookAds\Object\AdAccount; + +Api::init($app_id, $app_secret, $access_token); +$api = Api::instance(); + +use FacebookAds\Logger\CurlLogger; +$api->setLogger(new CurlLogger()); +$account = new AdAccount($account_id); +$account->read(array('id')); +``` + +When running this code, this cURL request will be printed to the console as: +``` +curl -G \ + -d 'fields=id' \ + -d 'access_token=' \ + https://graph.facebook.com/v3.1/ +``` + +## SDK Codegen +Our SDK is autogenerated from [SDK Codegen](https://github.com/facebook/facebook-business-sdk-codegen). If you want to learn more about how our SDK code is generated, please check this repository. + +## Issue +Since we want to handle bugs more efficiently, we've decided to close issue reporting in Github and move to our dedicated bug reporting channel. +If you encounter a bug with Business SDK (PHP), please report the issue at [our developer bug reporting channel](https://developers.facebook.com/support/bugs/). diff --git a/vendor/facebook/php-business-sdk/bin/clean_account.php b/vendor/facebook/php-business-sdk/bin/clean_account.php new file mode 100755 index 00000000..62c2318b --- /dev/null +++ b/vendor/facebook/php-business-sdk/bin/clean_account.php @@ -0,0 +1,111 @@ +#!/usr/bin/env php +getConfig(); + +Api::init($config->appId, $config->appSecret, $config->accessToken); + +if (in_array('--dump', $_SERVER['argv'])) { + Api::instance()->setLogger(new CurlLogger(STDERR)); +} + +$get_class_name = function($object) { + return (new ReflectionClass($object))->getShortName(); +}; + +$delete_object = function(AbstractCrudObject $object) use ($get_class_name) { + echo sprintf( + ' > Deleting %s %d', + $get_class_name($object), + $object->{AbstractCrudObject::FIELD_ID}).PHP_EOL; + + try { + $object->deleteSelf(); + } catch (Exception $e) { + echo sprintf(" > Deletion failed with %s: %s", + $get_class_name($e), + $e->getMessage()).PHP_EOL; + } +}; + +$clean_edge = function($cursor_provider) use ($get_class_name, $delete_object) { + try { + $cursor = call_user_func($cursor_provider); + if (!$cursor instanceof Cursor) { + throw new ErrorException(sprintf( + "Provider returned instance of %s", + $get_class_name($cursor))); + } + $cursor->setUseImplicitFetch(true); + foreach ($cursor as $object) { + if (!$object instanceof AbstractCrudObject) { + throw new ErrorException(sprintf( + "Provider returned instance of %s, not a CRUD object", + $get_class_name($object))); + } + + $trait = 'FacebookAds\Object\Traits\CannotDelete'; + if (in_array($trait, (new ReflectionClass($object))->getTraitNames())) { + break; + } + $delete_object($object); + } + } catch (Exception $e) { + echo sprintf(" > Edge iteration failed with %s: %s", + $get_class_name($e), + $e->getMessage()).PHP_EOL; + } +}; + +$account = new AdAccount($config->accountId); +$reflection = new ReflectionClass($account); + +foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + if ( + strncasecmp($method->getName(), 'get', 3) !== 0 + || preg_match('/@return\s+Cursor/', $method->getDocComment()) !== 1 + ) { + continue; + } + + echo sprintf(' > Fetching AdAccount::%s', $method->getName()).PHP_EOL; + $clean_edge($method->getClosure($account)); +} diff --git a/vendor/facebook/php-business-sdk/bin/create_phar.php b/vendor/facebook/php-business-sdk/bin/create_phar.php new file mode 100644 index 00000000..4a1582f7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/bin/create_phar.php @@ -0,0 +1,112 @@ +setSignatureAlgorithm(\Phar::SHA1); +if ($compress_gzip) { + $phar->compressFiles(\Phar::GZ); +} +$phar->startBuffering(); +$phar->addFile('LICENSE'); + +$finder = (new Finder())->files() + ->ignoreVCS(true) + ->name('*.php') + ->in('src'); + +foreach ($finder->getIterator() as $file) { + $phar->addFile($file); +} + +$stub = <<<'EOF' +setStub(sprintf($stub, $alias, $include_autoloader ? 1 : 0, $alias)); +$phar->stopBuffering(); diff --git a/vendor/facebook/php-business-sdk/bin/docsmith.php b/vendor/facebook/php-business-sdk/bin/docsmith.php new file mode 100755 index 00000000..c9ace69b --- /dev/null +++ b/vendor/facebook/php-business-sdk/bin/docsmith.php @@ -0,0 +1,68 @@ +#!/usr/bin/env php +isValidValue($action)) { + Runner::throwInvalidUsage("Unknown action {$action}"); +} + +$doc_path = $argv[2][0] == '/' + ? $argv[2] + : realpath($relative_path.'/'.$argv[2]); + +if (!file_exists($doc_path)) { + Runner::throwInvalidUsage("Can't open {$doc_path} for reading"); +} + +$opts = array_splice($argv, 3); +$options = new ArrayObject( + array_fill_keys(OptionsEnum::getInstance()->getValues(), false)); + +foreach ($opts as $opt) { + $opt = substr($opt, 1); + if (OptionsEnum::getInstance()->isValidValue($opt)) { + $options->offsetSet($opt, true); + } +} + +$runner = new Runner($doc_path, $action, $options); + +exit($runner->run()); diff --git a/vendor/facebook/php-business-sdk/bin/get_version.php b/vendor/facebook/php-business-sdk/bin/get_version.php new file mode 100755 index 00000000..cca0bafe --- /dev/null +++ b/vendor/facebook/php-business-sdk/bin/get_version.php @@ -0,0 +1,34 @@ +#!/usr/bin/env php +getDefaultGraphVersion()).PHP_EOL; diff --git a/vendor/facebook/php-business-sdk/composer.json b/vendor/facebook/php-business-sdk/composer.json new file mode 100644 index 00000000..58428b20 --- /dev/null +++ b/vendor/facebook/php-business-sdk/composer.json @@ -0,0 +1,27 @@ +{ + "name": "facebook/php-business-sdk", + "description": "PHP SDK for Facebook Business", + "type": "library", + "keywords": [ + "facebook", + "ads", + "business", + "sdk", + "instagram", + "page" + ], + "homepage": "https://developers.facebook.com/", + "require": { + "guzzlehttp/guzzle": "^6.5 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "~8", + "symfony/finder": "~2.6", + "mockery/mockery": "1.3.3" + }, + "autoload": { + "psr-4": { + "FacebookAds\\": "src/FacebookAds/" + } + } +} diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountActivityNode.php b/vendor/facebook/php-business-sdk/examples/AdAccountActivityNode.php new file mode 100644 index 00000000..4b38161f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountActivityNode.php @@ -0,0 +1,45 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new AdAccountActivity($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesEdge.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesEdge.php new file mode 100644 index 00000000..909ac807 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesEdge.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', +); +$params = array( +); +echo json_encode((new AdAccount($id))->getAdCreatives( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost.php new file mode 100644 index 00000000..eb27a85b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Promoted Post', + 'object_story_id' => '_', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateAdCreativeLinkAd.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateAdCreativeLinkAd.php new file mode 100644 index 00000000..f754d09d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateAdCreativeLinkAd.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('image_hash' => '','link' => 'https:\/\/facebook.com\/','message' => 'try it out')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateCarouselCallToActionAppInstall.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateCarouselCallToActionAppInstall.php new file mode 100644 index 00000000..b780752c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateCarouselCallToActionAppInstall.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Carousel app ad', + 'object_story_spec' => array('page_id' => '','link_data' => array('message' => 'My message','link' => 'http://www.example.com/appstoreurl','caption' => 'WWW.ITUNES.COM','name' => 'The link name','description' => 'The link description','child_attachments' => array(array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => ''))),array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => ''))),array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => ''))),array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => '')))),'multi_share_optimized' => true)), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdCallToActionAppInstall.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdCallToActionAppInstall.php new file mode 100644 index 00000000..b6a4164d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdCallToActionAppInstall.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('call_to_action' => array('type' => 'INSTALL_MOBILE_APP','value' => array('link' => '')),'image_hash' => '','link' => '','message' => 'Try it out')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdImageCrop.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdImageCrop.php new file mode 100644 index 00000000..a34f4e6b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateLinkAdImageCrop.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Image crop creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('image_crops' => array('100x100' => array(array(0,0),array(100,100))),'image_hash' => '','link' => '','message' => 'Ad message')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateMAIDPA.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateMAIDPA.php new file mode 100644 index 00000000..68e700d5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateMAIDPA.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Dynamic Ad Template Creative Sample', + 'object_story_spec' => array('page_id' => '','template_data' => array('call_to_action' => array('type' => 'INSTALL_MOBILE_APP','value' => array('link' => 'http://www.example.com/appstoreurl')),'message' => 'Test array(array(product.name | titleize))','link' => 'http://www.example.com/appstoreurl','name' => 'Headline array(array(product.price))','description' => 'Description array(array(product.description))')), + 'product_set_id' => '', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoLeadAd.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoLeadAd.php new file mode 100644 index 00000000..beb45125 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoLeadAd.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'object_story_spec' => array('page_id' => '','video_data' => array('link_description' => 'try it out','image_url' => '','video_id' => '','call_to_action' => array('type' => 'SIGN_UP','value' => array('link' => 'http:\/\/fb.me\/','lead_gen_form_id' => '')))), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoPageLikeAd.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoPageLikeAd.php new file mode 100644 index 00000000..3d66161d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPost2CreateVideoPageLikeAd.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'object_story_spec' => array('page_id' => '','video_data' => array('image_url' => '','video_id' => '','call_to_action' => array('type' => 'LIKE_PAGE','value' => array('page' => '')))), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreative.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreative.php new file mode 100644 index 00000000..99c72b9c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreative.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'object_story_id' => '_', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCanvas.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCanvas.php new file mode 100644 index 00000000..44ea52c1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCanvas.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'image_hash' => '', + 'object_story_spec' => array('page_id' => '','link_data' => array('image_hash' => '','link' => '','name' => 'Creative message','call_to_action' => array('type' => 'LEARN_MORE'))), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasDV.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasDV.php new file mode 100644 index 00000000..3e17a014 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasDV.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'object_story_spec' => array('page_id' => '','template_data' => array('format_option' => 'collection_video','link' => '','name' => 'English Creative title','message' => 'English Creative message','call_to_action' => array('type' => 'LEARN_MORE'),'retailer_item_ids' => array(0,0,0,0),'customization_rules_spec' => array(array('customization_spec' => array('language' => 'en_XX')),array('customization_spec' => array('language' => 'fr_XX'),'link' => '','name' => 'French Creative title','message' => 'French Creative message')))), + 'product_set_id' => '', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasImage.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasImage.php new file mode 100644 index 00000000..35e0ce7b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasImage.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'object_story_spec' => array('page_id' => '','link_data' => array('picture' => '','link' => '','name' => 'English Creative title','message' => 'English Creative message','call_to_action' => array('type' => 'LEARN_MORE'),'retailer_item_ids' => array(0,0,0,0),'customization_rules_spec' => array(array('customization_spec' => array('language' => 'en_XX')),array('customization_spec' => array('language' => 'fr_XX'),'picture' => '','link' => '','name' => 'French Creative title','message' => 'French Creative message')))), + 'product_set_id' => '', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasVideo.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasVideo.php new file mode 100644 index 00000000..d93e0b50 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeCustomizationCanvasVideo.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'object_story_spec' => array('page_id' => '','video_data' => array('video_id' => '','image_url' => '','title' => 'English Creative title','message' => 'English Creative message','call_to_action' => array('type' => 'LEARN_MORE','value' => array('link' => '')),'retailer_item_ids' => array(0,0,0,0),'customization_rules_spec' => array(array('customization_spec' => array('language' => 'en_XX')),array('customization_spec' => array('language' => 'fr_XX'),'video_id' => '','picture' => '','link' => '','name' => 'French Creative title','message' => 'French Creative message')))), + 'product_set_id' => '', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeLinkAd.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeLinkAd.php new file mode 100644 index 00000000..f754d09d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativeLinkAd.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('image_hash' => '','link' => 'https:\/\/facebook.com\/','message' => 'try it out')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativePageLike.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativePageLike.php new file mode 100644 index 00000000..1e69a18e --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAdCreativePageLike.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('image_hash' => '','link' => 'https:\/\/facebook.com\/','message' => 'Creative message','call_to_action' => array('type' => 'LIKE_PAGE','value' => array('page' => '')))), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAssetFeedSpec.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAssetFeedSpec.php new file mode 100644 index 00000000..18565e3a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateAssetFeedSpec.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Dynamic Ad Creative with Asset Feed Spec Sample', + 'object_story_spec' => array('page_id' => ''), + 'asset_feed_spec' => array('images' => array(array('hash' => '')),'bodies' => array(array('text' => 'Begin Your Adventure'),array('text' => 'Once a Trainer, always a Trainer.')),'titles' => array(array('text' => 'Level Up'),array('text' => 'Swipe to evolve')),'descriptions' => array(array('text' => 'First Dynamic Ad Creative Sample')),'ad_formats' => array('SINGLE_IMAGE'),'call_to_action_types' => array('SHOP_NOW'),'link_urls' => array(array('website_url' => 'https://www.example.com/')),'videos' => array()), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateCarouselCallToActionAppInstall.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateCarouselCallToActionAppInstall.php new file mode 100644 index 00000000..b780752c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateCarouselCallToActionAppInstall.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Carousel app ad', + 'object_story_spec' => array('page_id' => '','link_data' => array('message' => 'My message','link' => 'http://www.example.com/appstoreurl','caption' => 'WWW.ITUNES.COM','name' => 'The link name','description' => 'The link description','child_attachments' => array(array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => ''))),array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => ''))),array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => ''))),array('link' => 'http://www.example.com/appstoreurl','image_hash' => '','call_to_action' => array('type' => 'USE_MOBILE_APP','value' => array('app_link' => '')))),'multi_share_optimized' => true)), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateDynamicAdCustomization.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateDynamicAdCustomization.php new file mode 100644 index 00000000..7fcb1324 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateDynamicAdCustomization.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Dynamic Ad Template Creative Sample', + 'object_story_spec' => array('page_id' => '','template_data' => array('message' => 'English Test array(array(product.name | titleize))','link' => 'http://www.example.com/englishurl','name' => 'English Headline array(array(product.price))','description' => 'English Description array(array(product.description))','customization_rules_spec' => array(array('customization_spec' => array('language' => 'en_XX')),array('customization_spec' => array('language' => 'fr_XX'),'message' => 'French Test array(array(product.name | titleize))','link' => 'http://www.example.com/frenchurl','name' => 'French Headline array(array(product.price))','description' => 'French Description array(array(product.description))','template_url_spec' => array('web' => array('url' => 'http://www.example.com/frenchdeeplink')))))), + 'product_set_id' => '', + 'template_url_spec' => array('web' => array('url' => 'http://www.example.com/englishdeeplink')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdCallToActionAppInstall.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdCallToActionAppInstall.php new file mode 100644 index 00000000..b6a4164d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdCallToActionAppInstall.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('call_to_action' => array('type' => 'INSTALL_MOBILE_APP','value' => array('link' => '')),'image_hash' => '','link' => '','message' => 'Try it out')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdImageCrop.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdImageCrop.php new file mode 100644 index 00000000..a34f4e6b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdImageCrop.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Image crop creative', + 'object_story_spec' => array('page_id' => '','link_data' => array('image_crops' => array('100x100' => array(array(0,0),array(100,100))),'image_hash' => '','link' => '','message' => 'Ad message')), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdNotToPage.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdNotToPage.php new file mode 100644 index 00000000..230c7549 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateLinkAdNotToPage.php @@ -0,0 +1,52 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'title' => 'My title', + 'body' => 'My body', + 'object_url' => '', + 'link_url' => '', + 'image_hash' => '', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateMAIDPA.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateMAIDPA.php new file mode 100644 index 00000000..68e700d5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateMAIDPA.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Dynamic Ad Template Creative Sample', + 'object_story_spec' => array('page_id' => '','template_data' => array('call_to_action' => array('type' => 'INSTALL_MOBILE_APP','value' => array('link' => 'http://www.example.com/appstoreurl')),'message' => 'Test array(array(product.name | titleize))','link' => 'http://www.example.com/appstoreurl','name' => 'Headline array(array(product.price))','description' => 'Description array(array(product.description))')), + 'product_set_id' => '', +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoLeadAd.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoLeadAd.php new file mode 100644 index 00000000..beb45125 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoLeadAd.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'object_story_spec' => array('page_id' => '','video_data' => array('link_description' => 'try it out','image_url' => '','video_id' => '','call_to_action' => array('type' => 'SIGN_UP','value' => array('link' => 'http:\/\/fb.me\/','lead_gen_form_id' => '')))), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoPageLikeAd.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoPageLikeAd.php new file mode 100644 index 00000000..3d66161d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdCreativesPostCreateVideoPageLikeAd.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Sample Creative', + 'object_story_spec' => array('page_id' => '','video_data' => array('image_url' => '','video_id' => '','call_to_action' => array('type' => 'LIKE_PAGE','value' => array('page' => '')))), +); +echo json_encode((new AdAccount($id))->createAdCreative( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPost2CreateMAIA.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPost2CreateMAIA.php new file mode 100644 index 00000000..ce78dd22 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPost2CreateMAIA.php @@ -0,0 +1,55 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Mobile App Installs Ad Set', + 'daily_budget' => '1000', + 'bid_amount' => '2', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'APP_INSTALLS', + 'campaign_id' => '', + 'promoted_object' => array('application_id' => '','object_store_url' => ''), + 'targeting' => array('device_platforms' => array('mobile'),'facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US')),'publisher_platforms' => array('facebook','audience_network'),'user_os' => array('IOS')), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpa.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpa.php new file mode 100644 index 00000000..132b5d3f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpa.php @@ -0,0 +1,59 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'A CPA Ad Set', + 'campaign_id' => '', + 'daily_budget' => '5000', + 'start_time' => '2020-10-29T22:16:32-0700', + 'end_time' => '2020-11-05T22:16:32-0800', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'REACH', + 'bid_amount' => '1000', + 'promoted_object' => array('page_id' => ''), + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US'))), + 'user_os' => 'iOS', + 'publisher_platforms' => 'facebook', + 'device_platforms' => 'mobile', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpaAppEvents.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpaAppEvents.php new file mode 100644 index 00000000..175fa4bc --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostAdSetCreateCpaAppEvents.php @@ -0,0 +1,57 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'A CPA Ad Set optimized for App Events', + 'campaign_id' => '', + 'daily_budget' => '300', + 'start_time' => '2020-10-29T22:17:28-0700', + 'end_time' => '2020-11-05T22:17:28-0800', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'OFFSITE_CONVERSIONS', + 'bid_amount' => '100', + 'status' => 'PAUSED', + 'promoted_object' => array('application_id' => '','object_store_url' => '','custom_event_type' => 'PURCHASE'), + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US')),'user_os' => array('iOS')), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBehaviorTargeting.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBehaviorTargeting.php new file mode 100644 index 00000000..c3efff47 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBehaviorTargeting.php @@ -0,0 +1,53 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My AdSet', + 'optimization_goal' => 'REACH', + 'billing_event' => 'IMPRESSIONS', + 'bid_amount' => '2', + 'daily_budget' => '1000', + 'campaign_id' => '', + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US')),'behaviors' => array(array('id' => 6007101597783,'name' => 'Business Travelers'),array('id' => 6004386044572,'name' => 'Android Owners (All)'))), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBidMultiplier.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBidMultiplier.php new file mode 100644 index 00000000..4f4e08ea --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostBidMultiplier.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Adset with bid multiplier', + 'campaign_id' => '', + 'daily_budget' => '3000', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'OFFSITE_CONVERSIONS', + 'bid_amount' => '500', + 'bid_adjustments' => array('user_groups' => array('gender' => array('male' => 0.8,'female' => 1))), + 'promoted_object' => array('product_set_id' => '','custom_event_type' => 'ADD_TO_CART'), + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US'))), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAdSet.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAdSet.php new file mode 100644 index 00000000..3e26aa69 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAdSet.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First AdSet', + 'lifetime_budget' => '20000', + 'start_time' => '2020-10-29T22:15:36-0700', + 'end_time' => '2020-11-05T22:15:36-0800', + 'campaign_id' => '', + 'bid_amount' => '500', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'POST_ENGAGEMENT', + 'targeting' => array('age_min' => 20,'age_max' => 24,'behaviors' => array(array('id' => 6002714895372,'name' => 'All travelers')),'genders' => array(1),'geo_locations' => array('countries' => array('US'),'regions' => array(array('key' => '4081')),'cities' => array(array('key' => '777934','radius' => 10,'distance_unit' => 'mile'))),'interests' => array(array('id' => '','name' => '')),'life_events' => array(array('id' => 6002714398172,'name' => 'Newlywed (1 year)')),'facebook_positions' => array('feed'),'publisher_platforms' => array('facebook','audience_network')), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAudienceNetwork.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAudienceNetwork.php new file mode 100644 index 00000000..d8eb9b20 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateAudienceNetwork.php @@ -0,0 +1,53 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Ad Set', + 'optimization_goal' => 'LINK_CLICKS', + 'billing_event' => 'LINK_CLICKS', + 'bid_amount' => '2', + 'daily_budget' => '1000', + 'campaign_id' => '', + 'targeting' => array('device_platforms' => array('mobile'),'geo_locations' => array('countries' => array('US')),'publisher_platforms' => array('facebook','audience_network'),'facebook_positions' => array('feed')), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateCampaign.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateCampaign.php new file mode 100644 index 00000000..923354e6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostCreateCampaign.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My campaign', + 'objective' => 'LINK_CLICKS', + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDailyBudget20.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDailyBudget20.php new file mode 100644 index 00000000..39ef3f9e --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDailyBudget20.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Adset', + 'daily_budget' => '2000', + 'start_time' => '2020-10-22T22:17:00-0700', + 'end_time' => '2020-10-29T22:17:00-0700', + 'campaign_id' => '', + 'bid_amount' => '100', + 'billing_event' => 'LINK_CLICKS', + 'optimization_goal' => 'LINK_CLICKS', + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US'))), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDemographicTargeting.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDemographicTargeting.php new file mode 100644 index 00000000..52f36280 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostDemographicTargeting.php @@ -0,0 +1,55 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First AdSet', + 'daily_budget' => '10000', + 'bid_amount' => '300', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'REACH', + 'campaign_id' => '', + 'promoted_object' => array('page_id' => ''), + 'targeting' => array('facebook_positions' => array('feed'),'age_max' => 24,'age_min' => 20,'behaviors' => array(array('id' => 6002714895372,'name' => 'All travelers')),'device_platforms' => array('mobile'),'genders' => array(1),'geo_locations' => array('countries' => array('US'),'regions' => array(array('key' => '4081')),'cities' => array(array('key' => 777934,'radius' => 10,'distance_unit' => 'mile'))),'interests' => array(array('id' => '','name' => '')),'life_events' => array(array('id' => 6002714398172,'name' => 'Newlywed (1 year)')),'publisher_platforms' => array('facebook','audience_network')), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostInterestTargeting.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostInterestTargeting.php new file mode 100644 index 00000000..3f4e3ad6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostInterestTargeting.php @@ -0,0 +1,55 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First AdSet', + 'daily_budget' => '10000', + 'bid_amount' => '300', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'REACH', + 'campaign_id' => '', + 'promoted_object' => array('page_id' => ''), + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US'),'regions' => array(array('key' => '4081')),'cities' => array(array('key' => 777934,'radius' => 10,'distance_unit' => 'mile'))),'genders' => array(1),'age_max' => 24,'age_min' => 20,'publisher_platforms' => array('facebook','audience_network'),'device_platforms' => array('mobile'),'flexible_spec' => array(array('interests' => array(array('id' => '','name' => ''))))), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostLifetimeBudget200Duration10Days.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostLifetimeBudget200Duration10Days.php new file mode 100644 index 00000000..268b44bc --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostLifetimeBudget200Duration10Days.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Adset', + 'lifetime_budget' => '20000', + 'start_time' => '2020-10-22T22:17:10-0700', + 'end_time' => '2020-11-01T22:17:10-0800', + 'campaign_id' => '', + 'bid_amount' => '100', + 'billing_event' => 'LINK_CLICKS', + 'optimization_goal' => 'LINK_CLICKS', + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US')),'publisher_platforms' => array('facebook','audience_network')), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOfferClaim.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOfferClaim.php new file mode 100644 index 00000000..65c7dd13 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOfferClaim.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Offer Claim AdSet', + 'lifetime_budget' => '56000', + 'start_time' => '2020-10-22T22:16:51-0700', + 'end_time' => '2020-10-29T22:16:51-0700', + 'campaign_id' => '', + 'billing_event' => 'LINK_CLICKS', + 'optimization_goal' => 'LINK_CLICKS', + 'bid_amount' => '1000', + 'promoted_object' => array('page_id' => '','offer_id' => ''), + 'targeting' => array('geo_locations' => array('countries' => array('US')),'genders' => array(1),'age_min' => '25','age_max' => '55','facebook_positions' => array('feed')), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOptimizePostEngagement.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOptimizePostEngagement.php new file mode 100644 index 00000000..2f3f55bd --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostOptimizePostEngagement.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Adset', + 'lifetime_budget' => '20000', + 'start_time' => '2020-10-22T22:17:19-0700', + 'end_time' => '2020-11-01T22:17:19-0800', + 'campaign_id' => '', + 'bid_amount' => '500', + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'POST_ENGAGEMENT', + 'targeting' => array('facebook_positions' => array('feed'),'geo_locations' => array('countries' => array('US'),'regions' => array(array('key' => '4081')),'cities' => array(array('key' => 777934,'radius' => 10,'distance_unit' => 'mile'))),'genders' => array(1),'age_max' => 24,'age_min' => 20,'behaviors' => array(array('id' => 6002714895372,'name' => 'All travelers')),'life_events' => array(array('id' => 6002714398172,'name' => 'Newlywed (1 year)')),'publisher_platforms' => array('facebook'),'device_platforms' => array('desktop')), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPageLikes.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPageLikes.php new file mode 100644 index 00000000..f16e85a5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPageLikes.php @@ -0,0 +1,55 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Reach Ad Set', + 'optimization_goal' => 'REACH', + 'billing_event' => 'IMPRESSIONS', + 'bid_amount' => '2', + 'daily_budget' => '1000', + 'campaign_id' => '', + 'targeting' => array('geo_locations' => array('countries' => array('US')),'facebook_positions' => array('feed')), + 'status' => 'PAUSED', + 'promoted_object' => array('page_id' => ''), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPlacementTargeting.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPlacementTargeting.php new file mode 100644 index 00000000..e3fd8e57 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostPlacementTargeting.php @@ -0,0 +1,54 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My AdSet', + 'optimization_goal' => 'REACH', + 'billing_event' => 'IMPRESSIONS', + 'bid_amount' => '2', + 'daily_budget' => '1000', + 'campaign_id' => '', + 'targeting' => array('geo_locations' => array('countries' => array('US')),'publisher_platforms' => array('facebook'),'facebook_positions' => array('feed')), + 'promoted_object' => array('page_id' => ''), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostReach.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostReach.php new file mode 100644 index 00000000..82cdd895 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdSetsPostReach.php @@ -0,0 +1,55 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Reach Ad Set', + 'optimization_goal' => 'REACH', + 'billing_event' => 'IMPRESSIONS', + 'bid_amount' => '2', + 'daily_budget' => '1000', + 'campaign_id' => '', + 'targeting' => array('excluded_geo_locations' => array('regions' => array(array('key' => '3847'))),'geo_locations' => array('countries' => array('US')),'facebook_positions' => array('feed')), + 'status' => 'PAUSED', + 'promoted_object' => array('page_id' => ''), +); +echo json_encode((new AdAccount($id))->createAdSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdVideosPost.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdVideosPost.php new file mode 100644 index 00000000..9133cad4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdVideosPost.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'source' => '', +); +echo json_encode((new AdAccount($id))->createAdVideo( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelEdgeGetPixelCode.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelEdgeGetPixelCode.php new file mode 100644 index 00000000..84551cae --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelEdgeGetPixelCode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'code', +); +$params = array( +); +echo json_encode((new AdsPixel($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelsPost.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelsPost.php new file mode 100644 index 00000000..2ca3c934 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPixelsPost.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My WCA Pixel', +); +echo json_encode((new AdAccount($id))->createAdsPixel( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdsPost.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPost.php new file mode 100644 index 00000000..5ac40f25 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPost.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Ad', + 'adset_id' => '', + 'creative' => array('creative_id' => ''), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAd( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostAdsRedownload.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostAdsRedownload.php new file mode 100644 index 00000000..01e352ae --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostAdsRedownload.php @@ -0,0 +1,51 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My AdGroup with Redownload', + 'adset_id' => '', + 'creative' => array('creative_id' => ''), + 'redownload' => '1', + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAd( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostOfferClaim.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostOfferClaim.php new file mode 100644 index 00000000..f8b6e067 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostOfferClaim.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My New Offers Ad', + 'adset_id' => '', + 'creative' => array('object_story_spec' => array('page_id' => '','link_data' => array('offer_id' => '','link' => 'https:\/\/www.facebook.com\/','message' => 'Great Deal','name' => '30% off','image_hash' => ''))), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAd( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostTrackingPostEngagement.php b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostTrackingPostEngagement.php new file mode 100644 index 00000000..0913b671 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountAdsPostTrackingPostEngagement.php @@ -0,0 +1,51 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Ad', + 'adset_id' => '', + 'creative' => array('creative_id' => ''), + 'tracking_specs' => array('action.type' => 'post_engagement','post' => '','page' => ''), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($id))->createAd( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsEdge.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsEdge.php new file mode 100644 index 00000000..68bf77f3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsEdge.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', + 'objective', +); +$params = array( + 'effective_status' => array('ACTIVE','PAUSED'), +); +echo json_encode((new AdAccount($id))->getCampaigns( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostConversions.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostConversions.php new file mode 100644 index 00000000..04691ee3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostConversions.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Conversions Campaign', + 'objective' => 'CONVERSIONS', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostEventResponses.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostEventResponses.php new file mode 100644 index 00000000..918dd446 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostEventResponses.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Event Campaign', + 'objective' => 'EVENT_RESPONSES', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLeadGen.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLeadGen.php new file mode 100644 index 00000000..05dacbc7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLeadGen.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Lead generation campaign', + 'objective' => 'LEAD_GENERATION', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLinkClicks.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLinkClicks.php new file mode 100644 index 00000000..be60854e --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLinkClicks.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My campaign', + 'objective' => 'LINK_CLICKS', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLocalAwareness.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLocalAwareness.php new file mode 100644 index 00000000..db8a650a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostLocalAwareness.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Local ad campaign', + 'objective' => 'REACH', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIA.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIA.php new file mode 100644 index 00000000..41c6f2e9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIA.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Mobile App Installs Campaign', + 'objective' => 'APP_INSTALLS', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIDPA.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIDPA.php new file mode 100644 index 00000000..1a5b41b6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostMAIDPA.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'App Installs Campaign with Dynamic Product Ads', + 'objective' => 'APP_INSTALLS', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostOfferClaims.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostOfferClaims.php new file mode 100644 index 00000000..45f65c34 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostOfferClaims.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Offer Claims Campaign', + 'objective' => 'OFFER_CLAIMS', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPageLikes.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPageLikes.php new file mode 100644 index 00000000..90a0e610 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPageLikes.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Campaign', + 'objective' => 'PAGE_LIKES', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPostEngagement.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPostEngagement.php new file mode 100644 index 00000000..55671ccc --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostPostEngagement.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My First Campaign', + 'objective' => 'POST_ENGAGEMENT', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostStoreCampaign.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostStoreCampaign.php new file mode 100644 index 00000000..c6957e79 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostStoreCampaign.php @@ -0,0 +1,51 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Store Traffic Campaign', + 'objective' => 'STORE_VISITS', + 'promoted_object' => array('page_id' => ''), + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostVideoViews.php b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostVideoViews.php new file mode 100644 index 00000000..20390d6b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCampaignsPostVideoViews.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Video Views campaign', + 'objective' => 'VIDEO_VIEWS', + 'status' => 'PAUSED', + 'special_ad_categories' => array(), +); +echo json_encode((new AdAccount($id))->createCampaign( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdge.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdge.php new file mode 100644 index 00000000..28a7411c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdge.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'id', +); +$params = array( +); +echo json_encode((new AdAccount($id))->getCustomAudiences( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdgeDataSourceSubtype.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdgeDataSourceSubtype.php new file mode 100644 index 00000000..144ae7ab --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesEdgeDataSourceSubtype.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'data_source', + 'subtype', +); +$params = array( +); +echo json_encode((new AdAccount($id))->getCustomAudiences( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostCreateCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostCreateCustomAudience.php new file mode 100644 index 00000000..6872663f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostCreateCustomAudience.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My new Custom Audience', + 'subtype' => 'CUSTOM', + 'description' => 'People who purchased on my website', + 'customer_file_source' => 'USER_PROVIDED_ONLY', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicEventValueBasedLookalikeCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicEventValueBasedLookalikeCustomAudience.php new file mode 100644 index 00000000..b2ee9312 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicEventValueBasedLookalikeCustomAudience.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Value-Based lookalike from Pixel', + 'subtype' => 'LOOKALIKE', + 'lookalike_spec' => array('origin_event_sources' => array(array('id' => '','event_names' => array('AddToCart'))),'type' => 'custom_ratio','ratio' => 0.01,'country' => 'US'), +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicValueBasedLookalikeCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicValueBasedLookalikeCustomAudience.php new file mode 100644 index 00000000..2c1523ce --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostDynamicValueBasedLookalikeCustomAudience.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Value-Based lookalike from Pixel', + 'subtype' => 'LOOKALIKE', + 'lookalike_spec' => array('origin_event_sources' => array(array('id' => '')),'type' => 'custom_ratio','ratio' => 0.01,'country' => 'US'), +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformCustomAudienceMACARule.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformCustomAudienceMACARule.php new file mode 100644 index 00000000..32ca85b4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformCustomAudienceMACARule.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Test Website Custom Audience', + 'rule' => array('inclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'app')),'retention_seconds' => 8400,'filter' => array('operator' => 'and','filters' => array(array('field' => 'event','operator' => 'eq','value' => 'fb_mobile_purchase'))))))), + 'prefill' => '1', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAExclusions.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAExclusions.php new file mode 100644 index 00000000..2f3368c9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAExclusions.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Test Engagement Custom Audience', + 'rule' => array('inclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'page')),'retention_seconds' => 31536000,'filter' => array('operator' => 'and','filters' => array(array('field' => 'event','operator' => 'eq','value' => 'page_engaged')))))),'exclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'page')),'retention_seconds' => 31536000,'filter' => array('operator' => 'and','filters' => array(array('field' => 'event','operator' => 'eq','value' => 'page_cta_clicked'))))))), + 'prefill' => '1', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiFilters.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiFilters.php new file mode 100644 index 00000000..48aa57db --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiFilters.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Test Engagement Custom Audience', + 'rule' => array('inclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'page')),'retention_seconds' => 31536000,'filter' => array('operator' => 'and','filters' => array(array('field' => 'event','operator' => 'eq','value' => 'page_engaged'),array('field' => 'event','operator' => 'eq','value' => 'page_engaged'))))))), + 'prefill' => '1', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiPages.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiPages.php new file mode 100644 index 00000000..4e5e36e3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformECAMultiPages.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Test Engagement Custom Audience', + 'rule' => array('inclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'page'),array('id' => '','type' => 'page')),'retention_seconds' => 31536000,'filter' => array('operator' => 'and','filters' => array(array('field' => 'event','operator' => 'eq','value' => 'page_engaged'))))))), + 'prefill' => '1', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformEngagementCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformEngagementCustomAudience.php new file mode 100644 index 00000000..29dddc07 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformEngagementCustomAudience.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Test Engagement Custom Audience', + 'rule' => array('inclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'page')),'retention_seconds' => 31536000,'filter' => array('operator' => 'and','filters' => array(array('field' => 'event','operator' => 'eq','value' => 'page_engaged'))))))), + 'prefill' => '1', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformWebsiteCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformWebsiteCustomAudience.php new file mode 100644 index 00000000..05ce8046 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostPlatformWebsiteCustomAudience.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My Test Website Custom Audience', + 'rule' => array('inclusions' => array('operator' => 'or','rules' => array(array('event_sources' => array(array('id' => '','type' => 'pixel')),'retention_seconds' => 8400,'filter' => array('operator' => 'and','filters' => array(array('field' => 'url','operator' => 'i_contains','value' => 'shoes'))))))), + 'prefill' => '1', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedCustomAudience.php new file mode 100644 index 00000000..7447ad82 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedCustomAudience.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Value-Based Custom Audience', + 'subtype' => 'CUSTOM', + 'is_value_based' => '1', + 'customer_file_source' => 'PARTNER_PROVIDED_ONLY', +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedLookalikeCustomAudience.php b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedLookalikeCustomAudience.php new file mode 100644 index 00000000..6aca6c2f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountCustomAudiencesPostValueBasedLookalikeCustomAudience.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Value-Based lookalike', + 'subtype' => 'LOOKALIKE', + 'origin_audience_id' => '', + 'lookalike_spec' => array('type' => 'custom_ratio','ratio' => 0.01,'country' => 'US'), +); +echo json_encode((new AdAccount($id))->createCustomAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdge.php b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdge.php new file mode 100644 index 00000000..84b0d435 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdge.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'creative' => '', + 'ad_format' => '', +); +echo json_encode((new AdAccount($id))->getGeneratePreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeDesktopWithStoryId.php b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeDesktopWithStoryId.php new file mode 100644 index 00000000..58c1dac6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeDesktopWithStoryId.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'creative' => array('object_story_id' => '_'), + 'ad_format' => 'DESKTOP_FEED_STANDARD', +); +echo json_encode((new AdAccount($id))->getGeneratePreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeInstagramStandards.php b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeInstagramStandards.php new file mode 100644 index 00000000..b9a0cc15 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeInstagramStandards.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'creative' => array('instagram_actor_id' => '','object_story_spec' => array('link_data' => array('call_to_action' => array('type' => 'LEARN_MORE','value' => array('link' => '')),'caption' => 'www.example.com','image_hash' => '','link' => '','message' => 'Message'),'page_id' => '')), + 'ad_format' => 'INSTAGRAM_STANDARD', +); +echo json_encode((new AdAccount($id))->getGeneratePreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeMaiaWithObjectStorySpec.php b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeMaiaWithObjectStorySpec.php new file mode 100644 index 00000000..f1098b63 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountGeneratePreviewsEdgeMaiaWithObjectStorySpec.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'creative' => array('object_story_spec' => array('link_data' => array('call_to_action' => array('type' => 'USE_APP','value' => array('link' => '')),'description' => 'Description','link' => '','message' => 'Message','name' => 'Name','picture' => ''),'page_id' => '')), + 'ad_format' => 'MOBILE_FEED_STANDARD', +); +echo json_encode((new AdAccount($id))->getGeneratePreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountNode.php b/vendor/facebook/php-business-sdk/examples/AdAccountNode.php new file mode 100644 index 00000000..48894d8d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountNode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', +); +$params = array( +); +echo json_encode((new AdAccount($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostIphoneViewNoPurchase.php b/vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostIphoneViewNoPurchase.php new file mode 100644 index 00000000..46191d10 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostIphoneViewNoPurchase.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Iphone Product Audience', + 'product_set_id' => '', + 'inclusions' => array(array('retention_seconds' => 86400,'rule' => array('and' => array(array('event' => array('eq' => 'AddToCart')),array('userAgent' => array('i_contains' => 'iPhone')))))), + 'exclusions' => array(array('retention_seconds' => 172800,'rule' => array('event' => array('eq' => 'Purchase')))), +); +echo json_encode((new AdAccount($id))->createProductAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostNoPurchase.php b/vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostNoPurchase.php new file mode 100644 index 00000000..c72898ce --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountProductAudiencesPostNoPurchase.php @@ -0,0 +1,50 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Product Audience', + 'product_set_id' => '', + 'inclusions' => array(array('retention_seconds' => 86400,'rule' => array('event' => array('eq' => 'AddToCart'))),array('retention_seconds' => 72000,'rule' => array('event' => array('eq' => 'ViewContent')))), + 'exclusions' => array(array('retention_seconds' => 172800,'rule' => array('event' => array('eq' => 'Purchase')))), +); +echo json_encode((new AdAccount($id))->createProductAudience( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdAccountReachEstimate.php b/vendor/facebook/php-business-sdk/examples/AdAccountReachEstimate.php new file mode 100644 index 00000000..d9702fb9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdAccountReachEstimate.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'targeting_spec' => array('geo_locations' => array('countries' => array('US')),'age_min' => 20,'age_max' => 40), +); +echo json_encode((new AdAccount($id))->getReachEstimate( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignActivityNode.php b/vendor/facebook/php-business-sdk/examples/AdCampaignActivityNode.php new file mode 100644 index 00000000..a084e39e --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignActivityNode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'created_time', +); +$params = array( +); +echo json_encode((new AdSet($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignGroupActivityNode.php b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupActivityNode.php new file mode 100644 index 00000000..981dcf5c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupActivityNode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'time_created', +); +$params = array( +); +echo json_encode((new Campaign($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdge.php b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdge.php new file mode 100644 index 00000000..48d03bff --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdge.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', +); +$params = array( +); +echo json_encode((new Campaign($id))->getAds( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdgeAdgroupsWithStatusArchived.php b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdgeAdgroupsWithStatusArchived.php new file mode 100644 index 00000000..3871705c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsEdgeAdgroupsWithStatusArchived.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', +); +$params = array( + 'effective_status' => array('ARCHIVED'), +); +echo json_encode((new Campaign($id))->getAds( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsetsEdge.php b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsetsEdge.php new file mode 100644 index 00000000..7204404d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignGroupAdsetsEdge.php @@ -0,0 +1,51 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', + 'start_time', + 'end_time', + 'daily_budget', + 'lifetime_budget', +); +$params = array( +); +echo json_encode((new Campaign($id))->getAdSets( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignNode.php b/vendor/facebook/php-business-sdk/examples/AdCampaignNode.php new file mode 100644 index 00000000..82a55ebc --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignNode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'adset_schedule', +); +$params = array( +); +echo json_encode((new AdSet($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignPost.php b/vendor/facebook/php-business-sdk/examples/AdCampaignPost.php new file mode 100644 index 00000000..ce3f8d0e --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignPost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'bid_adjustments' => array('user_groups' => array('user_bucket' => array('event_sources' => array('',''),'1' => 0.1,'2' => 0.2,'3' => 0.3,'default' => array('gender' => array('male' => 0.99,'female' => 0.12))))), +); +echo json_encode((new AdSet($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCampaignPostAdsetUpdateCpa.php b/vendor/facebook/php-business-sdk/examples/AdCampaignPostAdsetUpdateCpa.php new file mode 100644 index 00000000..4909efa0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCampaignPostAdsetUpdateCpa.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'billing_event' => 'IMPRESSIONS', + 'optimization_goal' => 'LINK_CLICKS', + 'bid_amount' => '200', + 'targeting' => array('geo_locations' => array('countries' => array('US')),'facebook_positions' => array('feed')), +); +echo json_encode((new AdSet($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativeCreativeInsightsEdge.php b/vendor/facebook/php-business-sdk/examples/AdCreativeCreativeInsightsEdge.php new file mode 100644 index 00000000..f081dee8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativeCreativeInsightsEdge.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'creative_compass_scores', +); +$params = array( +); +echo json_encode((new AdCreative($id))->getCreativeInsights( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativeNode.php b/vendor/facebook/php-business-sdk/examples/AdCreativeNode.php new file mode 100644 index 00000000..0b148e51 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativeNode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'asset_feed_spec', +); +$params = array( +); +echo json_encode((new AdCreative($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativeNodeRead.php b/vendor/facebook/php-business-sdk/examples/AdCreativeNodeRead.php new file mode 100644 index 00000000..80d1c024 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativeNodeRead.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', + 'object_story_id', +); +$params = array( +); +echo json_encode((new AdCreative($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativeNodeReadInstagramPermalinkUrl.php b/vendor/facebook/php-business-sdk/examples/AdCreativeNodeReadInstagramPermalinkUrl.php new file mode 100644 index 00000000..d705139d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativeNodeReadInstagramPermalinkUrl.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'instagram_permalink_url', +); +$params = array( +); +echo json_encode((new AdCreative($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdge.php b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdge.php new file mode 100644 index 00000000..07f65a85 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdge.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'ad_format' => 'DESKTOP_FEED_STANDARD', + 'product_item_ids' => array(''), +); +echo json_encode((new AdCreative($id))->getPreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreview.php b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreview.php new file mode 100644 index 00000000..9a36d42d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreview.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'ad_format' => 'DESKTOP_FEED_STANDARD', +); +echo json_encode((new AdCreative($id))->getPreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAds.php b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAds.php new file mode 100644 index 00000000..07f65a85 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAds.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'ad_format' => 'DESKTOP_FEED_STANDARD', + 'product_item_ids' => array(''), +); +echo json_encode((new AdCreative($id))->getPreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAdsWithCustomizations.php b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAdsWithCustomizations.php new file mode 100644 index 00000000..3cf1b8f4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdCreativePreviewsEdgePreviewDynamicAdsWithCustomizations.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'ad_format' => 'DESKTOP_FEED_STANDARD', + 'product_item_ids' => array(''), + 'dynamic_customization' => array('language' => 'fr_XX','country' => 'FR'), +); +echo json_encode((new AdCreative($id))->getPreviews( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdgroupActivityNode.php b/vendor/facebook/php-business-sdk/examples/AdgroupActivityNode.php new file mode 100644 index 00000000..6cdb5d60 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdgroupActivityNode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'created_time', +); +$params = array( +); +echo json_encode((new AdgroupActivity($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeads.php b/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeads.php new file mode 100644 index 00000000..05a63d96 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeads.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new Ad($id))->getLeads( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsDPA.php b/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsDPA.php new file mode 100644 index 00000000..fceb4fe1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsDPA.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'field_data', + 'retailer_item_id', +); +$params = array( +); +echo json_encode((new Ad($id))->getLeads( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsFiltered.php b/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsFiltered.php new file mode 100644 index 00000000..98b9e04a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdgroupLeadsEdgeAdgroupLeadsFiltered.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'filtering' => array(array('field' => 'time_created','operator' => 'GREATER_THAN','value' => 1602826030)), +); +echo json_encode((new Ad($id))->getLeads( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdgroupPost.php b/vendor/facebook/php-business-sdk/examples/AdgroupPost.php new file mode 100644 index 00000000..fa540be6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdgroupPost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'My New Ad', +); +echo json_encode((new Ad($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdgroupPostUpdateStatus.php b/vendor/facebook/php-business-sdk/examples/AdgroupPostUpdateStatus.php new file mode 100644 index 00000000..c673cb81 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdgroupPostUpdateStatus.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'adgroup_status' => 'PAUSED', +); +echo json_encode((new Ad($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeAdCampaignInsights.php b/vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeAdCampaignInsights.php new file mode 100644 index 00000000..0b99548f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeAdCampaignInsights.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'impressions', +); +$params = array( + 'breakdown' => 'publisher_platform', +); +echo json_encode((new AdSet($id))->getInsights( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeStoreVisitsAdCampaignInsights.php b/vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeStoreVisitsAdCampaignInsights.php new file mode 100644 index 00000000..5cf446cd --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsInsightsEdgeStoreVisitsAdCampaignInsights.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'cost_per_store_visit_action', + 'store_visit_actions', +); +$params = array( +); +echo json_encode((new AdSet($id))->getInsights( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsPixelEventsPost.php b/vendor/facebook/php-business-sdk/examples/AdsPixelEventsPost.php new file mode 100644 index 00000000..3731d8df --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsPixelEventsPost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'data' => array(array('event_name' => 'PageView','event_time' => 1604520076,'user_data' => array('fbc' => 'fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890','fbp' => 'fb.1.1558571054389.1098115397','em' => '309a0a5c3e211326ae75ca18196d301a9bdbd1a882a4d2569511033da23f0abd'))), +); +echo json_encode((new AdsPixel($id))->createEvent( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsPixelEventsPostCustom.php b/vendor/facebook/php-business-sdk/examples/AdsPixelEventsPostCustom.php new file mode 100644 index 00000000..2570ae1a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsPixelEventsPostCustom.php @@ -0,0 +1,64 @@ +'; +$pixel_id = ''; + +$api = Api::init(null, null, $access_token); +$api->setLogger(new CurlLogger()); + +$user_data = (new UserData()) + ->setFbc('fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890') + // It is recommended to send Client IP and User Agent for ServerSide API Events. + ->setClientIpAddress($_SERVER['REMOTE_ADDR']) + ->setClientUserAgent($_SERVER['HTTP_USER_AGENT']) + ->setFbp('fb.1.1558571054389.1098115397') + ->setEmail('joe@eg.com'); + +$custom_data = (new CustomData()) + ->setCurrency('usd') + ->setValue(123.45); + +$event = (new Event()) + ->setEventName('Purchase') + ->setEventTime(time()) + ->setEventSourceUrl('http://jaspers-market.com/product/123') + ->setUserData($user_data) + ->setCustomData($custom_data); + +$events = array(); +array_push($events, $event); + +$request = (new EventRequest($pixel_id)) + ->setEvents($events); +$response = $request->execute(); +print_r($response); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsPixelNodeGetPixelCode.php b/vendor/facebook/php-business-sdk/examples/AdsPixelNodeGetPixelCode.php new file mode 100644 index 00000000..84551cae --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsPixelNodeGetPixelCode.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'code', +); +$params = array( +); +echo json_encode((new AdsPixel($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsEdge.php b/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsEdge.php new file mode 100644 index 00000000..4fdf10c6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsEdge.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'business' => '', +); +echo json_encode((new AdsPixel($id))->getSharedAccounts( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsPost.php b/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsPost.php new file mode 100644 index 00000000..08bd843d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAccountsPost.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'account_id' => '', + 'business' => '', +); +echo json_encode((new AdsPixel($id))->createSharedAccount( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAgenciesEdge.php b/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAgenciesEdge.php new file mode 100644 index 00000000..4e680c8c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/AdsPixelSharedAgenciesEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new AdsPixel($id))->getSharedAgencies( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostDestinationCatalog.php b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostDestinationCatalog.php new file mode 100644 index 00000000..092b677a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostDestinationCatalog.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Destination Catalog', + 'vertical' => 'destinations', +); +echo json_encode((new Business($id))->createOwnedProductCatalog( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostFlightCatalog.php b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostFlightCatalog.php new file mode 100644 index 00000000..8b7bdf13 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostFlightCatalog.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Flight Catalog', + 'vertical' => 'flights', +); +echo json_encode((new Business($id))->createOwnedProductCatalog( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostHotelCatalog.php b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostHotelCatalog.php new file mode 100644 index 00000000..56f668cd --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostHotelCatalog.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Hotel Catalog', + 'vertical' => 'hotels', +); +echo json_encode((new Business($id))->createOwnedProductCatalog( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostProductCatalog.php b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostProductCatalog.php new file mode 100644 index 00000000..5add52a0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/BusinessOwnedProductCatalogsPostProductCatalog.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Catalog', +); +echo json_encode((new Business($id))->createOwnedProductCatalog( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/CustomAudienceDelete.php b/vendor/facebook/php-business-sdk/examples/CustomAudienceDelete.php new file mode 100644 index 00000000..4763d150 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/CustomAudienceDelete.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new CustomAudience($id))->deleteSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/CustomAudienceNode.php b/vendor/facebook/php-business-sdk/examples/CustomAudienceNode.php new file mode 100644 index 00000000..1f143214 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/CustomAudienceNode.php @@ -0,0 +1,45 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new CustomAudience($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/CustomAudienceNodeReadRule.php b/vendor/facebook/php-business-sdk/examples/CustomAudienceNodeReadRule.php new file mode 100644 index 00000000..a027a5a5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/CustomAudienceNodeReadRule.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'name', + 'rule', +); +$params = array( +); +echo json_encode((new CustomAudience($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/CustomAudiencePost.php b/vendor/facebook/php-business-sdk/examples/CustomAudiencePost.php new file mode 100644 index 00000000..5c7436e9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/CustomAudiencePost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Updated Name for CA', +); +echo json_encode((new CustomAudience($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPost.php b/vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPost.php new file mode 100644 index 00000000..2ee1551f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'payload' => array('schema' => array('EMAIL','LOOKALIKE_VALUE'),'data' => array(array('9b431636bd164765d63c573c346708846af4f68fe3701a77a3bdd7e7e5166254',44.5),array('8cc62c145cd0c6dc444168eaeb1b61b351f9b1809a579cc9b4c9e9d7213a39ee',140),array('4eaf70b1f7a797962b9d2a533f122c8039012b31e0a52b34a426729319cb792a',0),array('98df8d46f118f8bef552b0ec0a3d729466a912577830212a844b73960777ac56',0.9))), +); +echo json_encode((new CustomAudience($id))->createUser( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPostCrossPlatform.php b/vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPostCrossPlatform.php new file mode 100644 index 00000000..0fff41f5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/CustomAudienceUsersPostCrossPlatform.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'payload' => array('schema' => array('EMAIL','MADID','APPUID','LOOKALIKE_VALUE'),'app_ids' => array(''),'data' => array(array('b36a83701f1c3191e19722d6f90274bc1b5501fe69ebf33313e440fe4b0fe210','6032d997-3ab0-4de0-aa16-8af0e5b482fb','1234567890','0.9'),array('2b3b2b9ce842ab8b6a6c614cb1f9604bb8a0d502d1af49c526b72b10894e95b5','B67385F8-9A82-4670-8C0A-6F9EA7513F5F','','0'),array('898628e28890f937bdf009391def42879c401a4bcf1b5fd24e738d9f5da8cbbb','','9876543210','0.4'))), +); +echo json_encode((new CustomAudience($id))->createUser( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/MultiPageFeedCreateThenDelete.php b/vendor/facebook/php-business-sdk/examples/MultiPageFeedCreateThenDelete.php new file mode 100644 index 00000000..124c576c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/MultiPageFeedCreateThenDelete.php @@ -0,0 +1,77 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +// Get page access token and page_id +$fields = array( + 'access_token', +); +$params = array( +); +$pages = (new User($id))->getAccounts( + $fields, + $params +); +$page_id = $pages[0]->id; +echo 'page_id: ' . $page_id . '\\n\\n'; + +// Switch access token to page access token +$api = Api::init($app_id, $app_secret, $pages[0]->access_token); +// Page feed create +$fields = array( +); +$params = array( + 'message' => 'This is a test value', +); +$pagepost = (new Page($page_id))->createFeed( + $fields, + $params +); +$pagepost_id = $pagepost->id; +echo 'pagepost_id: ' . $pagepost_id . '\\n\\n'; + +// Pagepost delete +$fields = array( +); +$params = array( +); +echo json_encode((new PagePost($pagepost_id))->deleteSelf( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/MultiPromoteYourPage.php b/vendor/facebook/php-business-sdk/examples/MultiPromoteYourPage.php new file mode 100644 index 00000000..63c312c9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/MultiPromoteYourPage.php @@ -0,0 +1,161 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +// User get +$fields = array( +); +$params = array( +); +$user = (new User($id))->getSelf( + $fields, + $params +); +$user_id = $user->id; +echo 'user_id: ' . $user_id . '\\n\\n'; + +// Get page access token and page_id +$fields = array( + 'access_token', +); +$params = array( +); +$pages = (new User($id))->getAccounts( + $fields, + $params +); +$page_id = $pages[0]->id; +echo 'page_id: ' . $page_id . '\\n\\n'; + +// Switch access token to page access token +$api = Api::init($app_id, $app_secret, $pages[0]->access_token); +// Page feed create +$fields = array( +); +$params = array( + 'message' => 'This is a test value', +); +$pagepost = (new Page($page_id))->createFeed( + $fields, + $params +); +$pagepost_id = $pagepost->id; +echo 'pagepost_id: ' . $pagepost_id . '\\n\\n'; + +// Switch access token back to user access token +$api = Api::init($app_id, $app_secret, $access_token); +// User adaccounts get +$fields = array( +); +$params = array( +); +$adaccounts = (new User($user_id))->getAdAccounts( + $fields, + $params +); +$adaccount_id = $adaccounts[0]->id; +echo 'adaccount_id: ' . $adaccount_id . '\\n\\n'; + +// AdCampaign create +$fields = array( +); +$params = array( + 'name' => 'My campaign', + 'objective' => 'LINK_CLICKS', + 'status' => 'PAUSED', +); +$adcampaign = (new AdAccount($adaccount_id))->createCampaign( + $fields, + $params +); +$adcampaign_id = $adcampaign->id; +echo 'adcampaign_id: ' . $adcampaign_id . '\\n\\n'; + +// AdSet create +$fields = array( +); +$params = array( + 'name' => 'My Reach Ad Set', + 'optimization_goal' => 'REACH', + 'billing_event' => 'IMPRESSIONS', + 'bid_amount' => '2', + 'daily_budget' => '1000', + 'campaign_id' => $adcampaign_id, + 'targeting' => array('geo_locations' => array('countries' => array('US'))), + 'status' => 'PAUSED', + 'promoted_object' => array('page_id' => $page_id), +); +$adset = (new AdAccount($adaccount_id))->createAdSet( + $fields, + $params +); +$adset_id = $adset->id; +echo 'adset_id: ' . $adset_id . '\\n\\n'; + +// AdCreative create page post +$fields = array( +); +$params = array( + 'name' => 'Sample Promoted Post', + 'object_story_id' => $page_id.'_'.$pagepost_id, +); +$adcreative = (new AdAccount($adaccount_id))->createAdCreative( + $fields, + $params +); +$adcreative_id = $adcreative->id; +echo 'adcreative_id: ' . $adcreative_id . '\\n\\n'; + +// AdGroup create +$fields = array( +); +$params = array( + 'name' => 'My Ad', + 'adset_id' => $adset_id, + 'creative' => array('creative_id' => $adcreative_id), + 'status' => 'PAUSED', +); +echo json_encode((new AdAccount($adaccount_id))->createAd( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/OfflineConversionsCreateOfflineSet.php b/vendor/facebook/php-business-sdk/examples/OfflineConversionsCreateOfflineSet.php new file mode 100644 index 00000000..c913ca66 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/OfflineConversionsCreateOfflineSet.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'offline_event_set', + 'description' => 'conversion data used for superbowl campaign', +); +echo json_encode((new Business($id))->createOfflineConversionDataSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageFeedEdge.php b/vendor/facebook/php-business-sdk/examples/PageFeedEdge.php new file mode 100644 index 00000000..b614f052 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageFeedEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new Page($id))->getFeed( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageFeedPost.php b/vendor/facebook/php-business-sdk/examples/PageFeedPost.php new file mode 100644 index 00000000..d20bb1ba --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageFeedPost.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'message' => 'This is a test value', +); +echo json_encode((new Page($id))->createFeed( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageFeedPostFeedImageDeepLink.php b/vendor/facebook/php-business-sdk/examples/PageFeedPostFeedImageDeepLink.php new file mode 100644 index 00000000..2f62635c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageFeedPostFeedImageDeepLink.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'message' => 'This is a test message', + 'call_to_action' => array('type' => 'BUY_NOW','value' => array('link' => '','app_link' => '')), +); +echo json_encode((new Page($id))->createFeed( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageNode.php b/vendor/facebook/php-business-sdk/examples/PageNode.php new file mode 100644 index 00000000..b3326088 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageNode.php @@ -0,0 +1,49 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( + 'location{latitude', + 'longitude}', + 'is_permanently_closed', +); +$params = array( + 'limit' => '30000', +); +echo json_encode((new Page($id))->getLocations( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageNodePageSearch.php b/vendor/facebook/php-business-sdk/examples/PageNodePageSearch.php new file mode 100644 index 00000000..6a7baa7c --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageNodePageSearch.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'type' => 'adradiussuggestion', + 'latitude' => '51.5152253', + 'longitude' => '-0.1423029', +); +echo json_encode((new Page($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePhotosEdge.php b/vendor/facebook/php-business-sdk/examples/PagePhotosEdge.php new file mode 100644 index 00000000..af640146 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePhotosEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new Page($id))->getPhotos( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePhotosPost.php b/vendor/facebook/php-business-sdk/examples/PagePhotosPost.php new file mode 100644 index 00000000..f2b8a00f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePhotosPost.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'url' => 'https://www.facebook.com/images/fb_icon_325x325.png', + 'published' => 'false', +); +echo json_encode((new Page($id))->createPhoto( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePictureEdge.php b/vendor/facebook/php-business-sdk/examples/PagePictureEdge.php new file mode 100644 index 00000000..8dbf0379 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePictureEdge.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'redirect' => '0', +); +echo json_encode((new Page($id))->getPicture( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostCommentsEdge.php b/vendor/facebook/php-business-sdk/examples/PagePostCommentsEdge.php new file mode 100644 index 00000000..3396c738 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostCommentsEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new PagePost($id))->getComments( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostCommentsPost.php b/vendor/facebook/php-business-sdk/examples/PagePostCommentsPost.php new file mode 100644 index 00000000..4f81e72b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostCommentsPost.php @@ -0,0 +1,47 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'message' => 'This is a test value', +); +echo json_encode((new PagePost($id))->createComment( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostDelete.php b/vendor/facebook/php-business-sdk/examples/PagePostDelete.php new file mode 100644 index 00000000..ec411ceb --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostDelete.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new PagePost($id))->deleteSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostNode.php b/vendor/facebook/php-business-sdk/examples/PagePostNode.php new file mode 100644 index 00000000..e0348fa5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostNode.php @@ -0,0 +1,45 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new PagePost($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostPost.php b/vendor/facebook/php-business-sdk/examples/PagePostPost.php new file mode 100644 index 00000000..3ab8b724 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostPost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'message' => 'This is a test value', +); +echo json_encode((new PagePost($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostsEdge.php b/vendor/facebook/php-business-sdk/examples/PagePostsEdge.php new file mode 100644 index 00000000..ec40efce --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostsEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new Page($id))->getPosts( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PagePostsEdgePagePostCreateCarousel.php b/vendor/facebook/php-business-sdk/examples/PagePostsEdgePagePostCreateCarousel.php new file mode 100644 index 00000000..10fac866 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PagePostsEdgePagePostCreateCarousel.php @@ -0,0 +1,51 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'message' => 'Browse our latest products', + 'published' => '0', + 'child_attachments' => array(array('link' => '','name' => 'Product 1','description' => '$4.99','image_hash' => ''),array('link' => '','name' => 'Product 2','description' => '$4.99','image_hash' => ''),array('link' => '','name' => 'Product 3','description' => '$4.99','image_hash' => ''),array('link' => '','name' => 'Product 4','description' => '$4.99','image_hash' => '')), + 'caption' => 'WWW.EXAMPLE.COM', + 'link' => 'http://www.example.com/products', +); +echo json_encode((new Page($id))->getPosts( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageRolesEdge.php b/vendor/facebook/php-business-sdk/examples/PageRolesEdge.php new file mode 100644 index 00000000..cc95077a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageRolesEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new Page($id))->getRoles( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/PageSubscribedAppsPost.php b/vendor/facebook/php-business-sdk/examples/PageSubscribedAppsPost.php new file mode 100644 index 00000000..b5fa35e7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/PageSubscribedAppsPost.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'subscribed_fields' => 'leadgen', +); +echo json_encode((new Page($id))->createSubscribedApp( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/ProductCatalogEventStatsEdge.php b/vendor/facebook/php-business-sdk/examples/ProductCatalogEventStatsEdge.php new file mode 100644 index 00000000..4b80dffd --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/ProductCatalogEventStatsEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new ProductCatalog($id))->getEventStats( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPost.php b/vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPost.php new file mode 100644 index 00000000..b70cc70a --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPost.php @@ -0,0 +1,56 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'hotel_id' => 'h_1', + 'name' => 'Sample Hotel', + 'description' => 'hotel description', + 'brand' => 'hotel brand', + 'url' => 'http://www.example.com/samplehotel', + 'images' => array(array('image_url' => 'https://www.example.com/pic1.jpg','tags' => array('front view','balcony')),array('image_url' => 'http://www.example.com/pic2.jpg','tags' => array('lobby view'))), + 'address' => array('street_address' => '1 Hacker Way','city' => 'Menlo Park','region' => 'California','country' => 'United States','postal_code' => '94025','neighborhoods' => array('Palo Alto','Menlo Park'),'latitude' => 37.484116,'longitude' => -122.148244), + 'guest_ratings' => array(array('score' => 7.8,'max_score' => 10,'rating_system' => 'sample_rating','number_of_raters' => 780)), + 'star_rating' => '4', + 'phone' => '+351234123456', +); +echo json_encode((new ProductCatalog($id))->createHotel( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPostUpdateHotelsCatalogSettings.php b/vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPostUpdateHotelsCatalogSettings.php new file mode 100644 index 00000000..94f67aa0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/ProductCatalogHotelsPostUpdateHotelsCatalogSettings.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'hotel_catalog_settings' => array('pull_config_id' => ''), +); +echo json_encode((new ProductCatalog($id))->updateSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/ProductCatalogProductFeedsPostProductFeed.php b/vendor/facebook/php-business-sdk/examples/ProductCatalogProductFeedsPostProductFeed.php new file mode 100644 index 00000000..af2634d0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/ProductCatalogProductFeedsPostProductFeed.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Feed', + 'schedule' => array('interval' => 'DAILY','url' => 'http://www.example.com/sample_feed.tsv','hour' => '22'), +); +echo json_encode((new ProductCatalog($id))->createProductFeed( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostHotelSet.php b/vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostHotelSet.php new file mode 100644 index 00000000..a75c4626 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostHotelSet.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Hotel Set', + 'filter' => array('brand' => array('i_contains' => 'sample brand')), +); +echo json_encode((new ProductCatalog($id))->createProductSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostProductSet.php b/vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostProductSet.php new file mode 100644 index 00000000..89fd15ba --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/ProductCatalogProductSetsPostProductSet.php @@ -0,0 +1,48 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( + 'name' => 'Test Set', + 'filter' => array('product_type' => array('i_contains' => 'shirt')), +); +echo json_encode((new ProductCatalog($id))->createProductSet( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/UserAccountsEdge.php b/vendor/facebook/php-business-sdk/examples/UserAccountsEdge.php new file mode 100644 index 00000000..821b35d4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/UserAccountsEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new User($id))->getAccounts( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/UserAdAccountsEdge.php b/vendor/facebook/php-business-sdk/examples/UserAdAccountsEdge.php new file mode 100644 index 00000000..260411ef --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/UserAdAccountsEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new User($id))->getAdAccounts( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/UserLeadGenInfoNode.php b/vendor/facebook/php-business-sdk/examples/UserLeadGenInfoNode.php new file mode 100644 index 00000000..e275c43b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/UserLeadGenInfoNode.php @@ -0,0 +1,45 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new Lead($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/UserNode.php b/vendor/facebook/php-business-sdk/examples/UserNode.php new file mode 100644 index 00000000..517dc13f --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/UserNode.php @@ -0,0 +1,45 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new User($id))->getSelf( + $fields, + $params +)->exportAllData(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/VideoThumbnailsEdge.php b/vendor/facebook/php-business-sdk/examples/VideoThumbnailsEdge.php new file mode 100644 index 00000000..57f60691 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/VideoThumbnailsEdge.php @@ -0,0 +1,46 @@ +'; +$app_secret = ''; +$app_id = ''; +$id = ''; + +$api = Api::init($app_id, $app_secret, $access_token); +$api->setLogger(new CurlLogger()); + +$fields = array( +); +$params = array( +); +echo json_encode((new AdVideo($id))->getThumbnails( + $fields, + $params +)->getResponse()->getContent(), JSON_PRETTY_PRINT); \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/examples/adgroup_creation.php b/vendor/facebook/php-business-sdk/examples/adgroup_creation.php new file mode 100644 index 00000000..4f6c7dfc --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/adgroup_creation.php @@ -0,0 +1,201 @@ +setLogger(new CurlLogger()); + +/** + * Step 1 Read the AdAccount (optional) + */ +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdAccountFields; + + +$account = (new AdAccount($account_id))->read(array( + AdAccountFields::ID, + AdAccountFields::NAME, + AdAccountFields::ACCOUNT_STATUS, +)); + +echo "\nUsing this account: "; +echo $account->id."\n"; + +// Check the account is active +if($account->{AdAccountFields::ACCOUNT_STATUS} !== 1) { + throw new \Exception( + 'This account is not active'); +} + +/** + * Step 2 Create the Campaign + */ +use FacebookAds\Object\Campaign; +use FacebookAds\Object\Fields\CampaignFields; +use FacebookAds\Object\Values\CampaignObjectiveValues; + +$campaign = $account->createCampaign( + $fields = array(), + $params = array( + CampaignFields::NAME => 'My First Campaign', + CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS, + Campaign::STATUS_PARAM_NAME => Campaign::STATUS_PAUSED, + ) +); + + +echo "Campaign ID:" . $campaign->id . "\n"; + +/** + * Step 3 Search Targeting + */ +use FacebookAds\Object\TargetingSearch; +use FacebookAds\Object\Search\TargetingSearchTypes; +use FacebookAds\Object\Targeting; +use FacebookAds\Object\Fields\TargetingFields; + +$results = TargetingSearch::search( + $type = TargetingSearchTypes::INTEREST, + $class = null, + $query = 'facebook'); + +// we'll take the top result for now +$target = (count($results)) ? $results->current() : null; + +echo "Using target: ".$target->name."\n"; + +$targeting = new Targeting(); +$targeting->{TargetingFields::GEO_LOCATIONS} + = array('countries' => array('GB')); +$targeting->{TargetingFields::INTERESTS} = array( + array( + 'id' => $target->id, + 'name' => $target->name, + ), +); + +/** + * Step 4 Create the AdSet + */ +use FacebookAds\Object\AdSet; +use FacebookAds\Object\Fields\AdSetFields; +use FacebookAds\Object\Values\AdSetOptimizationGoalValues; +use FacebookAds\Object\Values\AdSetBillingEventValues; +use FacebookAds\Object\Values\AdSetStatusValues; + +$adset = $account->createAdSet( + $fields = array(), + $params = array( + AdSetFields::NAME => 'My First AdSet', + AdSetFields::CAMPAIGN_ID => 6121920447142,//$campaign->id, + AdSetFields::DAILY_BUDGET => '150', + AdSetFields::TARGETING => $targeting, + AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::REACH, + AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS, + AdSetFields::BID_AMOUNT => 100, + AdSetFields::START_TIME => + (new \DateTime("+1 week"))->format(\DateTime::ISO8601), + AdSetFields::END_TIME => + (new \DateTime("+2 week"))->format(\DateTime::ISO8601), + AdSetFields::STATUS => AdSetStatusValues::ACTIVE, + ) +); + + +echo 'AdSet ID: '. $adset->id . "\n"; + +/** + * Step 5 Create an AdImage + */ +use FacebookAds\Object\AdImage; +use FacebookAds\Object\Fields\AdImageFields; + +$image = $account->createAdImage( + array(), + array( + AdImageFields::FILENAME => SDK_DIR.'/test/misc/image.png', + ) +); +echo 'Image Hash: '.$image->hash . "\n"; + +/** + * Step 6 Create an AdCreative + */ +use FacebookAds\Object\AdCreative; +use FacebookAds\Object\Fields\AdCreativeFields; + +$creative = $account->createAdCreative( + array(), + array( + AdCreativeFields::NAME => 'Sample Creative', + AdCreativeFields::TITLE => 'Welcome to the Jungle', + AdCreativeFields::BODY => 'We\'ve got fun \'n\' games', + AdCreativeFields::IMAGE_HASH => $image->hash, + AdCreativeFields::OBJECT_URL => 'http://www.example.com/', + ) +); + +echo 'Creative ID: '.$creative->id . "\n"; + +/** + * Step 7 Create an Ad + */ +use FacebookAds\Object\Ad; +use FacebookAds\Object\Fields\AdFields; + +$account->createAd( + array(), + array( + AdFields::CREATIVE => array('creative_id' => $creative->id), + AdFields::NAME => 'My First Ad', + AdFields::ADSET_ID => $adset->id, + ) +); + +echo 'Ad ID:' . $ad->id . "\n"; diff --git a/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/README.md b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/README.md new file mode 100644 index 00000000..72e96fb4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/README.md @@ -0,0 +1,16 @@ +# Aggregator BM Onboarding Example + +This is a very basic demo to demonstrate a simple flow of creating a Child Business Manager for a client. After creating the Child Business Manager, the client can set up a Click-to-Messenger ad. + + +## Set Up + +1. Replace the constants in the top of the file in `api.php`. Also be sure to replace the constants ``, ``. +2. Replace `` in `index.html`. +3. Run the following command to start up your local server: +`php -S localhost:8000` +4. Go to https://localhost:8000 +5. Click on the Facebook Login Button, this should automatically create the child business manager if it doesn't exist and get the required information necessary to create an ad. +6. Set the fields and click create ad! + +Note: the user creating the ad must be an admin of the page referenced in `page_id` in `api.php`. diff --git a/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/api.php b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/api.php new file mode 100644 index 00000000..20eecf4b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/api.php @@ -0,0 +1,403 @@ +setLogger($logger); + +function getEdges($api, $params, $fields, $node_id, $edge) { + if ($fields) { + $fields = implode(',', $fields); + $params['fields'] = $fields; + } + $response = + $api->call('/'.$node_id.'/'.$edge, RequestInterface::METHOD_GET, $params); + return $response->getContent(); +} + +function postEdges($api, $params, $node_id, $edge) { + $response = + $api->call('/'.$node_id.'/'.$edge, RequestInterface::METHOD_POST, $params); + return $response->getContent(); +} + +function setAccessToken($access_token) { + global $app_secret, $app_id; + Api::init($app_id, $app_secret, $access_token); + $api = Api::instance(); + $logger = new CurlLogger(); + $api->setLogger($logger); + return $api; +} + +function create_client_business($access_token) { + global + $app_id, + $app_secret, + $aggregator_bm_id, + $page_id, + $bm_loc_id, + $aggregator_access_token; + + $api = setAccessToken($access_token); + $me = getEdges($api, array(), array(), 'me', ''); + $app_scoped_user_id = $me['id']; + + $api = setAccessToken($aggregator_access_token); + $child_business = (new Business($aggregator_bm_id))->getOwnedBusinesses( + array(), + array( + 'client_user_id' => $app_scoped_user_id, + ), + ); + + if (!is_null($child_business) && !is_null($child_business[0])) { + $child_business_id = $child_business[0]->id; + // A partner can only create one child business manager on behalf + // of the user. Exit to avoid erroring. + $accounts = + (new Business($child_business_id))->getOwnedAdAccounts(array(), array()); + $existing_account = ''; + if (!is_null($accounts) && !is_null($accounts[0])) { + $existing_account = $accounts[0]->id; + } + return $child_business_id.','.$existing_account; + } + + /** + * Step 1 Create the child BM under the Aggregator BM + */ + $child_business = (new Business($aggregator_bm_id))->createOwnedBusiness( + array(), + array( + 'id' => $aggregator_bm_id, + BusinessFields::NAME => 'Advertisers Name Child BM', + BusinessFields::VERTICAL => 'OTHER', + 'shared_page_id' => $page_id, + 'page_permitted_roles' => ['ADVERTISER'], + 'timezone_id' => 1, + ), + ); + $child_business_id = $child_business->id; + + /** + * Step 2 Share credit line from Aggregator BM to client BM. + * This uses the Aggregators access token. + */ + $api = setAccessToken($aggregator_access_token); + (new ExtendedCredit($bm_loc_id))->createOwningCreditAllocationConfig( + array(), + array( + 'receiving_business_id' => $child_business_id, + 'amount' => 10, + ), + ); + + /** + * Step 3 Create access token System user under child BM. + * This uses the Aggregators access token. + */ + $api = setAccessToken($aggregator_access_token); + $child_business_token = (new Business($child_business_id))->createAccessToken( + array(), + array( + 'id' => $child_business_id, + 'app_id' => $app_id, + 'scope' => 'manage_pages,ads_management,business_management', + ), + ); + $child_bm_system_user_access_token = $child_business_token->access_token; + + /** + * Step 4 Fetch funding source shared with BM + * This uses the Child BMs access token. + */ + $api = setAccessToken($child_bm_system_user_access_token); + $params = array(); + $fields = array(); + $response = + getEdges($api, $params, $fields, $child_business_id, 'extendedcredits'); + $child_bm_payment_method_id = $response['data'][0]['id']; + + /** + * Step 5 Create Ad Account + * This uses the Child BMs access token. The Admin System user for their + * child BM is the owner of the Ad Account. + */ + $api = setAccessToken($child_bm_system_user_access_token); + $account = (new Business($child_business_id))->createAdAccount( + array(), + array( + 'name' => 'MyAdAccount', + 'currency' => 'USD', + 'timezone_id' => 1, + 'end_advertiser' => $page_id, + 'media_agency' => 'NONE', + 'partner' => 'NONE', + 'funding_id' => $child_bm_payment_method_id, + ), + ); + $account_id = $account->id; + + /** + * Step 6 Fetch the System user for the client business. + * This uses the Child BMs access token. This system user id is used in the api calls below. + */ + $api = setAccessToken($child_bm_system_user_access_token); + $system_user_id = + (new Business($child_business_id))->getSystemUsers(array(), array())[0]->id; + + /** + * Step 7 Add System user as Admin to Ad Account. + * This uses the Child BMs access token. + */ + $api = setAccessToken($child_bm_system_user_access_token); + (new AdAccount($account_id))->createAssignedUser( + array(), + array( + 'user' => $system_user_id, + 'role' => 'ADMIN', + 'business' => $child_business_id, + ), + ); + + return $child_business_id.','.$account_id; +} + +function create_click_to_messenger_ad( + $account_id, + $bmid, + $ad_message, + $page_welcome_message, +) { + global $aggregator_access_token, $app_id, $page_id; + $api = setAccessToken($aggregator_access_token); + $child_business_token = (new Business($bmid))->createAccessToken( + array(), + array( + 'app_id' => $app_id, + 'scope' => 'manage_pages,ads_management,business_management', + ), + ); + $child_bm_system_user_access_token = $child_business_token->access_token; + $api = setAccessToken($child_bm_system_user_access_token); + $account = new AdAccount($account_id); + $campaign = $account->createCampaign( + array(), + array( + CampaignFields::NAME => 'First test Campaign', + CampaignFields::OBJECTIVE => 'MESSAGES', + ), + ); + + /** + * Step 2 Search Targeting + */ + $targeting = new Targeting(); + $targeting->setData(array( + TargetingFields::GEO_LOCATIONS => array( + 'countries' => array('JP'), + 'regions' => array(array('key' => '3886')), + 'cities' => array( + array( + 'key' => '2420605', + 'radius' => 10, + 'distance_unit' => 'mile', + ), + ), + ), + )); + + /** + * Step 3 Create the AdSet + */ + $start_time = (new \DateTime("+1 week"))->format(DateTime::ISO8601); + $end_time = (new \DateTime("+2 week"))->format(DateTime::ISO8601); + $fields = array(); + $params = array( + AdSetFields::NAME => 'First Ad Set', + AdSetFields::OPTIMIZATION_GOAL => AdSetOptimizationGoalValues::REPLIES, + AdSetFields::BILLING_EVENT => AdSetBillingEventValues::IMPRESSIONS, + AdSetFields::BID_AMOUNT => 2, + AdSetFields::DAILY_BUDGET => 1000, + AdSetFields::CAMPAIGN_ID => $campaign->id, + AdSetFields::TARGETING => $targeting, + AdSetFields::START_TIME => $start_time, + AdSetFields::END_TIME => $end_time, + ); + $ad_set = $account->createAdSet($fields, $params); + $ad_set_id = $ad_set->id; + + /** + * Step 4 Create an AdImage + */ + + $image = new AdImage(); + $image->setParentId($account->id); + $image->{AdImageFields::FILENAME} = SDK_DIR.''; + + $image->create(); + $image_hash = $image->hash; + + /** + * Step 5 Create an AdCreative + */ + + $link_data = new AdCreativeLinkData(); + $link_data->setData(array( + AdCreativeLinkDataFields::CALL_TO_ACTION => array( + 'type' => AdCreativeCallToActionTypeValues::LEARN_MORE, + 'value' => array( + AdCreativeLinkDataCallToActionValueFields::APP_DESTINATION => + PageCallToActionWebDestinationTypeValues::MESSENGER, + ), + ), + AdCreativeLinkDataFields::LINK => '', + AdCreativeLinkDataFields::IMAGE_HASH => $image->hash, + AdCreativeLinkDataFields::MESSAGE => $ad_message, + AdCreativeLinkDataFields::PAGE_WELCOME_MESSAGE => $page_welcome_message, + )); + + $object_story_spec = new AdCreativeObjectStorySpec(); + $object_story_spec->setData(array( + AdCreativeObjectStorySpecFields::PAGE_ID => $page_id, + AdCreativeObjectStorySpecFields::LINK_DATA => $link_data, + )); + + $creative = $account->createAdCreative( + array(), + array( + AdCreativeFields::NAME => 'Sample Creative', + AdCreativeFields::OBJECT_STORY_SPEC => $object_story_spec, + ), + ); + + $ad = $account->createAd( + array(), + array( + 'status' => 'ACTIVE', + 'adset_id' => $ad_set_id, + 'name' => 'My Ad', + 'creative' => array('creative_id' => $creative->id), + ), + ); + $ad_id = $ad->id; + return 'Ad ID: '.$ad_id; +} + +$possible_url = array("create_client_business", "create_click_to_messenger_ad"); + +$value = "An error has occurred"; + +if (isset($_GET["action"]) && in_array($_GET["action"], $possible_url)) { + switch ($_GET["action"]) { + case "create_client_business": + if (isset($_GET["access_token"])) + $value = create_client_business($_GET["access_token"]); + else + $value = "Missing argument"; + break; + case "create_click_to_messenger_ad": + if ( + isset($_GET["adaccount"]) && + isset($_GET["bmid"]) && + isset($_GET["ad_message"]) && + isset($_GET["page_welcome_message"]) + ) + $value = create_click_to_messenger_ad( + $_GET["adaccount"], + $_GET["bmid"], + $_GET["ad_message"], + $_GET["page_welcome_message"], + ); + else + $value = "Missing argument"; + break; + } +} + +//return JSON array +exit(json_encode($value)); +?> diff --git a/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.css b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.css new file mode 100644 index 00000000..f2c4c59b --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.css @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. All rights reserved. + * + * You are hereby granted a non-exclusive, worldwide, royalty-free license to + * use, copy, modify, and distribute this software in source code or binary + * form for use in connection with the web services and APIs provided by + * Facebook. + * + * As with any software that integrates with the Facebook platform, your use + * of this software is subject to the Facebook Developer Principles and + * Policies [http://developers.facebook.com/policy/]. This copyright notice + * shall be included in all copies or substantial portions of the software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + */ + +/* Add shadows to create the "card" effect */ +.card { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); + transition: 0.3s; +} + +/* On mouse-over, add a deeper shadow */ +.card:hover { + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); +} + +/* Add some padding inside the card container */ +.container { + display: inline-block; + padding: 2px 16px; +} + +.insidecontainer { + align-items: center; + display: flex; + height: 500px; + justify-content: center; + padding: 20px 30px; + width: 600px; +} + +.padded { + padding: 20px 30px; +} + +.buttons { + padding: 5px 5px; +} + +#status { + bottom: 60px; + height: 50px; + padding: 10px 20px; + position: absolute; + text-align: center; + width: 100%; +} + +div.static { + height: 40px; + position: static; +} + +.loader { + border: 8px solid #f3f3f3; + border-radius: 50%; + border-top: 8px solid #3498db; + width: 60px; + height: 60px; + -webkit-animation: spin 1s linear infinite; + /* Safari */ + animation: spin 1s linear infinite; +} + +.content-header { + font-size: 26px; + margin-bottom: 60px; + text-align: center; +} + +.form { + flex-grow: 1; +} + +.form-group { + display: flex; + justify-content: space-between; + margin: 40px 0; +} + +.content { + display: flex; + flex-direction: column; + height: 100%; + padding: 20px; + width: 100%; +} + +.create-ad-button { + background: none; + border-radius: 5px; + border: 1px solid #dddddd; + cursor: pointer; + display: block; + margin: 40px auto 0; + padding: 10px 15px; +} + +input { + border: none; + border-bottom: 1px solid #dddd; + outline: none; + padding: 0 6px 6px 6px; + width: 300px; +} + +/* Safari */ + +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.html b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.html new file mode 100644 index 00000000..b735d08d --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/aggregator_onboarding/index.html @@ -0,0 +1,174 @@ + + + + + + Aggregator BM Onboarding Example + + + + + + + + +
+
+
+

Create Ads

+
+
+ + + +
+
+
+
+
+ + + diff --git a/vendor/facebook/php-business-sdk/examples/curl_log.php b/vendor/facebook/php-business-sdk/examples/curl_log.php new file mode 100644 index 00000000..0c684107 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/curl_log.php @@ -0,0 +1,67 @@ +setLogger($logger); + +use FacebookAds\Object\AdAccount; +use FacebookAds\Object\Fields\AdAccountFields; + +$account = (new AdAccount($account_id))->read(array( + AdAccountFields::ID, + AdAccountFields::NAME, + AdAccountFields::ACCOUNT_STATUS, +)); diff --git a/vendor/facebook/php-business-sdk/examples/custom_audiences.php b/vendor/facebook/php-business-sdk/examples/custom_audiences.php new file mode 100644 index 00000000..aefd2833 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/custom_audiences.php @@ -0,0 +1,81 @@ +setData(array( + CustomAudienceFields::NAME => 'My Custom Audiece', + CustomAudienceFields::DESCRIPTION => 'Lots of people', + CustomAudienceFields::SUBTYPE => CustomAudienceSubtypes::CUSTOM, +)); +// Create the audience +$audience->create(); +echo "Audience ID: " . $audience->id."\n"; + +// Assuming you have an array of emails: +// NOTE: The SDK will hash (SHA-2) your data before submitting +// it to Facebook servers +$emails = array( + 'paul@example.com', + 'luca@example.com', + 'bruce@example.com', + 'peihua@example.com', +); + +$audience->addUsers($emails, CustomAudienceTypes::EMAIL); +$audience->read(array(CustomAudienceFields::APPROXIMATE_COUNT)); +echo "Estimated Size:" + . $audience->{CustomAudienceFields::APPROXIMATE_COUNT}."\n"; diff --git a/vendor/facebook/php-business-sdk/examples/server_side_api.php b/vendor/facebook/php-business-sdk/examples/server_side_api.php new file mode 100644 index 00000000..ce7924e5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/examples/server_side_api.php @@ -0,0 +1,92 @@ +setEventName('Purchase') + ->setEventTime(time()); + +$user_data = new UserData(); +$user_data + ->setEmail('joe@eg.com') + ->setPhone('16505551212') + ->setCountryCode('us') + ->setGender(Gender::FEMALE); + +$custom_content = new Content(); +$custom_content + ->setItemPrice(3.5) + ->setProductId("XYZ789") + ->setQuantity(4); + +$custom_contents = array(); +array_push($custom_contents, $custom_content); + +$custom_data = new CustomData(); +$custom_data + ->setCurrency('USD') + ->setValue(14.0) + ->setContents($custom_contents); + +$event->setUserData($user_data); +$event->setCustomData($custom_data); + +$events = array(); +array_push($events, $event); +array_push($events, $event); + +// Create event request +$request = new EventRequest($pixel_id); +$request->setEvents($events); +// Execute the request +$response = $request->execute(); + +print_r($response); diff --git a/vendor/facebook/php-business-sdk/fb_ca_chain_bundle.crt b/vendor/facebook/php-business-sdk/fb_ca_chain_bundle.crt new file mode 100644 index 00000000..969239ff --- /dev/null +++ b/vendor/facebook/php-business-sdk/fb_ca_chain_bundle.crt @@ -0,0 +1,3920 @@ +## +## ca-bundle.crt -- Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Thu Oct 18 19:05:59 2012 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## + +# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.86 $ $Date: 2012/10/18 16:26:52 $ + +GTE CyberTrust Global Root +========================== +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg +Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG +A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz +MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL +Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 +IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u +sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql +HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID +AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW +M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF +NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +Thawte Server CA +================ +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE +AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j +b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV +BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u +c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG +A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl +/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 +1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J +GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ +GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte Premium Server CA +======================== +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs +dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE +AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl +ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT +AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU +VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 +aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ +cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 +aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh +Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ +qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm +SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf +8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t +UCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +Equifax Secure CA +================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE +ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT +B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR +fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW +8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE +CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS +spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 +zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB +BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 +70+sB3c4 +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 1 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy +MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE +NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i +o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq +kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 +RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +Digital Signature Trust Co. Global CA 3 +======================================= +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE +ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy +MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs +IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD +VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS +xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo +BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 +dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY +MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM +BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB +AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi +up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 +mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA +TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah +WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf +Tqj/ZA1k +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd +k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq +WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM +XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC +lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h +cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp +Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx +nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC +wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA +ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK +1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk +LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G2 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz +dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO +FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 +lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB +MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT +1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD +Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 +-----END CERTIFICATE----- + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +ValiCert Class 1 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy +MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi +GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm +DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG +lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX +icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP +Orf1LXLI +-----END CERTIFICATE----- + +ValiCert Class 2 VA +=================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC +CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf +ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ +SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV +UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 +W9ViH0Pd +-----END CERTIFICATE----- + +RSA Root Certificate 1 +====================== +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp +b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh +bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw +MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 +d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg +UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 +LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td +3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H +BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs +3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF +V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r +on+jjBXu +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E +bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ +rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+ +Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB +FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h +a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc +D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign Class 2 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT +MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y +azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug +b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1 +c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6 +tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7 +C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS +0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs +Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0 +JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx +JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j +GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign Class 4 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS +tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM +8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW +Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX +Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd +RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG +UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Entrust.net Secure Server CA +============================ +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg +cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl +ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG +A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi +eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p +dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ +aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 +gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw +ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l +dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw +NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow +HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA +BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN +Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 +n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC +AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER +gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo +oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS +o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z +2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX +OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Equifax Secure Global eBusiness CA +================================== +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp +bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds +b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV +PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN +qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn +hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs +MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN +I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY +NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 1 +============================= +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB +LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE +ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz +IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ +1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a +IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk +MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW +Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF +AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 +lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ +KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax Secure eBusiness CA 2 +============================= +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE +ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT +DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn +2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 +BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG +A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx +JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG +A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e +uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB +Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 +jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia +78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm +V+GRMOrN +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +UTN-USER First-Network Applications +=================================== +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp +BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5 +WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T +YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB +cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug +mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj +DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu +Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi +P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE +j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w +HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j +cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y +IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK +RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp +xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq +DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE +-----END CERTIFICATE----- + +America Online Root Certification Authority 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG +v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z +DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh +sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP +8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z +o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf +GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF +VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft +3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America Online Root Certification Authority 2 +============================================= +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT +QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG +A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg +T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en +fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 +f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO +qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN +RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 +gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn +6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid +FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 +Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj +B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY +T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p ++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg +JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy +zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO +ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh +1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf +GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff +Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP +cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 1 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw +NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88 +7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9 +EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl +0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645 +2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa +HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT +iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9 +28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV +yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR +vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P +qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z +IRlXvVWa +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +TDC Internet Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE +ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx +NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu +ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j +xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL +znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc +5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 +otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI +AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM +VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM +MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe +UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G +CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb +O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU +Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC OCES Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE +ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5 +MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH +nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0 +zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV +iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde +dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO +3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB +5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k +ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm +cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp +Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM +MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647 ++RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6 +NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4 +A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc +A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9 +AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1 +AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +UTN DATACorp SGC Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ +BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa +MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w +HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy +dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys +raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo +wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA +9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv +33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud +DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 +BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD +LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 +I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx +EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP +DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN USERFirst Email Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0 +BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05 +OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx +FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz +dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx +B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8 +om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG +TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl +yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE +AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV +HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne +xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+ +5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV +NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ +w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +UTN USERFirst Object Root CA +============================ +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb +BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz +NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx +HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy +dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR +loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ +w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu +lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7 +RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL +BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8 +ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly +c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw +NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO +PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE +qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG +hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Qualified (Class QA) Root +================================= +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn +eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0 +bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0 +LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0 +dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP +aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV +CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e +8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb +m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ +0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM +0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2 +YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p +a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz +YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg +YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg +ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov +L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr +Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0 +aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg +YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0 +IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3 +DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN +wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg +W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc +R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR +5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +NetLock Business (Class B) Root +=============================== +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg +VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD +VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv +bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg +VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S +o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr +1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV +HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ +RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh +dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 +ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv +c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg +YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz +Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA +bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl +IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 +YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj +cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM +43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR +stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +NetLock Express (Class C) Root +============================== +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT +CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV +BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ +BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j +ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z +W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 +euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw +DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN +RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn +YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB +IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i +aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 +ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y +emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k +IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ +UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg +YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 +xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW +gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Firmaprofesional Root CA +======================== +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT +GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp +Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA +ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL +MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT +OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 +ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V +j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH +lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf +3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 +NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww +KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG +AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD +ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf +wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm +7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG +VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +Wells Fargo Root CA +=================== +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV +BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl +bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv +MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX +x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 +E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 +OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j +sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj +YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF +BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD +ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv +m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R +OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 +tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 1 +============================================== +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP +MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 +acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx +MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB +TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC +aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX +yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i +Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ +8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 +W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 +sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE +q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY +nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2 +============================================== +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN +MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr +dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe +LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI +x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g +QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr +5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB +AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt +Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ +hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P +9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 +UrbnBEI= +-----END CERTIFICATE----- + +SwissSign Platinum CA - G2 +========================== +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw +HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM +U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu +669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF +eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne +WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo +j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6 +8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T +aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy +domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D ++m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV +CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv +zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1 +Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3 +NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4 +U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8 +KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl +9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B +aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs +OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY +Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci +IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +S-TRUST Authentication and Encryption Root CA 2005 PN +===================================================== +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE +BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh +cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT +LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w +NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk +ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj +aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp +b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob +4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL +g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf +eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3 +KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB +/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv +bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU +D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08 +P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA +nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit +F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b +Hz2eBIPdltkdOpQ= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. +====================================== +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT +AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg +LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w +HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ +U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh +IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN +yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU +2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 +4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP +2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm +8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf +HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa +Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK +5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b +czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g +ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF +BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug +cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf +AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX +EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v +/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 +MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 +3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk +eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f +/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h +RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU +Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 2 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw +MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw +IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 +xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ +Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u +SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G +dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ +KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj +TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP +JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk +vQ== +-----END CERTIFICATE----- + +TC TrustCenter Class 3 CA II +============================ +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy +IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw +MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 +c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE +AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W +yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo +6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ +uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk +2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB +7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 +Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU +cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i +SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE +O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 +yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 +IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal +092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc +5A== +-----END CERTIFICATE----- + +TC TrustCenter Universal CA I +============================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN +MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg +VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw +JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC +qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv +xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw +ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O +gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j +BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG +1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy +vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 +ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a +7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +ComSign CA +========== +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD +EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy +MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp +Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q +ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy +P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN +GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk +YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM +rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy +oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P +AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+ +VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2 +QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI +mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb +/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG +zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- + +ComSign Secured CA +================== +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE +AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w +NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD +QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs +49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH +7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB +kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 +9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw +AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t +U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA +j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC +AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a +BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp +FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP +51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +Buypass Class 3 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 +MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx +ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 +n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia +AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c +1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 +pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA +EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 +htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj +el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Verisign Class 1 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ +VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2 +yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa +XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n +0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ +RjXZ+Hxb +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority +======================================================= +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow +XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 +f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol +hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky +CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX +bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ +D/xwzoiQ +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +=================================================== +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz +ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 +MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 +cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u +aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY +8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y +jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI +JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk +9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG +SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d +F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq +D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 +Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +TC TrustCenter Universal CA III +=============================== +-----BEGIN CERTIFICATE----- +MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC +REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy +IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe +Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU +QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex +KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt +QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO +juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut +CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 +M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G +A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA +g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ +KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK +BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV +CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq +woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +A-Trust-nQual-03 +================ +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE +Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy +a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R +dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw +RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 +ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 +c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA +zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n +yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE +SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 +iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V +cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV +eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 +ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr +sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd +JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 +ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +====================================================== +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/AnonymousSession.php b/vendor/facebook/php-business-sdk/src/FacebookAds/AnonymousSession.php new file mode 100644 index 00000000..0fd0bfe6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/AnonymousSession.php @@ -0,0 +1,35 @@ +httpClient = $http_client; + $this->session = $session; + } + + /** + * @param string $app_id + * @param string $app_secret + * @param string $access_token + * @return static + */ + public static function init($app_id, $app_secret, $access_token, $log_crash=true) { + $session = new Session($app_id, $app_secret, $access_token); + $api = new static(new Client(), $session); + static::setInstance($api); + if ($log_crash) { + CrashReporter::enable(); + } + return $api; + } + + /** + * @return Api|null + */ + public static function instance() { + return static::$instance; + } + + /** + * @param Api $instance + */ + public static function setInstance(Api $instance) { + static::$instance = $instance; + } + + /** + * @param SessionInterface $session + * @return Api + */ + public function getCopyWithSession(SessionInterface $session) { + $api = new self($this->getHttpClient(), $session); + $api->setDefaultGraphVersion($this->getDefaultGraphVersion()); + $api->setLogger($this->getLogger()); + return $api; + } + + /** + * @param string $string + * @return string + */ + public static function base64UrlEncode($string) { + $str = strtr(base64_encode($string), '+/', '-_'); + $str = str_replace('=', '', $str); + return $str; + } + + /** + * @param string $path + * @param string $method + * @param array $params + * @return RequestInterface + */ + public function prepareRequest( + $path, + $method = RequestInterface::METHOD_GET, + array $params = array()) { + + $request = $this->getHttpClient()->createRequest(); + $request->setMethod($method); + $request->setGraphVersion($this->getDefaultGraphVersion()); + $request->setPath($path); + + if ($method === RequestInterface::METHOD_GET) { + $params_ref = $request->getQueryParams(); + } else { + $params_ref = $request->getBodyParams(); + } + + if (!empty($params)) { + $params_ref->enhance($params); + } + + $params_ref->enhance($this->getSession()->getRequestParameters()); + + return $request; + } + + /** + * @param RequestInterface $request + * @return ResponseInterface + */ + public function executeRequest(RequestInterface $request) { + $this->getLogger()->logRequest('debug', $request); + $response = $request->execute(); + $this->getLogger()->logResponse('debug', $response); + + return $response; + } + + /** + * @return string + */ + public function getDefaultGraphVersion() { + if ($this->defaultGraphVersion === null) { + $match = array(); + if (preg_match("/^\d+\.\d+/", static::VERSION, $match)) { + $this->defaultGraphVersion = $match[0]; + } + } + + return $this->defaultGraphVersion; + } + + /** + * @param string $version + */ + public function setDefaultGraphVersion($version) { + $this->defaultGraphVersion = $version; + } + + /** + * Make graph api calls + * + * @param string $path Ads API endpoint + * @param string $method Ads API request type + * @param array $params Assoc of request parameters + * @return ResponseInterface Graph API responses + */ + public function call( + $path, + $method = RequestInterface::METHOD_GET, + array $params = array(), + array $file_params = array()) { + + $request = $this->prepareRequest($path, $method, $params); + + if (!empty($file_params)) { + foreach($file_params as $key => $value) { + $request->getFileParams()->offsetSet($key, $value); + } + } + + return $this->executeRequest($request); + } + + /** + * @return SessionInterface + */ + public function getSession() { + return $this->session; + } + + /** + * @param LoggerInterface $logger + */ + public function setLogger(LoggerInterface $logger) { + $this->logger = $logger; + } + + /** + * @return LoggerInterface + */ + public function getLogger() { + if ($this->logger === null) { + $this->logger = new NullLogger(); + } + return $this->logger; + } + + /** + * @return Client + */ + public function getHttpClient() { + return $this->httpClient; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/ApiConfig.php b/vendor/facebook/php-business-sdk/src/FacebookAds/ApiConfig.php new file mode 100644 index 00000000..7000a10d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/ApiConfig.php @@ -0,0 +1,29 @@ +fields = []; + $this->params = []; + $this->file_params = []; + $this->file_counter = 0; + $this->api = $api; + $this->id = $id; + $this->method = $method; + $this->endpoint = $endpoint; + $this->return_prototype = $return_prototype; + $this->api_type = $api_type; + $this->accepted_fields = $accepted_fields; + $this->param_checker = $param_checker; + $this->allow_file_upload = $allow_file_upload; + $this->use_graph_video_endpoint = $use_graph_video_endpoint; + } + + public function addParam($param, $value) { + $extracted_value = $this->extractValue($value); + if (!ApiConfig::TYPE_CHECKER_STRICT_MODE + || !$this->param_checker->isValidParam($param) + ) { + if ($this->param_checker->isFileParam($param)) { + $this->file_params[$param] = $extracted_value; + } else { + $this->params[$param] = $extracted_value; + } + } else { + if ($this->param_checker->isValidParamPair($param, $value)) { + if ($this->param_checker->isFileParam($param)) { + $this->file_params[$param] = $extracted_value; + } else { + $this->params[$param] = $extracted_value; + } + } elseif ($this->param_checker->isPrimitiveType($param)) { + $param_type = $this->param_checker->getType($param); + $this->params[$param] = $this->param_checker->convertStringToPrimType( + $param_type, $value); + } else { + throw new \LogicException('The value for '.$param.' is not compatible'); + } + } + return $this; + } + + public function addParams($params) { + foreach ($params as $key => $value) { + $this->addParam($key, $value); + } + return $this; + } + + public function removeParam($param) { + if (array_key_exists($param, $this->params)) { + unset($this->params[$param]); + } elseif (array_key_exists($param, $this->params)) { + unset($this->file_params[$param]); + } + return $this; + } + + public function clearParams() { + $this->params = []; + $this->file_params = []; + return $this; + } + + public function getParams() { + $all_params = array_merge($this->params, $this->file_params); + return $all_params; + } + + public function addField($field) { + if (ApiConfig::TYPE_CHECKER_STRICT_MODE + && !in_array($field, $this->accepted_fields) + ) { + throw new \LogicException('Field '.$field.' is not supported'); + } + if (!(in_array($field, $this->fields))) { + $this->fields[] = $field; + } + return $this; + } + + public function addFields($fields) { + foreach ($fields as $field) { + $this->addField($field); + } + return $this; + } + + public function removeField($field) { + if (in_array($field, $this->fields)) { + $index_to_remove = array_search($field, $this->fields); + unset($this->fields[$index_to_remove]); + } + return $this; + } + + public function clearFields() { + $this->fields = []; + return $this; + } + + public function getFields() { + return $this->fields; + } + + public function addFile($filename) { + if (ApiConfig::TYPE_CHECKER_STRICT_MODE && !$this->allow_file_upload) { + throw new \LogicException("This api cannot upload files"); + } + $file_key = 'source'.$this->file_counter; + if (file_exists($filename)) { + $this->file_params[$file_key] = $filename; + $this->file_counter++; + } + return $this; + } + + /** + * Execute the request + */ + public function execute() { + $url_path = '/'.$this->id.$this->endpoint; + $updated_params = $this->params; + if (!empty($this->fields)) { + $fields = implode(',', $this->fields); + $updated_params['fields'] = $fields; + } + $response = $this->api->call( + $url_path, $this->method, $updated_params, $this->file_params); + if ($this->api_type === "EDGE" && $this->method === "GET") { + return new Cursor($response, $this->return_prototype, $this->api); + } else if ($this->method === "DELETE") { + return $response; + } else { + return $this->createObject($response->getContent()); + } + } + + protected function extractValue($value) { + if ($this->param_checker->isAbstractObject($value)) { + return $value->exportAllData(); + } else if (is_array($value)) { + $extracted_value = []; + foreach ($value as $key => $sub_value) { + $extracted_value[$key] = $this->extractValue($sub_value); + } + return $extracted_value; + } else { + return $value; + } + } + + protected function createObject(array $object_data) { + $object = clone $this->return_prototype; + $object->setDataWithoutValidation($object_data); + if ($object instanceof AbstractCrudObject) { + $object->setApi($this->api); + } + return $object; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/CrashReporter.php b/vendor/facebook/php-business-sdk/src/FacebookAds/CrashReporter.php new file mode 100644 index 00000000..c4cfd3af --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/CrashReporter.php @@ -0,0 +1,216 @@ +app_id = $app_id; + } + + /** + * @return void + */ + public static function enable() { + if (!static::$handle) { + static::$handle = fopen('php://stdout', 'w'); + } + if (!static::$instance) { + $api = Api::instance(); + if ($api == null) { + self::log('Could not initialize API' . PHP_EOL); + } + static::$instance = new static($api->getSession()->getAppId()); + static::$instance->registerExceptionHandler(); + self::log('Enabled' . PHP_EOL); + } + } + + /** + * @return void + */ + public static function disable() { + if (static::$instance) { + static::$instance = null; + restore_exception_handler(); + restore_error_handler(); + self::log('Disabled'); + } + } + + /** + * @param $handle + */ + public static function setLogger($handle) { + if(is_resource($handle)) { + static::$handle = $handle; + } + } + + /** + * @return void + */ + private function registerExceptionHandler() { + $lastHandler = set_exception_handler( + function (\Throwable $e) use (&$lastHandler) { + self::log('Exception detected!'); + $params = $this->buildParamsFromException($e); + if ($params != null) { + $this->sendReport(array( + 'bizsdk_crash_report' => $params + )); + } + // restore the previous exception + if (is_callable($lastHandler)) { + return call_user_func_array($lastHandler, [$e]); + } else { + throw $e; + } + } + ); + + $lastError = set_error_handler( + function ($errno, $errstr, $errfile, $errline) use (&$lastError) { + if (($errno & self::E_FATAL) && strpos($errfile, 'FacebookAds') != false) { + self::log('Error detected!'); + $e = new \ErrorException($errstr, 0, $errno, $errfile, $errline); + $params = $this->buildParamsFromException($e); + if ($params != null) { + $this->sendReport(array( + 'bizsdk_crash_report' => $params + )); + } + } + if (is_callable($lastError)) { + return call_user_func_array($lastError, [$errno, $errstr, $errfile, $errline]); + } else { + // fall through to the standard PHP error handler + return false; + } + } + ); + } + + /** + * @param \Throwable $e + * @return array|null + */ + private function buildParamsFromException(\Throwable $e) { + if (!($e instanceof Exception || $e instanceof \ErrorException)) { + return NULL; + } + $reason = CrashReasons::SDK; + if ($e instanceof RequestException) { + $reason = CrashReasons::API; + } + $reason .= ' : ' . $e->getMessage(); + $callstack = explode(PHP_EOL, $e->getTraceAsString()); + return array( + 'reason' => $reason, + 'callstack' => $callstack, + 'platform' => phpversion() + ); + } + + /** + * @param $params + */ + private function sendReport($params) { + try { + $session = new AnonymousSession(); + $api = new Api(Api::instance()->getHttpClient(), $session); + $request = $api->prepareRequest( + '/' . $this->app_id . '/instruments', + RequestInterface::METHOD_POST, + $params + ); + + $response = $api->executeRequest($request); + $data = $response->getContent(); + if ($data && $data['success']) { + self::log('Successfully sent report' . PHP_EOL); + } else { + self::log('Failed to send report' . PHP_EOL); + } + } catch (\Exception $e) { + self::log('Exception on sending report' . PHP_EOL); + } + } + + /** + * @param $message + */ + private static function log($message) { + $content = sprintf("%s : %s%s",static::class, $message, PHP_EOL); + fwrite(static::$handle, $content); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Cursor.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Cursor.php new file mode 100644 index 00000000..780b3324 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Cursor.php @@ -0,0 +1,536 @@ +response = $response; + $this->objectPrototype = $object_prototype; + $this->api = $api !== null ? $api : Api::instance(); + $this->appendResponse($response); + } + + /** + * @param array $object_data + * @return AbstractObject + */ + protected function createObject(array $object_data) { + $object = clone $this->objectPrototype; + $object->setDataWithoutValidation($object_data); + if ($object instanceof AbstractCrudObject) { + $object->setApi($this->api); + } + return $object; + } + + /** + * @param ResponseInterface $response + * @return array + * @throws \InvalidArgumentException + */ + protected function assureResponseData(ResponseInterface $response) { + $content = $response->getContent(); + + // First, check if the content contains data + if (isset($content['data']) && is_array($content['data'])) { + $data = $content['data']; + + // If data is an object wrap the object into an array + if ($this->isJsonObject($data)) { + $data = array($data); + } + return $data; + } + + // Second, check if the content contains special entries + if (isset($content['targetingsentencelines'])) { + return $content['targetingsentencelines']; + } + if (isset($content['adaccounts'])) { + return $content['adaccounts']; + } + if (isset($content['users'])) { + return $content['users']; + } + + // Third, check if the content is an array of objects indexed by id + $is_id_indexed_array = true; + $objects = array(); + if (is_array($content) && count($content) >= 1) { + foreach ($content as $key => $value) { + if ($key === '__fb_trace_id__') { + continue; + } + + if ($value !== null && + $this->isJsonObject($value) && + isset($value['id']) && + $value['id'] !== null && + $value['id'] === $key) { + $objects[] = $value; + } else { + $is_id_indexed_array = false; + break; + } + } + } else { + $is_id_indexed_array = false; + } + if ($is_id_indexed_array) { + return $objects; + } + + throw new \InvalidArgumentException("Malformed response data"); + } + + private function isJsonObject($object) { + if (!is_array($object)) { + return false; + } + + // Consider an empty array as not object + if (empty($object)) { + return false; + } + + // A json object is represented by a map instead of a pure list + return array_keys($object) !== range(0, count($object) - 1); + } + + /** + * @param ResponseInterface $response + */ + protected function prependResponse(ResponseInterface $response) { + $this->response = $response; + $data = $this->assureResponseData($response); + if (empty($data)) { + return; + } + + $left_index = $this->indexLeft; + $count = count($data); + $position = $count - 1; + for ($i = $left_index - 1; $i >= $left_index - $count; $i--) { + $this->objects[$i] = $this->createObject($data[$position--]); + --$this->indexLeft; + } + } + + /** + * @param ResponseInterface $response + */ + protected function appendResponse(ResponseInterface $response) { + $this->response = $response; + $data = $this->assureResponseData($response); + if (empty($data)) { + return; + } + + if ($this->indexRight === null) { + $this->indexLeft = 0; + $this->indexRight = -1; + $this->position = 0; + } + + $this->indexRight += count($data); + + foreach ($data as $object_data) { + $this->objects[] = $this->createObject($object_data); + } + } + + /** + * @return bool + */ + public static function getDefaultUseImplicitFetch() { + return static::$defaultUseImplicitFetch; + } + + /** + * @param bool $use_implicit_fetch + */ + public static function setDefaultUseImplicitFetch($use_implicit_fetch) { + static::$defaultUseImplicitFetch = $use_implicit_fetch; + } + + /** + * @return bool + */ + public function getUseImplicitFetch() { + return $this->useImplicitFetch !== null + ? $this->useImplicitFetch + : static::$defaultUseImplicitFetch; + } + + /** + * @param bool $use_implicit_fetch + */ + public function setUseImplicitFetch($use_implicit_fetch) { + $this->useImplicitFetch = $use_implicit_fetch; + } + + /** + * @return string|null + */ + public function getBefore() { + $content = $this->getLastResponse()->getContent(); + return isset($content['paging']['cursors']['before']) + ? $content['paging']['cursors']['before'] + : null; + } + + /** + * @return string|null + */ + public function getAfter() { + $content = $this->getLastResponse()->getContent(); + return isset($content['paging']['cursors']['after']) + ? $content['paging']['cursors']['after'] + : null; + } + + /** + * @return RequestInterface + */ + protected function createUndirectionalizedRequest() { + $request = $this->getLastResponse()->getRequest()->createClone(); + $params = $request->getQueryParams(); + if (isset($params['before'])) { + unset($params['before']); + } + if (isset($params['after'])) { + unset($params['after']); + } + + return $request; + } + + /** + * @return string|null + */ + public function getPrevious() { + $content = $this->getLastResponse()->getContent(); + if (isset($content['paging']['previous'])) { + return $content['paging']['previous']; + } + + $before = $this->getBefore(); + if ($before !== null) { + $request = $this->createUndirectionalizedRequest(); + $request->getQueryParams()->offsetSet('before', $before); + return $request->getUrl(); + } + + return null; + } + + /** + * @return string|null + */ + public function getNext() { + $content = $this->getLastResponse()->getContent(); + if (isset($content['paging']['next'])) { + return $content['paging']['next']; + } + + $after = $this->getAfter(); + if ($after !== null) { + $request = $this->createUndirectionalizedRequest(); + $request->getQueryParams()->offsetSet('after', $after); + return $request->getUrl(); + } + + return null; + } + + /** + * @param string $url + * @return RequestInterface + */ + protected function createRequestFromUrl($url) { + $components = parse_url($url); + $request = $this->getLastResponse()->getRequest()->createClone(); + $request->setDomain($components['host']); + $query = isset($components['query']) + ? Util::parseUrlQuery($components['query']) + : array(); + $request->getQueryParams()->enhance($query); + + return $request; + } + + /** + * @return RequestInterface|null + */ + public function createBeforeRequest() { + $url = $this->getPrevious(); + return $url !== null ? $this->createRequestFromUrl($url) : null; + } + + /** + * @return RequestInterface|null + */ + public function createAfterRequest() { + $url = $this->getNext(); + return $url !== null ? $this->createRequestFromUrl($url) : null; + } + + public function fetchBefore() { + $request = $this->createBeforeRequest(); + if (!$request) { + return; + } + + $this->prependResponse($request->execute()); + } + + public function fetchAfter() { + $request = $this->createAfterRequest(); + if (!$request) { + return; + } + + $this->appendResponse($request->execute()); + } + + /** + * @deprecated Use getArrayCopy() + * @return AbstractObject[] + */ + public function getObjects() { + return $this->objects; + } + + /** + * @param bool $ksort + * @return AbstractObject[] + */ + public function getArrayCopy($ksort = false) { + if ($ksort) { + // Sort the main array to improve best case performance in future + // invocations + ksort($this->objects); + } + + return $this->objects; + } + + /** + * @deprecated Use getLastResponse() + * @return ResponseInterface + */ + public function getResponse() { + return $this->response; + } + + /** + * @return ResponseInterface + */ + public function getLastResponse() { + return $this->response; + } + + /** + * @return int + */ + public function getIndexLeft() { + return $this->indexLeft; + } + + /** + * @return int + */ + public function getIndexRight() { + return $this->indexRight; + } + + public function rewind() { + $this->position = $this->indexLeft; + } + + public function end() { + $this->position = $this->indexRight; + } + + /** + * @param int $position + */ + public function seekTo($position) { + $position = array_key_exists($position, $this->objects) ? $position : null; + $this->position = $position; + } + + /** + * @return AbstractObject|bool + */ + public function current() { + return isset($this->objects[$this->position]) + ? $this->objects[$this->position] + : false; + } + + /** + * @return int + */ + public function key() { + return $this->position; + } + + public function prev() { + if ($this->position == $this->getIndexLeft()) { + if ($this->getUseImplicitFetch()) { + $this->fetchBefore(); + if ($this->position == $this->getIndexLeft()) { + $this->position = null; + } else { + --$this->position; + } + } else { + $this->position = null; + } + } else { + --$this->position; + } + } + + public function next() { + if ($this->position == $this->getIndexRight()) { + if ($this->getUseImplicitFetch()) { + $this->fetchAfter(); + if ($this->position == $this->getIndexRight()) { + $this->position = null; + } else { + ++$this->position; + } + } else { + $this->position = null; + } + } else { + ++$this->position; + } + } + + /** + * @return bool + */ + public function valid() { + return isset($this->objects[$this->position]); + } + + /** + * @return int + */ + public function count() { + return count($this->objects); + } + + /** + * @param mixed $offset + * @param mixed $value + */ + public function offsetSet($offset, $value) { + if ($offset === null) { + $this->objects[] = $value; + } else { + $this->objects[$offset] = $value; + } + } + + /** + * @param mixed $offset + * @return bool + */ + public function offsetExists($offset) { + return isset($this->objects[$offset]); + } + + /** + * @param mixed $offset + */ + public function offsetUnset($offset) { + unset($this->objects[$offset]); + } + + /** + * @param mixed $offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->objects[$offset]) ? $this->objects[$offset] : null; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Enum/AbstractEnum.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Enum/AbstractEnum.php new file mode 100644 index 00000000..f672c678 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Enum/AbstractEnum.php @@ -0,0 +1,181 @@ +map === null) { + $this->map = (new \ReflectionClass(get_called_class())) + ->getConstants(); + } + + return $this->map; + } + + /** + * @return array + */ + public function getNames() { + if ($this->names === null) { + $this->names = array_keys($this->getArrayCopy()); + } + + return $this->names; + } + + /** + * @return array + */ + public function getValues() { + if ($this->values === null) { + $this->values = array_values($this->getArrayCopy()); + } + + return $this->values; + } + + /** + * @return array + */ + public function getValuesMap() { + if ($this->valuesMap === null) { + $this->valuesMap = array_fill_keys($this->getValues(), null); + } + + return $this->valuesMap; + } + + /** + * @param string|int|float $name + * @return mixed + */ + public function getValueForName($name) { + $copy = $this->getArrayCopy(); + return array_key_exists($name, $copy) + ? $copy[$name] + : null; + } + + /** + * @param string|int|float $name + * @return mixed + * @throws \InvalidArgumentException + */ + public function assureValueForName($name) { + $value = $this->getValueForName($name); + if ($value === null) { + throw new \InvalidArgumentException( + 'Unknown name "'.$name.'" in '.static::className()); + } + + return $value; + } + + /** + * @param string|int|float $name + * @return bool + */ + public function isValid($name) { + return array_key_exists($name, $this->getArrayCopy()); + } + + /** + * @param string|int|float $name + * @throws \InvalidArgumentException + */ + public function assureIsValid($name) { + if (!array_key_exists($name, $this->getArrayCopy())) { + throw new \InvalidArgumentException( + 'Unknown name "'.$name.'" in '.static::className()); + } + } + + /** + * @param string|int|float $value + * @return bool + */ + public function isValidValue($value) { + return array_key_exists($value, $this->getValuesMap()); + } + + /** + * @param mixed $value + * @throws \InvalidArgumentException + */ + public function assureIsValidValue($value) { + if (!$this->isValidValue($value)) { + throw new \InvalidArgumentException( + '"'.$value.'", not a valid value in '.static::className()); + } + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Enum/EmptyEnum.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Enum/EmptyEnum.php new file mode 100644 index 00000000..b1e1011b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Enum/EmptyEnum.php @@ -0,0 +1,56 @@ +client = $client; + } + + /** + * @return Client + */ + public function getClient() { + return $this->client; + } + + /** + * @return string + */ + public function getCaBundlePath() { + return $this->getClient()->getCaBundlePath(); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/AdapterInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/AdapterInterface.php new file mode 100644 index 00000000..5b0d8966 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/AdapterInterface.php @@ -0,0 +1,64 @@ +handle = curl_copy_handle($this->handle); + } + + public function __destruct() { + if (is_resource($this->handle)) { + curl_close($this->handle); + } + } + + /** + * @return CurlInterface + */ + public static function createOptimalVersion() { + if (version_compare(PHP_VERSION, '5.5.0') >= 0) { + return new Curl55(); + } else { + return new Curl(); + } + } + + /** + * @return resource + */ + public function getHandle() { + return $this->handle; + } + + /** + * @return int + */ + public function errno() { + return curl_errno($this->handle); + } + + /** + * @return string + */ + public function error() { + return curl_error($this->handle); + } + + /** + * @return mixed + */ + public function exec() { + return curl_exec($this->handle); + } + + /** + * @param int $opt + * @return mixed + */ + public function getInfo($opt = 0) { + return curl_getinfo($this->handle, $opt); + } + + /** + * @return void + */ + public function init() { + $this->handle = $this->handle ?: curl_init(); + } + + /** + * @param array $opts + */ + public function setoptArray(array $opts) { + curl_setopt_array($this->handle, $opts); + } + + /** + * @param int $option + * @param mixed $value + * @return bool + */ + public function setopt($option, $value) { + return curl_setopt($this->handle, $option, $value); + } + + /** + * @param int $age + * @return array + */ + public static function version($age) { + return curl_version($age); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl.php new file mode 100644 index 00000000..fc8a57d6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl.php @@ -0,0 +1,101 @@ += 0) { + throw new \RuntimeException("Unsupported Curl version"); + } + } + + /** + * @param string $string + * @return string + */ + public function escape($string) { + return rawurlencode($string); + } + + /** + * @param int $bitmask + * @return int + */ + public function pause($bitmask) { + return 0; + } + + /** + * FIXME should introduce v2.10 breaking change: + * implement abstract support for FileParameter in AdapterInterface + * + * @param string|FileParameter $filepath + * @return string + */ + public function preparePostFileField($filepath) { + $mime_type = $name = ''; + if ($filepath instanceof FileParameter) { + $mime_type = $filepath->getMimeType() !== null + ? sprintf(';type=%s', $filepath->getMimeType()) + : ''; + $name = $filepath->getName() !== null + ? sprintf(';filename=%s', $filepath->getName()) + : ''; + $filepath = $filepath->getPath(); + } + return sprintf('@%s%s%s', $filepath, $mime_type, $name); + } + + /** + * @return void + */ + public function reset() { + $this->handle && curl_close($this->handle); + $this->handle = curl_init(); + } + + /** + * @param int $errornum + * @return NULL|string + */ + public static function strerror($errornum) { + return curl_strerror($errornum); + } + + /** + * @param string $string + * @return bool|string + */ + public function unescape($string) { + return curl_unescape($this->handle, $string); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl55.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl55.php new file mode 100644 index 00000000..b6d50803 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/Curl55.php @@ -0,0 +1,96 @@ +handle, $string); + } + + /** + * @param int $bitmask + * @return int + */ + public function pause($bitmask) { + return curl_pause($this->handle, $bitmask); + } + + /** + * FIXME should introduce v2.10 breaking change: + * implement abstract support for FileParameter in AdapterInterface + * + * @param string|FileParameter $filepath + * @return \CURLFile + */ + public function preparePostFileField($filepath) { + $mime_type = $name = ''; // can't be null in HHVM + if ($filepath instanceof FileParameter) { + $mime_type = $filepath->getMimeType() ?: ''; + $name = $filepath->getName() ?: ''; + $filepath = $filepath->getPath(); + } + return new \CURLFile($filepath, $mime_type, $name); + } + + /** + * @return void + */ + public function reset() { + $this->handle && curl_reset($this->handle); + } + + /** + * @param int $errornum + * @return NULL|string + */ + public static function strerror($errornum) { + return curl_strerror($errornum); + } + + /** + * @param string $string + * @return bool|string + */ + public function unescape($string) { + return curl_unescape($this->handle, $string); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/CurlInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/CurlInterface.php new file mode 100644 index 00000000..b540b2bf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Adapter/Curl/CurlInterface.php @@ -0,0 +1,106 @@ +curl = $curl ?: AbstractCurl::createOptimalVersion(); + $this->curl->init(); + } + + /** + * @return Curl + */ + public function getCurl() { + return $this->curl; + } + + /** + * @return \ArrayObject + */ + public function getOpts() { + if ($this->opts === null) { + $this->opts = new \ArrayObject(array( + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => 60, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => true, + CURLOPT_CAINFO => $this->getCaBundlePath(), + )); + } + + return $this->opts; + } + + /** + * @param \ArrayObject $opts + */ + public function setOpts(\ArrayObject $opts) { + $this->opts = $opts; + } + + /** + * @return int + */ + protected function getheaderSize() { + return $this->getCurl()->getInfo(CURLINFO_HEADER_SIZE); + } + + /** + * Extracts the headers and the body into a two-part array + * @param string $raw_response + * @return array + */ + protected function extractResponseHeadersAndBody($raw_response) { + $header_size = $this->getheaderSize(); + + $raw_headers = mb_substr($raw_response, 0, $header_size); + $raw_body = mb_substr($raw_response, $header_size); + + return array(trim($raw_headers), trim($raw_body)); + } + + /** + * @param Headers $headers + * @param string $raw_headers + */ + protected function parseHeaders(Headers $headers, $raw_headers) { + $raw_headers = str_replace("\r\n", "\n", $raw_headers); + + // There will be multiple headers if a 301 was followed + // or a proxy was followed, etc + $header_collection = explode("\n\n", trim($raw_headers)); + // We just want the last response (at the end) + $raw_headers = array_pop($header_collection); + + $header_components = explode("\n", $raw_headers); + foreach ($header_components as $line) { + if (strpos($line, ': ') === false) { + $headers['http_code'] = $line; + } else { + list ($key, $value) = explode(': ', $line, 2); + $headers[$key] = $value; + } + } + } + + /** + * @param RequestInterface $request + * @return ResponseInterface + * @throws Exception + */ + public function sendRequest(RequestInterface $request) { + $response = $this->getClient()->createResponse(); + $this->getCurl()->reset(); + $curlopts = array( + CURLOPT_URL => $request->getUrl(), + ); + + $method = $request->getMethod(); + if ($method !== RequestInterface::METHOD_GET + && $method !== RequestInterface::METHOD_POST) { + $curlopts[CURLOPT_CUSTOMREQUEST] = $method; + } + + $curlopts = $this->getOpts()->getArrayCopy() + $curlopts; + + if ($request->getHeaders()->count()) { + $headers = array(); + foreach ($request->getHeaders() as $header => $value) { + $headers[] = "{$header}: {$value}"; + } + $curlopts[CURLOPT_HTTPHEADER] = $headers; + } + + $postfields = array(); + if ($method === RequestInterface::METHOD_POST + && $request->getFileParams()->count() + ) { + $postfields = array_merge( + $postfields, + array_map( + array($this->getCurl(), 'preparePostFileField'), + $request->getFileParams()->getArrayCopy())); + } + if ($method !== RequestInterface::METHOD_GET + && $request->getBodyParams()->count()) { + $postfields + = array_merge($postfields, $request->getBodyParams()->export()); + } + + if (!empty($postfields)) { + $curlopts[CURLOPT_POSTFIELDS] = $postfields; + } + + $this->getCurl()->setoptArray($curlopts); + $raw_response = $this->getCurl()->exec(); + + $status_code = $this->getCurl()->getInfo(CURLINFO_HTTP_CODE); + $curl_errno = $this->getCurl()->errno(); + $curl_error = $curl_errno ? $this->getCurl()->error() : null; + + $response_parts = $this->extractResponseHeadersAndBody($raw_response); + + $response->setStatusCode($status_code); + $this->parseHeaders($response->getHeaders(), $response_parts[0]); + $response->setBody($response_parts[1]); + + if ($curl_errno) { + throw new Exception($curl_error, $curl_errno); + } + + return $response; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Client.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Client.php new file mode 100644 index 00000000..c5c9312e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Client.php @@ -0,0 +1,220 @@ +requestPrototype === null) { + $this->requestPrototype = new Request($this); + } + + return $this->requestPrototype; + } + + /** + * @param RequestInterface $prototype + */ + public function setRequestPrototype(RequestInterface $prototype) { + $this->requestPrototype = $prototype; + } + + /** + * @return RequestInterface + */ + public function createRequest() { + return $this->getRequestPrototype()->createClone(); + } + + /** + * @return ResponseInterface + */ + public function getResponsePrototype() { + if ($this->responsePrototype === null) { + $this->responsePrototype = new Response(); + } + + return $this->responsePrototype; + } + + /** + * @param ResponseInterface $prototype + */ + public function setResponsePrototype(ResponseInterface $prototype) { + $this->responsePrototype = $prototype; + } + + /** + * @return ResponseInterface + */ + public function createResponse() { + return clone $this->getResponsePrototype(); + } + + /** + * @return Headers + */ + public function getDefaultRequestHeaderds() { + if ($this->defaultRequestHeaders === null) { + $this->defaultRequestHeaders = new Headers(array( + 'User-Agent' => 'fbbizsdk-php-v'.ApiConfig::SDKVersion, + 'Accept-Encoding' => '*', + )); + } + + return $this->defaultRequestHeaders; + } + + /** + * @param Headers $headers + */ + public function setDefaultRequestHeaders(Headers $headers) { + $this->defaultRequestHeaders = $headers; + } + + /** + * @return string + */ + public function getDefaultGraphBaseDomain() { + return $this->defaultGraphBaseDomain; + } + + /** + * @param string $domain + */ + public function setDefaultGraphBaseDomain($domain) { + $this->defaultGraphBaseDomain = $domain; + } + + /** + * @return AdapterInterface + */ + public function getAdapter() { + if ($this->adapter === null) { + $this->adapter = new CurlAdapter($this); + } + + return $this->adapter; + } + + /** + * @param AdapterInterface $adapter + */ + public function setAdapter(AdapterInterface $adapter) { + $this->adapter = $adapter; + } + + /** + * @return string + */ + public function getCaBundlePath() { + if ($this->caBundlePath === null) { + $this->caBundlePath = __DIR__.DIRECTORY_SEPARATOR + .str_repeat('..'.DIRECTORY_SEPARATOR, 3) + .'fb_ca_chain_bundle.crt'; + } + + return $this->caBundlePath; + } + + /** + * @param string $path + */ + public function setCaBundlePath($path) { + $this->caBundlePath = $path; + } + + /** + * @param RequestInterface $request + * @return ResponseInterface + * @throws RequestException + */ + public function sendRequest(RequestInterface $request) { + $response = $this->getAdapter()->sendRequest($request); + $response->setRequest($request); + $response_content = $response->getContent(); + + if ($response_content === null) { + throw new EmptyResponseException($response); + } + + if (is_array($response_content) + && array_key_exists('error', $response_content)) { + + throw RequestException::create($response); + } + + return $response; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/AuthorizationException.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/AuthorizationException.php new file mode 100644 index 00000000..2190e80e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/AuthorizationException.php @@ -0,0 +1,29 @@ + array( + 'message' => 'Empty Response', + )); + $response->setBody(json_encode($content)); + parent::__construct($response); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/PermissionException.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/PermissionException.php new file mode 100644 index 00000000..fb87baac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/PermissionException.php @@ -0,0 +1,29 @@ +headers = $response->getHeaders(); + $this->response = $response; + $error_data = static::getErrorData($response); + + parent::__construct($error_data['message'], $error_data['code']); + + $this->errorSubcode = $error_data['error_subcode']; + $this->errorUserTitle = $error_data['error_user_title']; + $this->errorUserMessage = $error_data['error_user_msg']; + $this->errorBlameFieldSpecs = $error_data['error_blame_field_specs']; + $this->facebookTraceId = $error_data['fbtrace_id']; + } + + /** + * @return ResponseInterface|null + */ + public function getResponse() { + return $this->response; + } + + /** + * @param array|string $array + * @param string|int $key + * @param mixed $default + * @return mixed + */ + protected static function idx($array, $key, $default = null) { + if (is_string($array)) { + $array = json_decode($array, true); + } + + if (is_null($array)) { + return null; + } + + return array_key_exists($key, $array) + ? $array[$key] + : $default; + } + + /** + * @param ResponseInterface $response + * @return array + */ + protected static function getErrorData(ResponseInterface $response) { + $response_data = $response->getContent(); + if (is_null($response_data)) { + $response_data = array(); + } + $error_data = static::idx($response_data, 'error', array()); + + if (is_string(static::idx($error_data, 'error_data'))) { + $error_data["error_data"] = + json_decode(stripslashes(static::idx($error_data, 'error_data')), true); + } + + if (is_null(static::idx($error_data, 'error_data'))) { + $error_data["error_data"] = array(); + } + + return array( + 'code' => + static::idx($error_data, 'code', static::idx($response_data, 'code')), + 'error_subcode' => static::idx($error_data, 'error_subcode'), + 'message' => static::idx($error_data, 'message'), + 'error_user_title' => static::idx($error_data, 'error_user_title'), + 'error_user_msg' => static::idx($error_data, 'error_user_msg'), + 'error_blame_field_specs' => + static::idx(static::idx($error_data, 'error_data', array()), + 'blame_field_specs'), + 'fbtrace_id' => static::idx($error_data, 'fbtrace_id'), + 'type' => static::idx($error_data, 'type'), + ); + } + + /** + * Process an error payload from the Graph API and return the appropriate + * exception subclass. + * @param ResponseInterface $response + * @return RequestException + */ + public static function create(ResponseInterface $response) { + $error_data = static::getErrorData($response); + if (in_array( + $error_data['error_subcode'], array(458, 459, 460, 463, 464, 467)) + || in_array($error_data['code'], array(100, 102, 190)) + || $error_data['type'] === 'OAuthException') { + + return new AuthorizationException($response); + } elseif (in_array($error_data['code'], array(1, 2))) { + + return new ServerException($response); + } elseif (in_array($error_data['code'], array(4, 17, 341))) { + + return new ThrottleException($response); + } elseif ($error_data['code'] == 506) { + + return new ClientException($response); + } elseif ($error_data['code'] == 10 + || ($error_data['code'] >= 200 && $error_data['code'] <= 299)) { + + return new PermissionException($response); + } else { + + return new self($response); + } + } + + /** + * @return int + */ + public function getHttpStatusCode() { + return $this->response->getStatusCode(); + } + + /** + * @return int|null + */ + public function getErrorSubcode() { + return $this->errorSubcode; + } + + /** + * @return string|null + */ + public function getErrorUserTitle() { + return $this->errorUserTitle; + } + + /** + * @return string|null + */ + public function getErrorUserMessage() { + return $this->errorUserMessage; + } + + /** + * @return array|null + */ + public function getErrorBlameFieldSpecs() { + return $this->errorBlameFieldSpecs; + } + + /** + * @return string|null + */ + public function getFacebookTraceId() { + return $this->facebookTraceId; + } + + /** + * @return bool + */ + public function isTransient() { + if ($this->getResponse() !== null) { + return false; + } + + $body = $this->getResponse()->getBody(); + + return array_key_exists('error', $body) + && array_key_exists('is_transient', $body['error']) + && $body['error']['is_transient']; + } + + /** + * @return Headers + */ + public function getHeaders() { + return $this->headers; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/ServerException.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/ServerException.php new file mode 100644 index 00000000..f161327f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Exception/ServerException.php @@ -0,0 +1,29 @@ +path = $path; + } + + /** + * @return string + */ + public function getPath() { + return $this->path; + } + + /** + * @return null|string + */ + public function getMimeType() { + return $this->mimeType; + } + + /** + * @param null|string $mime_type + * @return $this + */ + public function setMimeType($mime_type) { + $this->mimeType = $mime_type; + return $this; + } + + /** + * @return null|string + */ + public function getName() { + return $this->name; + } + + /** + * @param null|string $name + * @return $this + */ + public function setName($name) { + $this->name = $name; + return $this; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Headers.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Headers.php new file mode 100644 index 00000000..6c996e67 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Headers.php @@ -0,0 +1,29 @@ + $value) { + $this[$key] = $value; + } + } + + /** + * @param mixed $value + * @return string + */ + protected function exportNonScalar($value) { + return json_encode($value); + } + + /** + * @return array + */ + public function export() { + $data = array(); + foreach ($this as $key => $value) { + $data[$key] = is_null($value) || is_scalar($value) + ? $value + : $this->exportNonScalar($value); + } + + return $data; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Request.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Request.php new file mode 100644 index 00000000..1903b865 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Request.php @@ -0,0 +1,296 @@ +client = $client; + } + + public function __clone() { + $this->queryParams && $this->queryParams = clone $this->queryParams; + $this->bodyParams && $this->bodyParams = clone $this->bodyParams; + $this->fileParams && $this->fileParams = clone $this->fileParams; + } + + /** + * @return Client + */ + public function getClient() { + return $this->client; + } + + /** + * @return string + */ + public function getProtocol() { + return $this->protocol; + } + + /** + * @param string $protocol + */ + public function setProtocol($protocol) { + $this->protocol = $protocol; + } + + /** + * @return string + */ + public function getDomain() { + if ($this->domain === null) { + $this->domain = sprintf( + "%s.%s", + Client::DEFAULT_LAST_LEVEL_DOMAIN, + $this->client->getDefaultGraphBaseDomain()); + } + + return $this->domain; + } + + /** + * @param string $domain + */ + public function setDomain($domain) { + $this->domain = $domain; + } + + /** + * @param string $last_level_domain + */ + public function setLastLevelDomain($last_level_domain) { + $this->domain = sprintf( + "%s.%s", + $last_level_domain, + $this->client->getDefaultGraphBaseDomain()); + } + + /** + * @return Headers + */ + public function getHeaders() { + if ($this->headers === null) { + $this->headers = clone $this->getClient()->getDefaultRequestHeaderds(); + } + + return $this->headers; + } + + /** + * @param Headers $headers + */ + public function setHeaders(Headers $headers) { + $this->headers = $headers; + } + + /** + * @return string + */ + public function getMethod() { + return $this->method; + } + + /** + * @param string $method + */ + public function setMethod($method) { + $this->method = $method; + } + + /** + * @return string + */ + public function getPath() { + return $this->path; + } + + /** + * @param string $path + */ + public function setPath($path) { + $this->path = $path; + } + + /** + * @return string + */ + public function getGraphVersion() { + return $this->graphVersion; + } + + /** + * @param string $version + */ + public function setGraphVersion($version) { + $this->graphVersion = $version; + } + + /** + * @return Parameters + */ + public function getQueryParams() { + if ($this->queryParams === null) { + $this->queryParams = new Parameters(); + } + + return $this->queryParams; + } + + /** + * @param Parameters $params + */ + public function setQueryParams(Parameters $params) { + $this->queryParams = $params; + } + + /** + * @return string + */ + public function getUrl() { + $delimiter = null; + if ($this->getQueryParams()->count() ) { + $delimiter = strpos($this->getPath(), '?') ? '&' : '?'; + } + return $this->getProtocol().$this->getDomain() + .'/v'.$this->getGraphVersion().$this->getPath() + .$delimiter + .http_build_query($this->getQueryParams()->export(), '', '&'); + } + + /** + * @return Parameters + */ + public function getBodyParams() { + if ($this->bodyParams === null) { + $this->bodyParams = new Parameters(); + } + + return $this->bodyParams; + } + + /** + * @param Parameters $params + */ + public function setBodyParams(Parameters $params) { + $this->bodyParams = $params; + } + + /** + * @return Parameters + */ + public function getFileParams() { + if ($this->fileParams === null) { + $this->fileParams = new Parameters(); + } + + return $this->fileParams; + } + + /** + * @param Parameters $params + */ + public function setFileParams(Parameters $params) { + $this->fileParams = $params; + } + + /** + * @return ResponseInterface + */ + public function execute() { + return $this->getClient()->sendRequest($this); + } + + /** + * @return Request + * @see RequestInterface::createClone() + */ + public function createClone() { + return clone $this; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/RequestInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/RequestInterface.php new file mode 100644 index 00000000..e711083f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/RequestInterface.php @@ -0,0 +1,169 @@ +request; + } + + /** + * @param RequestInterface $request + */ + public function setRequest(RequestInterface $request) { + $this->request = $request; + } + + /** + * @return int + */ + public function getStatusCode() { + return $this->statusCode; + } + + /** + * @param int $status_code + */ + public function setStatusCode($status_code) { + $this->statusCode = $status_code; + } + + /** + * @return Headers + */ + public function getHeaders() { + if ($this->headers === null) { + $this->headers = new Headers(); + } + + return $this->headers; + } + + /** + * @param Headers $headers + */ + public function setHeaders(Headers $headers) { + $this->headers = $headers; + } + + /** + * @return string + */ + public function getBody() { + return $this->body; + } + + /** + * @param string $body + */ + public function setBody($body) { + $this->body = $body; + $this->content = null; + } + + /** + * @return array|null + */ + public function getContent() { + if ($this->content === null) { + $this->content = json_decode($this->getBody(), true); + } + + return $this->content; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/ResponseInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/ResponseInterface.php new file mode 100644 index 00000000..09b4748b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/ResponseInterface.php @@ -0,0 +1,73 @@ + getAdapter()->setOpts( new \ArrayObject(array( + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => 60, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => true, + CURLOPT_SSL_VERIFYPEER => 0))); + } + + /** + * @return string + */ + public function getDomain() { + if ($this->domain === null) { + $this->domain = sprintf( + "%s", + self::DEFAULT_WWWW_BASE_DOMAIN); + } + + return $this->domain; + } + + /** + * @return string + */ + public function getUrl() { + $delimiter = null; + if ($this->getQueryParams()->count() ) { + $delimiter = strpos($this->getPath(), '?') ? '&' : '?'; + } + return $this->getProtocol().$this->getDomain() + .'/'.$this->getPath() + .$delimiter + .http_build_query($this->getQueryParams()->export(), '', '&'); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Util.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Util.php new file mode 100644 index 00000000..5b1646f7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Http/Util.php @@ -0,0 +1,48 @@ +handle = is_resource($handle) ? $handle : STDOUT; + } + + /** + * @return bool + */ + public function isJsonPrettyPrint() { + return $this->jsonPrettyPrint; + } + + /** + * @param bool $json_pretty_print + * @return $this + */ + public function setJsonPrettyPrint($json_pretty_print) { + $this->jsonPrettyPrint = $json_pretty_print; + return $this; + } + + /** + * @param string $method + * @return string + */ + public static function getMethodFlag($method) { + switch ($method) { + case RequestInterface::METHOD_GET: + return static::METHOD_GET_FLAG; + case RequestInterface::METHOD_PUT: + return static::METHOD_PUT_FLAG; + case RequestInterface::METHOD_DELETE: + return static::METHOD_DELETE_FLAG; + } + + return static::METHOD_DEFAULT_FLAG; + } + + /** + * @param string $method + * @param string $value + * @return string + */ + public static function getParamFlag($method, $value) { + return $method === RequestInterface::METHOD_POST + ? static::PARAM_POST_FLAG + : (strstr($value, "\n") + ? static::PARAM_URLENCODE_FLAG + : static::PARAM_DEFAULT_FLAG); + } + + /** + * @param string $string + * @param int $indent + * @return string + */ + protected function indent($string, $indent) { + return str_replace("\n", " \n".str_repeat(' ', $indent), $string); + } + + /** + * @param Parameters $params + * @param string $method + * @param bool $is_file + * @return string + */ + protected function processParams(Parameters $params, $method, $is_file) { + $chunks = array(); + if ($this->isJsonPrettyPrint()) { + $params = new JsonAwareParameters($params); + } + foreach ($params->export() as $name => $value) { + if ($is_file && $params->offsetGet($name) instanceof FileParameter) { + $value = "@" . $this->normalizeFileParam($params->offsetGet($name)); + } else { + $value = addcslashes( + strpos($value, "\n") !== false + ? $this->indent($value, 2) + : $value, + '\''); + } + $chunks[$name] = sprintf( + '-%s \'%s=%s\'', + $this->getParamFlag($method, $value), + $name, + $value); + } + + return $chunks; + } + + /** + * @param FileParameter $file_param + * @return string + */ + protected function normalizeFileParam(FileParameter $file_param) { + return sprintf('%s%s%s%s%s', + $file_param->getPath(), + $file_param->getMimeType() != null ? ";type=" : "", + $file_param->getMimeType(), + $file_param->getName() != null ? ";name=" : "", + $file_param->getName()); + } + + /** + * @param RequestInterface $request + * @return string + */ + protected function processUrl(RequestInterface $request) { + return $request->getProtocol().$request->getDomain() + .'/v'.$request->getGraphVersion().$request->getPath(); + } + + /** + * @param string $buffer + */ + protected function flush($buffer) { + fwrite($this->handle, $buffer.PHP_EOL.PHP_EOL); + } + + /** + * @param mixed $level + * @param string $message + * @param array $context + */ + public function log($level, $message, array $context = array()) { + // We only care about requests + } + + /** + * @param array $array + * @param mixed $key + * @return mixed + */ + protected function removeArrayKey(array &$array, $key) { + if (array_key_exists($key, $array)) { + $value = $array[$key]; + unset($array[$key]); + return $value; + } else { + return null; + } + } + + /** + * @param array $params + * @return array + */ + protected function sortParams(array $params) { + $access_token = $this->removeArrayKey($params, 'access_token'); + $appsecret_proof = $this->removeArrayKey($params, 'appsecret_proof'); + $access_token !== null && $params['access_token'] = $access_token; + $appsecret_proof !== null && $params['appsecret_proof'] = $appsecret_proof; + + return $params; + } + + /** + * @param string $level + * @param RequestInterface $request + * @param array $context + */ + public function logRequest( + $level, RequestInterface $request, array $context = array()) { + + $new_line = ' \\'.PHP_EOL.' '; + $method = $request->getMethod(); + $method_flag = static::getMethodFlag($method); + $params = $this->sortParams(array_merge( + $this->processParams($request->getQueryParams(), $method, false), + $this->processParams($request->getBodyParams(), $method, false), + $this->processParams($request->getFileParams(), $method, true))); + + $buffer = 'curl'.($method_flag ? ' -'.$method_flag : ''); + foreach ($params as $param) { + $buffer .= $new_line.$param; + } + $buffer .= $new_line.$this->processUrl($request); + + $this->flush($buffer); + } + + /** + * @param string $level + * @param ResponseInterface $response + * @param array $context + */ + public function logResponse( + $level, ResponseInterface $response, array $context = array()) { + // We only care about requests + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonAwareParameters.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonAwareParameters.php new file mode 100644 index 00000000..cbb9ff84 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonAwareParameters.php @@ -0,0 +1,38 @@ +encode(); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonNode.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonNode.php new file mode 100644 index 00000000..64c8b5b2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/CurlLogger/JsonNode.php @@ -0,0 +1,196 @@ + $sub) { + $object->getChildren()->offsetSet($key, self::factory($sub)); + } + // fallthrough + case is_null($value) || is_scalar($value): + $object->setValue($value); + break; + default: + throw new \InvalidArgumentException( + gettype($value).' can\'t be encoded'); + } + + return $object; + } + + public function __construct() { + $this->children = new \ArrayObject(); + } + + /** + * @return mixed + */ + public function getValue() { + return $this->value; + } + + /** + * @param mixed $value + * @return $this + */ + public function setValue($value) { + $this->value = $value; + + return $this; + } + + /** + * @return \ArrayObject + */ + public function getChildren() { + return $this->children; + } + + /** + * @return int + */ + public function getMaxTreeChildrenCount() { + $max = $this->getChildren()->count(); + + /** @var JsonNode $child */ + foreach ($this->getChildren() as $child) { + $ith = $child->getMaxTreeChildrenCount(); + $max = $ith > $max ? $ith : $max; + } + + return $max; + } + + /** + * @param int $indent + * @return string + */ + protected function getPadding($indent) { + return str_repeat(' ', $indent * self::INDENT_UNIT); + } + + /** + * @return mixed + */ + protected function getLastChildKey() { + if ($this->getChildren()->count() === 0) { + return null; + } + + $copy = $this->getChildren()->getArrayCopy(); + end($copy); + + return key($copy); + } + + /** + * @param int $indent + * @return string + */ + protected function encodeList($indent) { + $value = $this->getValue(); + if (empty($value) || (array_keys($value) === range(0, count($value) - 1))) { + $is_map = false; + } else { + $is_map = true; + } + + ++$indent; + $last_key = $this->getLastChildKey(); + + $buffer = ($is_map ? '{' : '[')."\n"; + + /** @var JsonNode $child */ + foreach ($this->getChildren() as $key => $child) { + $buffer .= sprintf( + "%s%s%s%s\n", + $this->getPadding($indent), + $is_map ? sprintf("%s: ", json_encode($key)) : '', + $child->encode($indent), + $key === $last_key ? '' : ','); + } + + --$indent; + $buffer .= $this->getPadding($indent).($is_map ? '}' : ']'); + + return $buffer; + } + + /** + * @param int $indent + * @return string + */ + public function encode($indent = 0) { + $value = $this->getValue(); + if (is_array($value) || is_object($value)) { + if ($this->getMaxTreeChildrenCount() > 2) { + return $this->encodeList($indent); + } + + $ugly = json_encode($value); + $output_prediction = $this->getPadding($indent).$ugly; + if (strlen($output_prediction) > self::EXPLOSION_THRESHOLD) { + return $this->encodeList($indent); + } + + return $ugly; + } + + return json_encode($value); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/LoggerInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/LoggerInterface.php new file mode 100644 index 00000000..30c3de84 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Logger/LoggerInterface.php @@ -0,0 +1,54 @@ +getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_POST, + array_merge($params, array( + $this->getStatusParamName() => static::STATUS_ARCHIVED))); + } + + /** + * Delete this object + * + * @deprecated use api_update instead + * @param array $params + * @return void + */ + public function delete(array $params = array()) { + $this->getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_POST, + array_merge($params, array( + $this->getStatusParamName() => static::STATUS_DELETED))); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractCrudObject.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractCrudObject.php new file mode 100644 index 00000000..7b79916c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractCrudObject.php @@ -0,0 +1,531 @@ +data[static::FIELD_ID] = $id; + + if (!is_null($parent_id)) { + $warning_message = "\$parent_id as a parameter of constructor is being " . + "deprecated, please try not to use this in new code.\n"; + trigger_error($warning_message, E_USER_DEPRECATED); + } + $this->parentId = $parent_id; + + $this->api = static::assureApi($api); + } + + /** + * @param string $id + */ + public function setId($id) { + $this->data[static::FIELD_ID] = $id; + return $this; + } + /** + * @deprecated deprecate parent_id in AbstractCrudObject + * @param string $parent_id + */ + public function setParentId($parent_id) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + $this->parentId = $parent_id; + return $this; + } + /** + * @param Api $api The Api instance this object should use to make calls + */ + public function setApi(Api $api) { + $this->api = static::assureApi($api); + return $this; + } + /** + * @deprecated getEndpoint function is deprecated + * @return string + */ + protected function getEndpoint() { + return null; + } + /** + * @param Api|null $instance + * @return Api + * @throws \InvalidArgumentException + */ + protected static function assureApi(Api $instance = null) { + $instance = $instance ?: Api::instance(); + if (!$instance) { + throw new \InvalidArgumentException( + 'An Api instance must be provided as argument or '. + 'set as instance in the \FacebookAds\Api'); + } + return $instance; + } + /** + * @deprecated deprecate parent_id in AbstractCrudObject + * @return string|null + */ + public function getParentId() { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + return $this->parentId; + } + /** + * @deprecated deprecate parent_id in AbstractCrudObject + * @return string + * @throws \Exception + */ + protected function assureParentId() { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + if (!$this->parentId) { + throw new \Exception("A parent ID is required."); + } + return $this->parentId; + } + /** + * @return string + * @throws \Exception + */ + protected function assureId() { + if (!$this->data[static::FIELD_ID]) { + throw new \Exception("field '".static::FIELD_ID."' is required."); + } + return (string) $this->data[static::FIELD_ID]; + } + /** + * @return Api + */ + public function getApi() { + return $this->api; + } + /** + * Get the values which have changed + * + * @return array Key value pairs of changed variables + */ + public function getChangedValues() { + return $this->changedFields; + } + /** + * Get the name of the fields that have changed + * + * @return array Array of changed field names + */ + public function getChangedFields() { + return array_keys($this->changedFields); + } + /** + * Get the values which have changed, converting them to scalars + */ + public function exportData() { + $data = array(); + foreach ($this->changedFields as $key => $val) { + $data[$key] = parent::exportValue($val); + } + return $data; + } + /** + * @return void + */ + protected function clearHistory() { + $this->changedFields = array(); + } + /** + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) { + if (!array_key_exists($name, $this->data) + || $this->data[$name] !== $value) { + $this->changedFields[$name] = $value; + } + parent::__set($name, $value); + } + /** + * @param string[] $fields + */ + public static function setDefaultReadFields(array $fields = array()) { + static::$defaultReadFields = $fields; + } + /** + * @return string[] + */ + public static function getDefaultReadFields() { + return static::$defaultReadFields; + } + /** + * @return string + */ + protected function getNodePath() { + return '/'.$this->assureId(); + } + /** + * @deprecated + * use (ParentObject)->creatXXX() instead + * Create function for the object. + * + * @param array $params Additional parameters to include in the request + * @return $this + * @throws \Exception + */ + public function create(array $params = array()) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + if ($this->data[static::FIELD_ID]) { + throw new \Exception("Object has already an ID"); + } + $response = $this->getApi()->call( + '/'.$this->assureParentId().'/'.$this->getEndpoint(), + RequestInterface::METHOD_POST, + array_merge($this->exportData(), $params)); + $this->clearHistory(); + $data = $response->getContent(); + if (!isset($params['execution_options'])){ + $id = is_string($data) ? $data : $data[static::FIELD_ID]; + /** @var AbstractCrudObject $this */ + if ($this instanceof CanRedownloadInterface + && isset($params[CanRedownloadInterface::PARAM_REDOWNLOAD]) + && $params[CanRedownloadInterface::PARAM_REDOWNLOAD] === true + && isset($data['data'][$id]) + && is_array($data['data'][$id]) + ) { + $this->setDataWithoutValidation($data['data'][$id]); + } + $this->data[static::FIELD_ID] = (string) $id; + } + return $this; + } + /** + * @deprecated + * use getSelf() instead + * Read object data from the graph + * + * @param string[] $fields Fields to request + * @param array $params Additional request parameters + * @return $this + */ + public function read(array $fields = array(), array $params = array()) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + $fields = implode(',', $fields ?: static::getDefaultReadFields()); + if ($fields) { + $params['fields'] = $fields; + } + $response = $this->getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_GET, + $params); + $this->setDataWithoutValidation($response->getContent()); + $this->clearHistory(); + return $this; + } + /** + * @deprecated + * use updateSelf() instead + * Update the object. Function parameters are similar with the create function + * + * @param array $params Update parameters in assoc + * @return $this + */ + public function update(array $params = array()) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + $this->getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_POST, + array_merge($this->exportData(), $params)); + $this->clearHistory(); + return $this; + } + /** + * @deprecated + * use deleteSelf() in each subclass + * Delete this object from the graph + * + * @param array $params + * @return void + */ + public function deleteSelf(array $params = array()) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + $this->getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_DELETE, + $params); + } + /** + * @deprecated + * deprecate with ObjectValidation + * Perform object upsert + * + * Helper function which determines whether an object should be created or + * updated + * + * @param array $params + * @return $this + */ + public function save(array $params = array()) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + if ($this->data[static::FIELD_ID]) { + return $this->update($params); + } else { + return $this->create($params); + } + } + /** + * @deprecated + * deprecate with getEndpoint + * @param string $prototype_class + * @param string $endpoint + * @return string + * @throws \InvalidArgumentException + */ + protected function assureEndpoint($prototype_class, $endpoint) { + $warning_message = sprintf('%s is being deprecated, please try not to use'. + ' this in new code.',__FUNCTION__); + trigger_error($warning_message, E_USER_DEPRECATED); + if (!$endpoint) { + $prototype = new $prototype_class(null, null, $this->getApi()); + if (!$prototype instanceof AbstractCrudObject) { + throw new \InvalidArgumentException('Either prototype must be instance + of AbstractCrudObject or $endpoint must be given'); + } + $endpoint = $prototype->getEndpoint(); + } + return $endpoint; + } + /** + * @param array $fields + * @param array $params + * @param string $prototype_class + * @param string|null $endpoint + * @return ResponseInterface + */ + protected function fetchConnection( + array $fields = array(), + array $params = array(), + $prototype_class, + $endpoint = null) { + $fields = implode(',', $fields ?: static::getDefaultReadFields()); + if ($fields) { + $params['fields'] = $fields; + } + $endpoint = $this->assureEndpoint($prototype_class, $endpoint); + return $this->getApi()->call( + '/'.$this->assureId().'/'.$endpoint, + RequestInterface::METHOD_GET, + $params); + } + /** + * Read a single connection object + * + * @param string $prototype_class + * @param array $fields Fields to request + * @param array $params Additional filters for the reading + * @param string|null $endpoint + * @return AbstractObject + */ + protected function getOneByConnection( + $prototype_class, + array $fields = array(), + array $params = array(), + $endpoint = null) { + $response = $this->fetchConnection( + $fields, $params, $prototype_class, $endpoint); + if (!$response->getContent()) { + return null; + } + $object = new $prototype_class( + null, null, $this->getApi()); + /** @var AbstractCrudObject $object */ + $object->setDataWithoutValidation($response->getContent()); + return $object; + } + /** + * Read objects from a connection + * + * @param string $prototype_class + * @param array $fields Fields to request + * @param array $params Additional filters for the reading + * @param string|null $endpoint + * @return Cursor + */ + protected function getManyByConnection( + $prototype_class, + array $fields = array(), + array $params = array(), + $endpoint = null) { + $response = $this->fetchConnection( + $fields, $params, $prototype_class, $endpoint); + return new Cursor( + $response, + new $prototype_class(null, null, $this->getApi())); + } + /** + * @param string $job_class + * @param array $fields + * @param array $params + * @return AbstractAsyncJobObject + * @throws \InvalidArgumentException + */ + protected function createAsyncJob( + $job_class, + array $fields = array(), + array $params = array()) { + $object = new $job_class(null, $this->assureId(), $this->getApi()); + if (!$object instanceof AbstractAsyncJobObject) { + throw new \InvalidArgumentException( + "Class {$job_class} is not of type " + .AbstractAsyncJobObject::className()); + } + $params['fields'] = $fields; + return $object->create($params); + } + /** + * Delete objects. + * + * Used batch API calls to delete multiple objects at once + * + * @param string[] $ids Array or single Object ID to delete + * @param Api $api Api Object to use + * @return bool Returns true on success + */ + public static function deleteIds(array $ids, Api $api = null) { + $batch = array(); + foreach ($ids as $id) { + $request = array( + 'relative_url' => '/'.$id, + 'method' => RequestInterface::METHOD_DELETE, + ); + $batch[] = $request; + } + $api = static::assureApi($api); + $response = $api->call( + '/', + RequestInterface::METHOD_POST, + array('batch' => json_encode($batch))); + foreach ($response->getContent() as $result) { + if (200 != $result['code']) { + return false; + } + } + return true; + } + /** + * Read function for the object. Convert fields and filters into the query + * part of uri and return objects. + * + * @param mixed $ids Array or single object IDs + * @param array $fields Array of field names to read + * @param array $params Additional filters for the reading, in assoc + * @param Api $api Api Object to use + * @return Cursor + */ + public static function readIds( + array $ids, + array $fields = array(), + array $params = array(), + Api $api = null) { + if (empty($fields)) { + $fields = static::getDefaultReadFields(); + } + if (!empty($fields)) { + $params['fields'] = implode(',', $fields); + } + $params['ids'] = implode(',', $ids); + $api = static::assureApi($api); + $response = $api->call('/', RequestInterface::METHOD_GET, $params); + $result = array(); + foreach ($response->getContent() as $data) { + /** @var AbstractObject $object */ + $object = new static(null, null, $api); + $object->setDataWithoutValidation((array) $data); + $result[] = $object; + } + return $result; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractObject.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractObject.php new file mode 100644 index 00000000..1f5d434f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AbstractObject.php @@ -0,0 +1,185 @@ +data = static::getFieldsEnum()->getValuesMap(); + $this->_type_checker = new TypeChecker( + static::getFieldTypes(), static::getReferencedEnums()); + } + + protected static function getFieldTypes() { + $fields_enum = static::getFieldsEnum(); + if (method_exists($fields_enum, 'getFieldTypes')) { + return $fields_enum->getFieldTypes(); + } else { + return array(); + } + } + + protected static function getReferencedEnums() { + return array(); + } + + /** + * @param string $name + * @param mixed $value + */ + public function __set($name, $value) { + if (ApiConfig::TYPE_CHECKER_STRICT_MODE + && $this->_type_checker->isValidParam($name) + ) { + if ($this->_type_checker->isValidParamPair($name, $value)) { + $this->data[$name] = $value; + } else { + throw new \InvalidArgumentException( + $name." and ".$this->exportValue($value) + ." are not a valid type value pair"); + } + } else { + $this->data[$name] = $value; + } + return $this; + } + + /** + * @param string $name + * @return mixed + * @throws \InvalidArgumentException + */ + public function __get($name) { + if (array_key_exists($name, $this->data)) { + return $this->data[$name]; + } else { + throw new \InvalidArgumentException( + $name.' is not a field of '.get_class($this)); + } + } + /** + * @param string $name + * @return boolean + */ + public function __isset($name) { + return array_key_exists($name, $this->data); + } + /** + * @param array + * @return $this + */ + public function setData(array $data) { + foreach ($data as $key => $value) { + $this->{$key} = $value; + } + // Handle class-specific situations + if (method_exists($this, 'setDataTrigger')) { + $this->setDataTrigger($data); + } + + return $this; + } + /** + * Like setData but will skip field validation + * + * @param array + * @return $this + */ + public function setDataWithoutValidation(array $data) { + foreach ($data as $key => $value) { + $this->data[$key] = $value; + } + // Handle class-specific situations + if (method_exists($this, 'setDataTrigger')) { + $this->setDataTrigger($data); + } + return $this; + } + /** + * @return array + */ + public function getData() { + return $this->data; + } + /** + * @param mixed $value + * @return mixed + */ + protected function exportValue($value) { + $result = $value; + switch (true) { + case $value === null: + break; + case $value instanceof AbstractObject: + $result = $value->exportData(); + break; + case is_array($value): + $result = array(); + foreach ($value as $key => $sub_value) { + if ($sub_value !== null) { + $result[$key] = $this->exportValue($sub_value); + } + } + break; + } + return $result; + } + /** + * @return array + */ + public function exportData() { + return $this->exportValue($this->data); + } + /** + * @return array + */ + public function exportAllData() { + return $this->exportValue($this->data); + } + /** + * @return EmptyEnum + */ + public static function getFieldsEnum() { + return EmptyEnum::getInstance(); + } + /** + * @return array + */ + public static function getFields() { + return static::getFieldsEnum()->getValues(); + } + /** + * @return string + */ + public static function className() { + return get_called_class(); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Ad.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Ad.php new file mode 100644 index 00000000..e1d862ac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Ad.php @@ -0,0 +1,516 @@ +getValues(); + $ref_enums['ConfiguredStatus'] = AdConfiguredStatusValues::getInstance()->getValues(); + $ref_enums['EffectiveStatus'] = AdEffectiveStatusValues::getInstance()->getValues(); + $ref_enums['Status'] = AdStatusValues::getInstance()->getValues(); + $ref_enums['DatePreset'] = AdDatePresetValues::getInstance()->getValues(); + $ref_enums['ExecutionOptions'] = AdExecutionOptionsValues::getInstance()->getValues(); + $ref_enums['Operator'] = AdOperatorValues::getInstance()->getValues(); + $ref_enums['StatusOption'] = AdStatusOptionValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAdCreatives(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adcreatives', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'execution_options' => 'list', + ); + $enums = array( + 'execution_options_enum' => AdExecutionOptionsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adlabels', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdRulesGoverned(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'pass_evaluation' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adrules_governed', + new AdRule(), + 'EDGE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCopies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'time_range' => 'Object', + 'updated_since' => 'int', + ); + $enums = array( + 'date_preset_enum' => AdDatePresetValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/copies', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCopy(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adset_id' => 'string', + 'rename_options' => 'Object', + 'status_option' => 'status_option_enum', + ); + $enums = array( + 'status_option_enum' => AdStatusOptionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/copies', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new AdsInsights(), + 'EDGE', + AdsInsights::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsightsAsync(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/insights', + new AdReportRun(), + 'EDGE', + AdReportRun::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLeads(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/leads', + new Lead(), + 'EDGE', + Lead::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPreviews(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_format' => 'ad_format_enum', + 'dynamic_asset_label' => 'string', + 'dynamic_creative_spec' => 'Object', + 'dynamic_customization' => 'Object', + 'end_date' => 'datetime', + 'height' => 'unsigned int', + 'locale' => 'string', + 'place_page_id' => 'int', + 'post' => 'Object', + 'product_item_ids' => 'list', + 'render_type' => 'render_type_enum', + 'start_date' => 'datetime', + 'width' => 'unsigned int', + ); + $enums = array( + 'ad_format_enum' => AdPreviewAdFormatValues::getInstance()->getValues(), + 'render_type_enum' => AdPreviewRenderTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/previews', + new AdPreview(), + 'EDGE', + AdPreview::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingSentenceLines(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingsentencelines', + new TargetingSentenceLine(), + 'EDGE', + TargetingSentenceLine::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'am_call_tags' => 'map', + 'date_preset' => 'date_preset_enum', + 'from_adtable' => 'bool', + 'review_feedback_breakdown' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => array( + 'last_14d', + 'last_28d', + 'last_30d', + 'last_3d', + 'last_7d', + 'last_90d', + 'last_month', + 'last_quarter', + 'last_week_mon_sun', + 'last_week_sun_sat', + 'last_year', + 'lifetime', + 'this_month', + 'this_quarter', + 'this_week_mon_today', + 'this_week_sun_today', + 'this_year', + 'today', + 'yesterday', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Ad(), + 'NODE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'adset_spec' => 'AdSet', + 'audience_id' => 'string', + 'bid_amount' => 'int', + 'creative' => 'AdCreative', + 'display_sequence' => 'unsigned int', + 'draft_adgroup_id' => 'string', + 'engagement_audience' => 'bool', + 'execution_options' => 'list', + 'include_demolink_hashes' => 'bool', + 'name' => 'string', + 'priority' => 'unsigned int', + 'status' => 'status_enum', + 'tracking_specs' => 'Object', + ); + $enums = array( + 'execution_options_enum' => AdExecutionOptionsValues::getInstance()->getValues(), + 'status_enum' => AdStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Ad(), + 'NODE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccount.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccount.php new file mode 100644 index 00000000..3fa45974 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccount.php @@ -0,0 +1,3037 @@ +getValues(); + $ref_enums['PermittedTasks'] = AdAccountPermittedTasksValues::getInstance()->getValues(); + $ref_enums['Tasks'] = AdAccountTasksValues::getInstance()->getValues(); + $ref_enums['ClaimObjective'] = AdAccountClaimObjectiveValues::getInstance()->getValues(); + $ref_enums['ContentType'] = AdAccountContentTypeValues::getInstance()->getValues(); + $ref_enums['Subtype'] = AdAccountSubtypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getActivities(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'add_children' => 'bool', + 'after' => 'string', + 'business_id' => 'string', + 'category' => 'category_enum', + 'data_source' => 'data_source_enum', + 'extra_oids' => 'list', + 'limit' => 'int', + 'oid' => 'string', + 'since' => 'datetime', + 'uid' => 'int', + 'until' => 'datetime', + ); + $enums = array( + 'category_enum' => AdActivityCategoryValues::getInstance()->getValues(), + 'data_source_enum' => AdActivityDataSourceValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/activities', + new AdActivity(), + 'EDGE', + AdActivity::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdPlacePageSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_place_page_sets', + new AdPlacePageSet(), + 'EDGE', + AdPlacePageSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdPlacePageSet(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'category' => 'category_enum', + 'location_types' => 'list', + 'name' => 'string', + 'parent_page' => 'string', + 'targeted_area_type' => 'targeted_area_type_enum', + ); + $enums = array( + 'category_enum' => AdPlacePageSetCategoryValues::getInstance()->getValues(), + 'location_types_enum' => AdPlacePageSetLocationTypesValues::getInstance()->getValues(), + 'targeted_area_type_enum' => AdPlacePageSetTargetedAreaTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/ad_place_page_sets', + new AdPlacePageSet(), + 'EDGE', + AdPlacePageSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdPlacePageSetsAsync(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'category' => 'category_enum', + 'location_types' => 'list', + 'name' => 'string', + 'parent_page' => 'string', + 'targeted_area_type' => 'targeted_area_type_enum', + ); + $enums = array( + 'category_enum' => AdPlacePageSetCategoryValues::getInstance()->getValues(), + 'location_types_enum' => AdPlacePageSetLocationTypesValues::getInstance()->getValues(), + 'targeted_area_type_enum' => AdPlacePageSetTargetedAreaTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/ad_place_page_sets_async', + new AdPlacePageSet(), + 'EDGE', + AdPlacePageSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdCreatives(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adcreatives', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdCreative(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'actor_id' => 'unsigned int', + 'adlabels' => 'list', + 'applink_treatment' => 'applink_treatment_enum', + 'asset_feed_spec' => 'Object', + 'authorization_category' => 'authorization_category_enum', + 'body' => 'string', + 'branded_content_sponsor_page_id' => 'string', + 'bundle_folder_id' => 'string', + 'call_to_action' => 'Object', + 'categorization_criteria' => 'categorization_criteria_enum', + 'category_media_source' => 'category_media_source_enum', + 'destination_set_id' => 'string', + 'dynamic_ad_voice' => 'dynamic_ad_voice_enum', + 'enable_launch_instant_app' => 'bool', + 'image_crops' => 'map', + 'image_file' => 'string', + 'image_hash' => 'string', + 'image_url' => 'string', + 'instagram_actor_id' => 'string', + 'instagram_permalink_url' => 'string', + 'instagram_user_id' => 'string', + 'instant_checkout_setting' => 'instant_checkout_setting_enum', + 'interactive_components_spec' => 'map', + 'is_dco_internal' => 'bool', + 'link_og_id' => 'string', + 'link_url' => 'string', + 'messenger_sponsored_message' => 'string', + 'name' => 'string', + 'object_id' => 'unsigned int', + 'object_story_id' => 'string', + 'object_story_spec' => 'AdCreativeObjectStorySpec', + 'object_type' => 'string', + 'object_url' => 'string', + 'platform_customizations' => 'Object', + 'playable_asset_id' => 'string', + 'portrait_customizations' => 'map', + 'product_set_id' => 'string', + 'recommender_settings' => 'map', + 'source_instagram_media_id' => 'string', + 'template_url' => 'string', + 'template_url_spec' => 'Object', + 'thumbnail_url' => 'string', + 'title' => 'string', + 'url_tags' => 'string', + 'use_page_actor_override' => 'bool', + ); + $enums = array( + 'applink_treatment_enum' => AdCreativeApplinkTreatmentValues::getInstance()->getValues(), + 'authorization_category_enum' => AdCreativeAuthorizationCategoryValues::getInstance()->getValues(), + 'categorization_criteria_enum' => AdCreativeCategorizationCriteriaValues::getInstance()->getValues(), + 'category_media_source_enum' => AdCreativeCategoryMediaSourceValues::getInstance()->getValues(), + 'dynamic_ad_voice_enum' => AdCreativeDynamicAdVoiceValues::getInstance()->getValues(), + 'instant_checkout_setting_enum' => AdCreativeInstantCheckoutSettingValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adcreatives', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdCreativesByLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_label_ids' => 'list', + 'operator' => 'operator_enum', + ); + $enums = array( + 'operator_enum' => AdCreativeOperatorValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adcreativesbylabels', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAdImages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'hash' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/adimages', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdImages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'biz_tag_id' => 'unsigned int', + 'business_id' => 'string', + 'hashes' => 'list', + 'minheight' => 'unsigned int', + 'minwidth' => 'unsigned int', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adimages', + new AdImage(), + 'EDGE', + AdImage::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdImage(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bytes' => 'Object', + 'copy_from' => 'Object', + 'filename' => 'file' + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adimages', + new AdImage(), + 'EDGE', + AdImage::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums), + true + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adlabels', + new AdLabel(), + 'EDGE', + AdLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adlabels', + new AdLabel(), + 'EDGE', + AdLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdPlayables(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adplayables', + new PlayableContent(), + 'EDGE', + PlayableContent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdPlayable(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'string', + 'name' => 'string', + 'session_id' => 'string', + 'source' => 'file', + 'source_url' => 'string', + 'source_zip' => 'file', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adplayables', + new PlayableContent(), + 'EDGE', + PlayableContent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdRulesHistory(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + 'evaluation_type' => 'evaluation_type_enum', + 'hide_no_changes' => 'bool', + 'object_id' => 'string', + ); + $enums = array( + 'action_enum' => AdAccountAdRulesHistoryActionValues::getInstance()->getValues(), + 'evaluation_type_enum' => AdAccountAdRulesHistoryEvaluationTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adrules_history', + new AdAccountAdRulesHistory(), + 'EDGE', + AdAccountAdRulesHistory::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdRulesLibrary(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adrules_library', + new AdRule(), + 'EDGE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdRulesLibrary(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'evaluation_spec' => 'Object', + 'execution_spec' => 'Object', + 'name' => 'string', + 'schedule_spec' => 'Object', + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => AdRuleStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adrules_library', + new AdRule(), + 'EDGE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'time_range' => 'Object', + 'updated_since' => 'int', + ); + $enums = array( + 'date_preset_enum' => AdDatePresetValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAd(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'adset_id' => 'unsigned int', + 'adset_spec' => 'AdSet', + 'audience_id' => 'string', + 'bid_amount' => 'int', + 'creative' => 'AdCreative', + 'date_format' => 'string', + 'display_sequence' => 'unsigned int', + 'draft_adgroup_id' => 'string', + 'engagement_audience' => 'bool', + 'execution_options' => 'list', + 'include_demolink_hashes' => 'bool', + 'name' => 'string', + 'priority' => 'unsigned int', + 'source_ad_id' => 'string', + 'status' => 'status_enum', + 'tracking_specs' => 'Object', + ); + $enums = array( + 'execution_options_enum' => AdExecutionOptionsValues::getInstance()->getValues(), + 'status_enum' => AdStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/ads', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums), + true + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdsVolume(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'page_id' => 'int', + 'recommendation_type' => 'recommendation_type_enum', + 'show_breakdown_by_actor' => 'bool', + ); + $enums = array( + 'recommendation_type_enum' => AdAccountAdVolumeRecommendationTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads_volume', + new AdAccountAdVolume(), + 'EDGE', + AdAccountAdVolume::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdsByLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_label_ids' => 'list', + 'operator' => 'operator_enum', + ); + $enums = array( + 'operator_enum' => AdOperatorValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adsbylabels', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'is_completed' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => AdSetDatePresetValues::getInstance()->getValues(), + 'effective_status_enum' => AdSetEffectiveStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdSet(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'adset_schedule' => 'list', + 'attribution_spec' => 'list', + 'bid_adjustments' => 'Object', + 'bid_amount' => 'int', + 'bid_constraints' => 'map', + 'bid_strategy' => 'bid_strategy_enum', + 'billing_event' => 'billing_event_enum', + 'campaign_id' => 'string', + 'campaign_spec' => 'Object', + 'creative_sequence' => 'list', + 'daily_budget' => 'unsigned int', + 'daily_imps' => 'unsigned int', + 'daily_min_spend_target' => 'unsigned int', + 'daily_spend_cap' => 'unsigned int', + 'date_format' => 'string', + 'destination_type' => 'destination_type_enum', + 'end_time' => 'datetime', + 'execution_options' => 'list', + 'frequency_control_specs' => 'list', + 'full_funnel_exploration_mode' => 'full_funnel_exploration_mode_enum', + 'is_dynamic_creative' => 'bool', + 'lifetime_budget' => 'unsigned int', + 'lifetime_imps' => 'unsigned int', + 'lifetime_min_spend_target' => 'unsigned int', + 'lifetime_spend_cap' => 'unsigned int', + 'line_number' => 'unsigned int', + 'multi_optimization_goal_weight' => 'multi_optimization_goal_weight_enum', + 'name' => 'string', + 'optimization_goal' => 'optimization_goal_enum', + 'optimization_sub_event' => 'optimization_sub_event_enum', + 'pacing_type' => 'list', + 'promoted_object' => 'Object', + 'rb_prediction_id' => 'string', + 'rf_prediction_id' => 'string', + 'source_adset_id' => 'string', + 'start_time' => 'datetime', + 'status' => 'status_enum', + 'targeting' => 'Targeting', + 'time_based_ad_rotation_id_blocks' => 'list>', + 'time_based_ad_rotation_intervals' => 'list', + 'time_start' => 'datetime', + 'time_stop' => 'datetime', + 'topline_id' => 'string', + 'tune_for_category' => 'tune_for_category_enum', + 'upstream_events' => 'map', + ); + $enums = array( + 'bid_strategy_enum' => AdSetBidStrategyValues::getInstance()->getValues(), + 'billing_event_enum' => AdSetBillingEventValues::getInstance()->getValues(), + 'destination_type_enum' => AdSetDestinationTypeValues::getInstance()->getValues(), + 'execution_options_enum' => AdSetExecutionOptionsValues::getInstance()->getValues(), + 'full_funnel_exploration_mode_enum' => AdSetFullFunnelExplorationModeValues::getInstance()->getValues(), + 'multi_optimization_goal_weight_enum' => AdSetMultiOptimizationGoalWeightValues::getInstance()->getValues(), + 'optimization_goal_enum' => AdSetOptimizationGoalValues::getInstance()->getValues(), + 'optimization_sub_event_enum' => AdSetOptimizationSubEventValues::getInstance()->getValues(), + 'status_enum' => AdSetStatusValues::getInstance()->getValues(), + 'tune_for_category_enum' => AdSetTuneForCategoryValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdSetsByLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_label_ids' => 'list', + 'operator' => 'operator_enum', + ); + $enums = array( + 'operator_enum' => AdSetOperatorValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adsetsbylabels', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdsPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'sort_by' => 'sort_by_enum', + ); + $enums = array( + 'sort_by_enum' => AdsPixelSortByValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adspixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdsPixel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adspixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdvertisableApplications(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'string', + 'business_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/advertisable_applications', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAdVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'video_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/advideos', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'max_aspect_ratio' => 'float', + 'maxheight' => 'unsigned int', + 'maxlength' => 'unsigned int', + 'maxwidth' => 'unsigned int', + 'min_aspect_ratio' => 'float', + 'minheight' => 'unsigned int', + 'minlength' => 'unsigned int', + 'minwidth' => 'unsigned int', + 'title' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/advideos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaptive_type' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'attribution_app_id' => 'string', + 'audio_story_wave_animation_handle' => 'string', + 'chunk_session_id' => 'string', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'container_type' => 'container_type_enum', + 'content_category' => 'content_category_enum', + 'creative_tools' => 'string', + 'description' => 'string', + 'embeddable' => 'bool', + 'end_offset' => 'unsigned int', + 'fbuploader_video_file_chunk' => 'string', + 'file_size' => 'unsigned int', + 'file_url' => 'string', + 'fisheye_video_cropped' => 'bool', + 'formatting' => 'formatting_enum', + 'fov' => 'unsigned int', + 'front_z_rotation' => 'float', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'guide' => 'list>', + 'guide_enabled' => 'bool', + 'has_nickname' => 'bool', + 'holiday_card' => 'string', + 'initial_heading' => 'unsigned int', + 'initial_pitch' => 'unsigned int', + 'instant_game_entry_point_data' => 'string', + 'is_boost_intended' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_voice_clip' => 'bool', + 'location_source_id' => 'string', + 'name' => 'string', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_suggestion_mechanism' => 'string', + 'original_fov' => 'unsigned int', + 'original_projection_type' => 'original_projection_type_enum', + 'publish_event_id' => 'unsigned int', + 'react_mode_metadata' => 'string', + 'referenced_sticker_id' => 'string', + 'replace_video_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'slideshow_spec' => 'map', + 'source' => 'file', + 'source_instagram_media_id' => 'string', + 'spherical' => 'bool', + 'start_offset' => 'unsigned int', + 'swap_mode' => 'swap_mode_enum', + 'text_format_metadata' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumb' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'transcode_setting_properties' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'upload_phase' => 'upload_phase_enum', + 'upload_session_id' => 'string', + 'upload_setting_properties' => 'string', + 'video_file_chunk' => 'file', + 'video_id_original' => 'string', + 'video_start_time_ms' => 'unsigned int', + 'waterfall_id' => 'string', + ); + $enums = array( + 'container_type_enum' => AdVideoContainerTypeValues::getInstance()->getValues(), + 'content_category_enum' => AdVideoContentCategoryValues::getInstance()->getValues(), + 'formatting_enum' => AdVideoFormattingValues::getInstance()->getValues(), + 'original_projection_type_enum' => AdVideoOriginalProjectionTypeValues::getInstance()->getValues(), + 'swap_mode_enum' => AdVideoSwapModeValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => AdVideoUnpublishedContentTypeValues::getInstance()->getValues(), + 'upload_phase_enum' => AdVideoUploadPhaseValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/advideos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums), + true, + true + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAffectedAdSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/affectedadsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/agencies', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAgency(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + 'permitted_tasks' => 'list', + ); + $enums = array( + 'permitted_tasks_enum' => AdAccountPermittedTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/agencies', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getApplications(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/applications', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/assigned_users', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_users', + new AssignedUser(), + 'EDGE', + AssignedUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAssignedUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tasks' => 'list', + 'user' => 'int', + ); + $enums = array( + 'tasks_enum' => AdAccountTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assigned_users', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAsyncBatchRequest(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adbatch' => 'list', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/async_batch_requests', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAsyncRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'status' => 'status_enum', + 'type' => 'type_enum', + ); + $enums = array( + 'status_enum' => AsyncRequestStatusValues::getInstance()->getValues(), + 'type_enum' => AsyncRequestTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/async_requests', + new AsyncRequest(), + 'EDGE', + AsyncRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAsyncAdRequestSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_completed' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/asyncadrequestsets', + new AdAsyncRequestSet(), + 'EDGE', + AdAsyncRequestSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAsyncAdRequestSet(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_specs' => 'list', + 'name' => 'string', + 'notification_mode' => 'notification_mode_enum', + 'notification_uri' => 'string', + ); + $enums = array( + 'notification_mode_enum' => AdAsyncRequestSetNotificationModeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/asyncadrequestsets', + new AdAsyncRequestSet(), + 'EDGE', + AdAsyncRequestSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAudienceReplace(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'payload' => 'Object', + 'session' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/audiencereplace', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBlockListDraft(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'publisher_urls_file' => 'file', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/block_list_drafts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBroadTargetingCategories(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'custom_categories_only' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/broadtargetingcategories', + new BroadTargetingCategories(), + 'EDGE', + BroadTargetingCategories::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteCampaigns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'before_date' => 'datetime', + 'delete_offset' => 'unsigned int', + 'delete_strategy' => 'delete_strategy_enum', + 'object_count' => 'int', + ); + $enums = array( + 'delete_strategy_enum' => array( + 'DELETE_ANY', + 'DELETE_ARCHIVED_BEFORE', + 'DELETE_OLDEST', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/campaigns', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCampaigns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'is_completed' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => CampaignDatePresetValues::getInstance()->getValues(), + 'effective_status_enum' => CampaignEffectiveStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/campaigns', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCampaign(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'bid_strategy' => 'bid_strategy_enum', + 'buying_type' => 'string', + 'daily_budget' => 'unsigned int', + 'execution_options' => 'list', + 'iterative_split_test_configs' => 'list', + 'lifetime_budget' => 'unsigned int', + 'name' => 'string', + 'objective' => 'objective_enum', + 'pacing_type' => 'list', + 'promoted_object' => 'Object', + 'smart_promotion_type' => 'smart_promotion_type_enum', + 'source_campaign_id' => 'string', + 'special_ad_categories' => 'list', + 'special_ad_category_country' => 'list', + 'spend_cap' => 'unsigned int', + 'status' => 'status_enum', + 'topline_id' => 'string', + 'upstream_events' => 'map', + ); + $enums = array( + 'bid_strategy_enum' => CampaignBidStrategyValues::getInstance()->getValues(), + 'execution_options_enum' => CampaignExecutionOptionsValues::getInstance()->getValues(), + 'objective_enum' => CampaignObjectiveValues::getInstance()->getValues(), + 'smart_promotion_type_enum' => CampaignSmartPromotionTypeValues::getInstance()->getValues(), + 'special_ad_categories_enum' => CampaignSpecialAdCategoriesValues::getInstance()->getValues(), + 'special_ad_category_country_enum' => CampaignSpecialAdCategoryCountryValues::getInstance()->getValues(), + 'status_enum' => CampaignStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/campaigns', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCampaignsByLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_label_ids' => 'list', + 'operator' => 'operator_enum', + ); + $enums = array( + 'operator_enum' => CampaignOperatorValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/campaignsbylabels', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getConnectedInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/connected_instagram_accounts', + new IGUser(), + 'EDGE', + IGUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContentDeliveryReport(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_date' => 'datetime', + 'page_id' => 'unsigned int', + 'platform' => 'platform_enum', + 'position' => 'position_enum', + 'start_date' => 'datetime', + 'summary' => 'bool', + ); + $enums = array( + 'platform_enum' => ContentDeliveryReportPlatformValues::getInstance()->getValues(), + 'position_enum' => ContentDeliveryReportPositionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/content_delivery_report', + new ContentDeliveryReport(), + 'EDGE', + ContentDeliveryReport::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCreateAndApplyPublisherBlockList(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_auto_blocking_on' => 'bool', + 'name' => 'string', + 'publisher_urls' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/create_and_apply_publisher_block_list', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomAudiences(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business_id' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'pixel_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/customaudiences', + new CustomAudience(), + 'EDGE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCustomAudience(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'accountID' => 'string', + 'additionalMetadata' => 'string', + 'allowed_domains' => 'list', + 'associated_audience_id' => 'unsigned int', + 'claim_objective' => 'claim_objective_enum', + 'content_type' => 'content_type_enum', + 'countries' => 'string', + 'creation_params' => 'map', + 'customer_file_source' => 'customer_file_source_enum', + 'dataset_id' => 'string', + 'description' => 'string', + 'details' => 'string', + 'enable_fetch_or_create' => 'bool', + 'event_source_group' => 'string', + 'event_sources' => 'list', + 'exclusions' => 'list', + 'expectedSize' => 'unsigned int', + 'gender' => 'string', + 'inclusions' => 'list', + 'isPrivate' => 'bool', + 'is_household' => 'bool', + 'is_household_exclusion' => 'bool', + 'is_snapshot' => 'bool', + 'is_value_based' => 'bool', + 'list_of_accounts' => 'list', + 'lookalike_spec' => 'string', + 'maxAge' => 'unsigned int', + 'minAge' => 'unsigned int', + 'name' => 'string', + 'opt_out_link' => 'string', + 'origin_audience_id' => 'string', + 'parent_audience_id' => 'unsigned int', + 'partnerID' => 'string', + 'partner_reference_key' => 'string', + 'pixel_id' => 'string', + 'prefill' => 'bool', + 'product_set_id' => 'string', + 'regulated_audience_spec' => 'string', + 'retention_days' => 'unsigned int', + 'rev_share_policy_id' => 'unsigned int', + 'rule' => 'string', + 'rule_aggregation' => 'string', + 'seed_audience' => 'unsigned int', + 'source' => 'string', + 'subtype' => 'subtype_enum', + 'tags' => 'list', + 'video_group_ids' => 'list', + ); + $enums = array( + 'claim_objective_enum' => CustomAudienceClaimObjectiveValues::getInstance()->getValues(), + 'content_type_enum' => CustomAudienceContentTypeValues::getInstance()->getValues(), + 'customer_file_source_enum' => CustomAudienceCustomerFileSourceValues::getInstance()->getValues(), + 'subtype_enum' => CustomAudienceSubtypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/customaudiences', + new CustomAudience(), + 'EDGE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomAudiencesTos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/customaudiencestos', + new CustomAudiencesTOS(), + 'EDGE', + CustomAudiencesTOS::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCustomAudiencesTo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business_id' => 'string', + 'tos_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/customaudiencestos', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomConversions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/customconversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCustomConversion(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'advanced_rule' => 'string', + 'custom_event_type' => 'custom_event_type_enum', + 'default_conversion_value' => 'float', + 'description' => 'string', + 'event_source_id' => 'string', + 'name' => 'string', + 'rule' => 'string', + ); + $enums = array( + 'custom_event_type_enum' => CustomConversionCustomEventTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/customconversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDeliveryEstimate(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'optimization_goal' => 'optimization_goal_enum', + 'promoted_object' => 'Object', + 'targeting_spec' => 'Targeting', + ); + $enums = array( + 'optimization_goal_enum' => AdAccountDeliveryEstimateOptimizationGoalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/delivery_estimate', + new AdAccountDeliveryEstimate(), + 'EDGE', + AdAccountDeliveryEstimate::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDeprecatedTargetingAdSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/deprecatedtargetingadsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getGeneratePreviews(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_format' => 'ad_format_enum', + 'creative' => 'AdCreative', + 'dynamic_asset_label' => 'string', + 'dynamic_creative_spec' => 'Object', + 'dynamic_customization' => 'Object', + 'end_date' => 'datetime', + 'height' => 'unsigned int', + 'locale' => 'string', + 'place_page_id' => 'int', + 'post' => 'Object', + 'product_item_ids' => 'list', + 'render_type' => 'render_type_enum', + 'start_date' => 'datetime', + 'width' => 'unsigned int', + ); + $enums = array( + 'ad_format_enum' => AdPreviewAdFormatValues::getInstance()->getValues(), + 'render_type_enum' => AdPreviewRenderTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/generatepreviews', + new AdPreview(), + 'EDGE', + AdPreview::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getImpactingAdStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/impacting_ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new AdsInsights(), + 'EDGE', + AdsInsights::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsightsAsync(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/insights', + new AdReportRun(), + 'EDGE', + AdReportRun::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMatchedSearchApplications(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_incomplete_app' => 'bool', + 'app_store' => 'app_store_enum', + 'app_store_country' => 'string', + 'business_id' => 'string', + 'query_term' => 'string', + ); + $enums = array( + 'app_store_enum' => AdAccountMatchedSearchApplicationsEdgeDataAppStoreValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/matched_search_applications', + new AdAccountMatchedSearchApplicationsEdgeData(), + 'EDGE', + AdAccountMatchedSearchApplicationsEdgeData::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMaxBid(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/max_bid', + new AdAccountMaxBid(), + 'EDGE', + AdAccountMaxBid::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMinimumBudgets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bid_amount' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/minimum_budgets', + new MinimumBudget(), + 'EDGE', + MinimumBudget::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOfflineConversionDataSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/offline_conversion_data_sets', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOnBehalfRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => BusinessOwnedObjectOnBehalfOfRequestStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/onbehalf_requests', + new BusinessOwnedObjectOnBehalfOfRequest(), + 'EDGE', + BusinessOwnedObjectOnBehalfOfRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createProductAudience(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allowed_domains' => 'list', + 'associated_audience_id' => 'unsigned int', + 'claim_objective' => 'claim_objective_enum', + 'content_type' => 'content_type_enum', + 'creation_params' => 'map', + 'description' => 'string', + 'enable_fetch_or_create' => 'bool', + 'event_source_group' => 'string', + 'event_sources' => 'list', + 'exclusions' => 'list', + 'inclusions' => 'list', + 'is_household' => 'bool', + 'is_household_exclusion' => 'bool', + 'is_snapshot' => 'bool', + 'is_value_based' => 'bool', + 'name' => 'string', + 'opt_out_link' => 'string', + 'parent_audience_id' => 'unsigned int', + 'product_set_id' => 'string', + 'rev_share_policy_id' => 'unsigned int', + 'seed_audience' => 'unsigned int', + 'subtype' => 'subtype_enum', + 'tags' => 'list', + ); + $enums = array( + 'claim_objective_enum' => AdAccountClaimObjectiveValues::getInstance()->getValues(), + 'content_type_enum' => AdAccountContentTypeValues::getInstance()->getValues(), + 'subtype_enum' => AdAccountSubtypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/product_audiences', + new CustomAudience(), + 'EDGE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPromotePages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/promote_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPublisherBlockLists(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/publisher_block_lists', + new PublisherBlockList(), + 'EDGE', + PublisherBlockList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPublisherBlockList(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/publisher_block_lists', + new PublisherBlockList(), + 'EDGE', + PublisherBlockList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReachEstimate(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adgroup_ids' => 'list', + 'caller_id' => 'string', + 'concepts' => 'string', + 'creative_action_spec' => 'string', + 'is_debug' => 'bool', + 'object_store_url' => 'string', + 'targeting_spec' => 'Targeting', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reachestimate', + new AdAccountReachEstimate(), + 'EDGE', + AdAccountReachEstimate::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReachFrequencyPredictions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reachfrequencypredictions', + new ReachFrequencyPrediction(), + 'EDGE', + ReachFrequencyPrediction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createReachFrequencyPrediction(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + 'ad_formats' => 'list', + 'auction_entry_option_index' => 'unsigned int', + 'budget' => 'unsigned int', + 'buying_type' => 'buying_type_enum', + 'campaign_group_id' => 'string', + 'day_parting_schedule' => 'list', + 'deal_id' => 'string', + 'destination_id' => 'unsigned int', + 'destination_ids' => 'list', + 'end_time' => 'unsigned int', + 'exceptions' => 'bool', + 'existing_campaign_id' => 'string', + 'expiration_time' => 'unsigned int', + 'frequency_cap' => 'unsigned int', + 'grp_buying' => 'bool', + 'impression' => 'unsigned int', + 'instream_packages' => 'list', + 'interval_frequency_cap_reset_period' => 'unsigned int', + 'is_bonus_media' => 'bool', + 'is_conversion_goal' => 'bool', + 'is_full_view' => 'bool', + 'is_higher_average_frequency' => 'bool', + 'is_reach_and_frequency_io_buying' => 'bool', + 'is_reserved_buying' => 'bool', + 'num_curve_points' => 'unsigned int', + 'objective' => 'string', + 'prediction_mode' => 'unsigned int', + 'reach' => 'unsigned int', + 'rf_prediction_id' => 'string', + 'rf_prediction_id_to_release' => 'string', + 'rf_prediction_id_to_share' => 'string', + 'start_time' => 'unsigned int', + 'stop_time' => 'unsigned int', + 'story_event_type' => 'unsigned int', + 'target_cpm' => 'unsigned int', + 'target_spec' => 'Targeting', + 'video_view_length_constraint' => 'unsigned int', + ); + $enums = array( + 'action_enum' => ReachFrequencyPredictionActionValues::getInstance()->getValues(), + 'buying_type_enum' => ReachFrequencyPredictionBuyingTypeValues::getInstance()->getValues(), + 'instream_packages_enum' => ReachFrequencyPredictionInstreamPackagesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/reachfrequencypredictions', + new ReachFrequencyPrediction(), + 'EDGE', + ReachFrequencyPrediction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRoas(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'fields' => 'list', + 'filtering' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/roas', + new AdAccountRoas(), + 'EDGE', + AdAccountRoas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSavedAudiences(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business_id' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/saved_audiences', + new SavedAudience(), + 'EDGE', + SavedAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSponsoredMessageAd(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bid_amount' => 'int', + 'daily_budget' => 'unsigned int', + 'message_creative_id' => 'string', + 'targeting' => 'Targeting', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/sponsored_message_ads', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSubscribedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/subscribed_apps', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSubscribedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/subscribed_apps', + new AdAccountSubscribedApps(), + 'EDGE', + AdAccountSubscribedApps::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSubscribedApp(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/subscribed_apps', + new AdAccountSubscribedApps(), + 'EDGE', + AdAccountSubscribedApps::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingBrowse(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'excluded_category' => 'string', + 'include_nodes' => 'bool', + 'is_exclusion' => 'bool', + 'limit_type' => 'limit_type_enum', + 'regulated_categories' => 'list', + 'whitelisted_types' => 'list', + ); + $enums = array( + 'limit_type_enum' => AdAccountTargetingUnifiedLimitTypeValues::getInstance()->getValues(), + 'regulated_categories_enum' => AdAccountTargetingUnifiedRegulatedCategoriesValues::getInstance()->getValues(), + 'whitelisted_types_enum' => AdAccountTargetingUnifiedWhitelistedTypesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingbrowse', + new AdAccountTargetingUnified(), + 'EDGE', + AdAccountTargetingUnified::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingSearch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_only_fat_head_interests' => 'bool', + 'app_store' => 'app_store_enum', + 'countries' => 'list', + 'is_exclusion' => 'bool', + 'limit_type' => 'limit_type_enum', + 'objective' => 'objective_enum', + 'promoted_object' => 'Object', + 'q' => 'string', + 'regulated_categories' => 'list', + 'session_id' => 'unsigned int', + 'targeting_list' => 'list', + 'whitelisted_types' => 'list', + ); + $enums = array( + 'app_store_enum' => AdAccountTargetingUnifiedAppStoreValues::getInstance()->getValues(), + 'limit_type_enum' => AdAccountTargetingUnifiedLimitTypeValues::getInstance()->getValues(), + 'objective_enum' => AdAccountTargetingUnifiedObjectiveValues::getInstance()->getValues(), + 'regulated_categories_enum' => AdAccountTargetingUnifiedRegulatedCategoriesValues::getInstance()->getValues(), + 'whitelisted_types_enum' => AdAccountTargetingUnifiedWhitelistedTypesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingsearch', + new AdAccountTargetingUnified(), + 'EDGE', + AdAccountTargetingUnified::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingSentenceLines(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'discard_ages' => 'bool', + 'discard_placements' => 'bool', + 'hide_targeting_spec_from_return' => 'bool', + 'targeting_spec' => 'Targeting', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingsentencelines', + new TargetingSentenceLine(), + 'EDGE', + TargetingSentenceLine::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingSuggestions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_store' => 'app_store_enum', + 'countries' => 'list', + 'limit_type' => 'limit_type_enum', + 'mode' => 'mode_enum', + 'objective' => 'objective_enum', + 'objects' => 'Object', + 'regulated_categories' => 'list', + 'session_id' => 'unsigned int', + 'targeting_list' => 'list', + 'whitelisted_types' => 'list', + ); + $enums = array( + 'app_store_enum' => AdAccountTargetingUnifiedAppStoreValues::getInstance()->getValues(), + 'limit_type_enum' => AdAccountTargetingUnifiedLimitTypeValues::getInstance()->getValues(), + 'mode_enum' => AdAccountTargetingUnifiedModeValues::getInstance()->getValues(), + 'objective_enum' => AdAccountTargetingUnifiedObjectiveValues::getInstance()->getValues(), + 'regulated_categories_enum' => AdAccountTargetingUnifiedRegulatedCategoriesValues::getInstance()->getValues(), + 'whitelisted_types_enum' => AdAccountTargetingUnifiedWhitelistedTypesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingsuggestions', + new AdAccountTargetingUnified(), + 'EDGE', + AdAccountTargetingUnified::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingValidation(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'id_list' => 'list', + 'is_exclusion' => 'bool', + 'name_list' => 'list', + 'targeting_list' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingvalidation', + new AdAccountTargetingUnified(), + 'EDGE', + AdAccountTargetingUnified::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTracking(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tracking', + new AdAccountTrackingData(), + 'EDGE', + AdAccountTrackingData::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createTracking(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tracking_specs' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/tracking', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/users', + new AdAccountUser(), + 'EDGE', + AdAccountUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteUsersOfAnyAudience(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'namespace' => 'string', + 'payload' => 'Object', + 'session' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/usersofanyaudience', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdAccount(), + 'NODE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'agency_client_declaration' => 'map', + 'attribution_spec' => 'list', + 'business_info' => 'map', + 'currency' => 'currency_enum', + 'end_advertiser' => 'string', + 'is_notifications_enabled' => 'bool', + 'media_agency' => 'string', + 'name' => 'string', + 'partner' => 'string', + 'spend_cap' => 'float', + 'spend_cap_action' => 'string', + 'timezone_id' => 'unsigned int', + 'tos_accepted' => 'map', + ); + $enums = array( + 'currency_enum' => AdAccountCurrencyValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdAccount(), + 'NODE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountActivity.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountActivity.php new file mode 100644 index 00000000..8e3359e3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountActivity.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdAccountActivity(), + 'NODE', + AdAccountActivity::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdRulesHistory.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdRulesHistory.php new file mode 100644 index 00000000..178fab97 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdRulesHistory.php @@ -0,0 +1,61 @@ +getValues(); + $ref_enums['EvaluationType'] = AdAccountAdRulesHistoryEvaluationTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdVolume.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdVolume.php new file mode 100644 index 00000000..5a1b08fe --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountAdVolume.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountContentFilterLevelsInheritance.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountContentFilterLevelsInheritance.php new file mode 100644 index 00000000..4f860b79 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountContentFilterLevelsInheritance.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdAccountCreationRequest(), + 'NODE', + AdAccountCreationRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDefaultDestination.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDefaultDestination.php new file mode 100644 index 00000000..18fe0caa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDefaultDestination.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['ObjectiveForLevel'] = AdAccountDefaultObjectiveObjectiveForLevelValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDeliveryEstimate.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDeliveryEstimate.php new file mode 100644 index 00000000..9342e0be --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountDeliveryEstimate.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMatchedSearchApplicationsEdgeData.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMatchedSearchApplicationsEdgeData.php new file mode 100644 index 00000000..ae94a332 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMatchedSearchApplicationsEdgeData.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMaxBid.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMaxBid.php new file mode 100644 index 00000000..79bd5e71 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountMaxBid.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['RegulatedCategories'] = AdAccountTargetingUnifiedRegulatedCategoriesValues::getInstance()->getValues(); + $ref_enums['WhitelistedTypes'] = AdAccountTargetingUnifiedWhitelistedTypesValues::getInstance()->getValues(); + $ref_enums['AppStore'] = AdAccountTargetingUnifiedAppStoreValues::getInstance()->getValues(); + $ref_enums['Objective'] = AdAccountTargetingUnifiedObjectiveValues::getInstance()->getValues(); + $ref_enums['Mode'] = AdAccountTargetingUnifiedModeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountTrackingData.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountTrackingData.php new file mode 100644 index 00000000..f70fe53f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAccountTrackingData.php @@ -0,0 +1,57 @@ +getManyByConnection(AdAccount::className(), $fields, $params); + } + + public function getAdAccountGroups( + array $fields = array(), array $params = array()) { + return $this->getManyByConnection( + AdAccountGroup::className(), + $fields, + $params); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdActivity.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdActivity.php new file mode 100644 index 00000000..76a2a74d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdActivity.php @@ -0,0 +1,63 @@ +getValues(); + $ref_enums['Category'] = AdActivityCategoryValues::getInstance()->getValues(); + $ref_enums['DataSource'] = AdActivityDataSourceValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpec.php new file mode 100644 index 00000000..294826eb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpec.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecAssetLabel.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecAssetLabel.php new file mode 100644 index 00000000..7cdcd387 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAssetFeedSpecAssetLabel.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdAsyncRequest(), + 'NODE', + AdAsyncRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSet.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSet.php new file mode 100644 index 00000000..4fa8534a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSet.php @@ -0,0 +1,167 @@ +getValues(); + $ref_enums['NotificationStatus'] = AdAsyncRequestSetNotificationStatusValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'statuses' => 'list', + ); + $enums = array( + 'statuses_enum' => AdAsyncRequestStatusesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/requests', + new AdAsyncRequest(), + 'EDGE', + AdAsyncRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdAsyncRequestSet(), + 'NODE', + AdAsyncRequestSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + 'notification_mode' => 'notification_mode_enum', + 'notification_uri' => 'string', + ); + $enums = array( + 'notification_mode_enum' => AdAsyncRequestSetNotificationModeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdAsyncRequestSet(), + 'NODE', + AdAsyncRequestSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSetNotificationResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSetNotificationResult.php new file mode 100644 index 00000000..936b98d6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdAsyncRequestSetNotificationResult.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['BidStrategyOld'] = AdCampaignActivityBidStrategyOldValues::getInstance()->getValues(); + $ref_enums['BillingEventNew'] = AdCampaignActivityBillingEventNewValues::getInstance()->getValues(); + $ref_enums['BillingEventOld'] = AdCampaignActivityBillingEventOldValues::getInstance()->getValues(); + $ref_enums['OptimizationGoalNew'] = AdCampaignActivityOptimizationGoalNewValues::getInstance()->getValues(); + $ref_enums['OptimizationGoalOld'] = AdCampaignActivityOptimizationGoalOldValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdCampaignActivity(), + 'NODE', + AdCampaignActivity::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignBidConstraint.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignBidConstraint.php new file mode 100644 index 00000000..f5aeac73 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignBidConstraint.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignDeliveryStatsUnsupportedReasons.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignDeliveryStatsUnsupportedReasons.php new file mode 100644 index 00000000..00cd4afd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignDeliveryStatsUnsupportedReasons.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['ObjectiveOld'] = AdCampaignGroupActivityObjectiveOldValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdCampaignGroupActivity(), + 'NODE', + AdCampaignGroupActivity::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignIssuesInfo.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignIssuesInfo.php new file mode 100644 index 00000000..384b8df1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCampaignIssuesInfo.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['CallToActionType'] = AdCreativeCallToActionTypeValues::getInstance()->getValues(); + $ref_enums['ObjectType'] = AdCreativeObjectTypeValues::getInstance()->getValues(); + $ref_enums['Status'] = AdCreativeStatusValues::getInstance()->getValues(); + $ref_enums['AuthorizationCategory'] = AdCreativeAuthorizationCategoryValues::getInstance()->getValues(); + $ref_enums['CategorizationCriteria'] = AdCreativeCategorizationCriteriaValues::getInstance()->getValues(); + $ref_enums['CategoryMediaSource'] = AdCreativeCategoryMediaSourceValues::getInstance()->getValues(); + $ref_enums['DynamicAdVoice'] = AdCreativeDynamicAdVoiceValues::getInstance()->getValues(); + $ref_enums['InstantCheckoutSetting'] = AdCreativeInstantCheckoutSettingValues::getInstance()->getValues(); + $ref_enums['Operator'] = AdCreativeOperatorValues::getInstance()->getValues(); + return $ref_enums; + } + + protected function setDataTrigger($data) { + if (array_key_exists('id', $data)) { + $this->data['creative_id'] = $data['id']; + } + } + + public function createAdLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adlabels', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCreativeInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/creative_insights', + new AdCreativeInsights(), + 'EDGE', + AdCreativeInsights::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPreviews(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_format' => 'ad_format_enum', + 'dynamic_asset_label' => 'string', + 'dynamic_creative_spec' => 'Object', + 'dynamic_customization' => 'Object', + 'end_date' => 'datetime', + 'height' => 'unsigned int', + 'locale' => 'string', + 'place_page_id' => 'int', + 'post' => 'Object', + 'product_item_ids' => 'list', + 'render_type' => 'render_type_enum', + 'start_date' => 'datetime', + 'width' => 'unsigned int', + ); + $enums = array( + 'ad_format_enum' => AdPreviewAdFormatValues::getInstance()->getValues(), + 'render_type_enum' => AdPreviewRenderTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/previews', + new AdPreview(), + 'EDGE', + AdPreview::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'adlabels' => 'list', + 'name' => 'string', + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => AdCreativeStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'thumbnail_height' => 'unsigned int', + 'thumbnail_width' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdCreative(), + 'NODE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'adlabels' => 'list', + 'name' => 'string', + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => AdCreativeStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdCreative(), + 'NODE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeAdDisclaimer.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeAdDisclaimer.php new file mode 100644 index 00000000..02e985c0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeAdDisclaimer.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['FormatOption'] = AdCreativeLinkDataFormatOptionValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataAppLinkSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataAppLinkSpec.php new file mode 100644 index 00000000..6dbe0337 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataAppLinkSpec.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataCallToActionValue.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataCallToActionValue.php new file mode 100644 index 00000000..42146f05 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataCallToActionValue.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['FrameSource'] = AdCreativeLinkDataImageLayerSpecFrameSourceValues::getInstance()->getValues(); + $ref_enums['ImageSource'] = AdCreativeLinkDataImageLayerSpecImageSourceValues::getInstance()->getValues(); + $ref_enums['LayerType'] = AdCreativeLinkDataImageLayerSpecLayerTypeValues::getInstance()->getValues(); + $ref_enums['OverlayPosition'] = AdCreativeLinkDataImageLayerSpecOverlayPositionValues::getInstance()->getValues(); + $ref_enums['OverlayShape'] = AdCreativeLinkDataImageLayerSpecOverlayShapeValues::getInstance()->getValues(); + $ref_enums['TextFont'] = AdCreativeLinkDataImageLayerSpecTextFontValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataImageOverlaySpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataImageOverlaySpec.php new file mode 100644 index 00000000..883e5686 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataImageOverlaySpec.php @@ -0,0 +1,69 @@ +getValues(); + $ref_enums['OverlayTemplate'] = AdCreativeLinkDataImageOverlaySpecOverlayTemplateValues::getInstance()->getValues(); + $ref_enums['Position'] = AdCreativeLinkDataImageOverlaySpecPositionValues::getInstance()->getValues(); + $ref_enums['TextFont'] = AdCreativeLinkDataImageOverlaySpecTextFontValues::getInstance()->getValues(); + $ref_enums['TextType'] = AdCreativeLinkDataImageOverlaySpecTextTypeValues::getInstance()->getValues(); + $ref_enums['ThemeColor'] = AdCreativeLinkDataImageOverlaySpecThemeColorValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataSponsorshipInfoSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataSponsorshipInfoSpec.php new file mode 100644 index 00000000..a0d69281 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdCreativeLinkDataSponsorshipInfoSpec.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdImage(), + 'NODE', + AdImage::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + /** + * Uploads images from a zip file and returns a cursor of results + * + * @param string $file_path + * @param string $account_id + * @param array $params + * @param Api $api + * @return array + */ + public static function createFromZip( + $file_path, $account_id, array $params = array(), Api $api = null) { + + $image = new AdImage(null, $account_id, $api); + $image->{AdImageFields::FILENAME} = $file_path; + return $image->arrayFromZip($params); + } + + /** + * @return string + */ + protected function getNodePath() { + return '/'.$this->assureParentId().'/'.$this->getEndpoint(); + } + + /** + * Create function for the object. + * + * @param array $params Additional parameters to include in the request + * @return $this + * @throws \Exception + * @throws \RuntimeException + */ + public function create(array $params = array()) { + if ($this->data[static::FIELD_ID]) { + throw new \Exception("Object has already an ID"); + } + + if ($this->isZipFile($this->data[AdImageFields::FILENAME])) { + throw new \RuntimeException( + "use AdImage::createFromZip to create zip files"); + } + + $data = $this->exportData(); + $filename = $data[AdImageFields::FILENAME]; + unset($data[AdImageFields::FILENAME]); + $params = array_merge($data, $params); + + $request = $this->getApi()->prepareRequest( + '/'.$this->assureParentId().'/'.$this->getEndpoint(), + RequestInterface::METHOD_POST, + $params + ); + + $request->getFileParams()->offsetSet(AdImageFields::FILENAME, $filename); + $response = $this->getApi()->executeRequest($request); + + $this->clearHistory(); + $content = $response->getContent(); + $data = $content['images'][basename($this->{AdImageFields::FILENAME})]; + + $this->data[AdImageFields::HASH] = $data[AdImageFields::HASH]; + + $this->data[static::FIELD_ID] + = substr($this->getParentId(), 4).':'.$this->data[AdImageFields::HASH]; + + return $this; + } + + /** + * Uploads images from a zip file and returns a cursor of results + * + * @param array $params + * @return array + * @throws \RuntimeException + */ + protected function arrayFromZip($params = array()) { + if (!$this->isZipFile($this->data[AdImageFields::FILENAME])) { + throw new \RuntimeException( + $this->data[AdImageFields::FILENAME]." doesn't resolve to a zip file"); + } + + $data = $this->exportData(); + $filename = $data[AdImageFields::FILENAME]; + unset($data[AdImageFields::FILENAME]); + $params = array_merge($data, $params); + + $request = $this->getApi()->prepareRequest( + '/'.$this->assureParentId().'/'.$this->getEndpoint(), + RequestInterface::METHOD_POST, + $params + ); + + $request->getFileParams()->offsetSet(AdImageFields::FILENAME, $filename); + $response = $this->getApi()->executeRequest($request); + + $result = array(); + $content = $response->getContent(); + foreach ($content['images'] as $image) { + $adimage = new AdImage( + substr($this->getParentId(), 4).':'.$image[AdImageFields::HASH], + $this->getParentId(), + $this->getApi()); + + $adimage->{AdImageFields::HASH} = $image[AdImageFields::HASH]; + + $result[] = $adimage; + } + + return $result; + } + + /** + * Checks if a given path is a zip file + * + * @param string $file_path + * @return bool + */ + protected function isZipFile($file_path) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $file_mime_type = finfo_file($finfo, $file_path); + return $file_mime_type == 'application/zip' || + $file_mime_type == 'multipart/x-zip'; + } + + /** + * Read object data from the graph + * + * @param string[] $fields Fields to request + * @param array $params Additional request parameters + * @return $this + */ + public function read(array $fields = array(), array $params = array()) { + $fields = implode(',', $fields ?: static::getDefaultReadFields()); + if ($fields) { + $params['fields'] = $fields; + } + $params['hashes'] = array(explode(':', $this->assureId())[1]); + + $response = $this->getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_GET, + $params); + + $content = $response->getContent(); + $data = $content['data']; + if ($data) { + $this->setDataWithoutValidation((array) $data[0]); + } + + $this->clearHistory(); + + return $this; + } + + /** + * Delete this object from the graph + * + * @param array $params + * @return void + * @throws \Exception + */ + public function deleteSelf(array $params = array()) { + if (!$this->data[AdImageFields::HASH]) { + throw new \Exception("AdImage hash is required to delete"); + } + + $params + = array_merge($params, array('hash' => $this->data[AdImageFields::HASH])); + + $this->getApi()->call( + $this->getNodePath(), + RequestInterface::METHOD_DELETE, + $params + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdKeywords.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdKeywords.php new file mode 100644 index 00000000..ca01d0d7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdKeywords.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adcreatives', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCampaigns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/campaigns', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdLabel(), + 'NODE', + AdLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdLabel(), + 'NODE', + AdLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdMonetizationProperty.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdMonetizationProperty.php new file mode 100644 index 00000000..07d6a066 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdMonetizationProperty.php @@ -0,0 +1,183 @@ +assureId(); + + $param_types = array( + 'aggregation_period' => 'aggregation_period_enum', + 'breakdowns' => 'list', + 'filters' => 'list', + 'limit' => 'unsigned int', + 'metrics' => 'list', + 'ordering_column' => 'ordering_column_enum', + 'ordering_type' => 'ordering_type_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregation_period_enum' => AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues::getInstance()->getValues(), + 'breakdowns_enum' => AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(), + 'metrics_enum' => AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(), + 'ordering_column_enum' => AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(), + 'ordering_type_enum' => AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adnetworkanalytics', + new AdNetworkAnalyticsSyncQueryResult(), + 'EDGE', + AdNetworkAnalyticsSyncQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdNetworkAnalytic(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_period' => 'aggregation_period_enum', + 'breakdowns' => 'list', + 'filters' => 'list', + 'limit' => 'int', + 'metrics' => 'list', + 'ordering_column' => 'ordering_column_enum', + 'ordering_type' => 'ordering_type_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregation_period_enum' => AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues::getInstance()->getValues(), + 'breakdowns_enum' => AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(), + 'metrics_enum' => AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(), + 'ordering_column_enum' => AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(), + 'ordering_type_enum' => AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adnetworkanalytics', + new AdMonetizationProperty(), + 'EDGE', + AdMonetizationProperty::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdNetworkAnalyticsResults(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'query_ids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adnetworkanalytics_results', + new AdNetworkAnalyticsAsyncQueryResult(), + 'EDGE', + AdNetworkAnalyticsAsyncQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdMonetizationProperty(), + 'NODE', + AdMonetizationProperty::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdNetworkAnalyticsAsyncQueryResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdNetworkAnalyticsAsyncQueryResult.php new file mode 100644 index 00000000..4a0de6dd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdNetworkAnalyticsAsyncQueryResult.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Breakdowns'] = AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(); + $ref_enums['Metrics'] = AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(); + $ref_enums['OrderingColumn'] = AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(); + $ref_enums['OrderingType'] = AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSet.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSet.php new file mode 100644 index 00000000..9f06ea68 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSet.php @@ -0,0 +1,93 @@ +getValues(); + $ref_enums['LocationTypes'] = AdPlacePageSetLocationTypesValues::getInstance()->getValues(); + $ref_enums['TargetedAreaType'] = AdPlacePageSetTargetedAreaTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdPlacePageSet(), + 'NODE', + AdPlacePageSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSetMetadata.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSetMetadata.php new file mode 100644 index 00000000..b9a85198 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPlacePageSetMetadata.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdPlacement(), + 'NODE', + AdPlacement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPreview.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPreview.php new file mode 100644 index 00000000..b9cd4862 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPreview.php @@ -0,0 +1,68 @@ +getValues(); + $ref_enums['RenderType'] = AdPreviewRenderTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPromotedObject.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPromotedObject.php new file mode 100644 index 00000000..1c2f4fd1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdPromotedObject.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendation.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendation.php new file mode 100644 index 00000000..a9a6ee64 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendation.php @@ -0,0 +1,61 @@ +getValues(); + $ref_enums['Importance'] = AdRecommendationImportanceValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendationData.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendationData.php new file mode 100644 index 00000000..51b67fd6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRecommendationData.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new AdsInsights(), + 'EDGE', + AdsInsights::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdReportRun(), + 'NODE', + AdReportRun::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function setDataTrigger(array $data) { + if (array_key_exists('report_run_id', $data)) { + $this->data['id'] = $data['report_run_id']; + } + } + + public function isComplete() { + return $this->{AdReportRunFields::ASYNC_PERCENT_COMPLETION} === 100 && + $this->{AdReportRunFields::ASYNC_STATUS} === 'Job Completed'; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdReportSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdReportSpec.php new file mode 100644 index 00000000..bb65ed82 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdReportSpec.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdReportSpec(), + 'NODE', + AdReportSpec::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRule.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRule.php new file mode 100644 index 00000000..5dca2bf4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRule.php @@ -0,0 +1,215 @@ +getValues(); + return $ref_enums; + } + + + public function createExecute(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/execute', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHistory(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + 'hide_no_changes' => 'bool', + 'object_id' => 'string', + ); + $enums = array( + 'action_enum' => AdRuleHistoryActionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/history', + new AdRuleHistory(), + 'EDGE', + AdRuleHistory::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPreview(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/preview', + new AdRule(), + 'EDGE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdRule(), + 'NODE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'evaluation_spec' => 'Object', + 'execution_spec' => 'Object', + 'name' => 'string', + 'schedule_spec' => 'Object', + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => AdRuleStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdRule(), + 'NODE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleEvaluationSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleEvaluationSpec.php new file mode 100644 index 00000000..8caeffc1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleEvaluationSpec.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionOptions.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionOptions.php new file mode 100644 index 00000000..b621500b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionOptions.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionSpec.php new file mode 100644 index 00000000..828f9df1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleExecutionSpec.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleFilters.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleFilters.php new file mode 100644 index 00000000..50fb601c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleFilters.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistory.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistory.php new file mode 100644 index 00000000..c6568709 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistory.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResult.php new file mode 100644 index 00000000..0464ddf0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResult.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResultAction.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResultAction.php new file mode 100644 index 00000000..a96b4682 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdRuleHistoryResultAction.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Type'] = AdRuleTriggerTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdSet.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdSet.php new file mode 100644 index 00000000..1dcbe381 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdSet.php @@ -0,0 +1,704 @@ +getValues(); + $ref_enums['BillingEvent'] = AdSetBillingEventValues::getInstance()->getValues(); + $ref_enums['ConfiguredStatus'] = AdSetConfiguredStatusValues::getInstance()->getValues(); + $ref_enums['EffectiveStatus'] = AdSetEffectiveStatusValues::getInstance()->getValues(); + $ref_enums['OptimizationGoal'] = AdSetOptimizationGoalValues::getInstance()->getValues(); + $ref_enums['Status'] = AdSetStatusValues::getInstance()->getValues(); + $ref_enums['DatePreset'] = AdSetDatePresetValues::getInstance()->getValues(); + $ref_enums['DestinationType'] = AdSetDestinationTypeValues::getInstance()->getValues(); + $ref_enums['ExecutionOptions'] = AdSetExecutionOptionsValues::getInstance()->getValues(); + $ref_enums['FullFunnelExplorationMode'] = AdSetFullFunnelExplorationModeValues::getInstance()->getValues(); + $ref_enums['MultiOptimizationGoalWeight'] = AdSetMultiOptimizationGoalWeightValues::getInstance()->getValues(); + $ref_enums['OptimizationSubEvent'] = AdSetOptimizationSubEventValues::getInstance()->getValues(); + $ref_enums['TuneForCategory'] = AdSetTuneForCategoryValues::getInstance()->getValues(); + $ref_enums['Operator'] = AdSetOperatorValues::getInstance()->getValues(); + $ref_enums['StatusOption'] = AdSetStatusOptionValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getActivities(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'after' => 'string', + 'business_id' => 'string', + 'category' => 'category_enum', + 'limit' => 'int', + 'since' => 'datetime', + 'uid' => 'int', + 'until' => 'datetime', + ); + $enums = array( + 'category_enum' => AdActivityCategoryValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/activities', + new AdActivity(), + 'EDGE', + AdActivity::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdCreatives(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adcreatives', + new AdCreative(), + 'EDGE', + AdCreative::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAdLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'execution_options' => 'list', + ); + $enums = array( + 'execution_options_enum' => AdSetExecutionOptionsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/adlabels', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'execution_options' => 'list', + ); + $enums = array( + 'execution_options_enum' => AdSetExecutionOptionsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adlabels', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdRulesGoverned(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'pass_evaluation' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adrules_governed', + new AdRule(), + 'EDGE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'time_range' => 'Object', + 'updated_since' => 'int', + ); + $enums = array( + 'date_preset_enum' => AdDatePresetValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAsyncAdRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'statuses' => 'list', + ); + $enums = array( + 'statuses_enum' => AdAsyncRequestStatusesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/asyncadrequests', + new AdAsyncRequest(), + 'EDGE', + AdAsyncRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContentDeliveryReport(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_date' => 'datetime', + 'platform' => 'platform_enum', + 'position' => 'position_enum', + 'start_date' => 'datetime', + 'summary' => 'bool', + ); + $enums = array( + 'platform_enum' => ContentDeliveryReportPlatformValues::getInstance()->getValues(), + 'position_enum' => ContentDeliveryReportPositionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/content_delivery_report', + new ContentDeliveryReport(), + 'EDGE', + ContentDeliveryReport::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCopies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'is_completed' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => AdSetDatePresetValues::getInstance()->getValues(), + 'effective_status_enum' => AdSetEffectiveStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/copies', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCopy(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'campaign_id' => 'string', + 'create_dco_adset' => 'bool', + 'deep_copy' => 'bool', + 'end_time' => 'datetime', + 'rename_options' => 'Object', + 'start_time' => 'datetime', + 'status_option' => 'status_option_enum', + ); + $enums = array( + 'status_option_enum' => AdSetStatusOptionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/copies', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDeliveryEstimate(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'optimization_goal' => 'optimization_goal_enum', + 'promoted_object' => 'Object', + 'targeting_spec' => 'Targeting', + ); + $enums = array( + 'optimization_goal_enum' => AdCampaignDeliveryEstimateOptimizationGoalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/delivery_estimate', + new AdCampaignDeliveryEstimate(), + 'EDGE', + AdCampaignDeliveryEstimate::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new AdsInsights(), + 'EDGE', + AdsInsights::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsightsAsync(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/insights', + new AdReportRun(), + 'EDGE', + AdReportRun::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTargetingSentenceLines(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/targetingsentencelines', + new TargetingSentenceLine(), + 'EDGE', + TargetingSentenceLine::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'am_call_tags' => 'map', + 'date_preset' => 'date_preset_enum', + 'from_adtable' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => array( + 'last_14d', + 'last_28d', + 'last_30d', + 'last_3d', + 'last_7d', + 'last_90d', + 'last_month', + 'last_quarter', + 'last_week_mon_sun', + 'last_week_sun_sat', + 'last_year', + 'lifetime', + 'this_month', + 'this_quarter', + 'this_week_mon_today', + 'this_week_sun_today', + 'this_year', + 'today', + 'yesterday', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdSet(), + 'NODE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'adlabels' => 'list', + 'adset_schedule' => 'list', + 'attribution_spec' => 'list', + 'bid_adjustments' => 'Object', + 'bid_amount' => 'int', + 'bid_constraints' => 'map', + 'bid_strategy' => 'bid_strategy_enum', + 'billing_event' => 'billing_event_enum', + 'campaign_spec' => 'Object', + 'creative_sequence' => 'list', + 'daily_budget' => 'unsigned int', + 'daily_imps' => 'unsigned int', + 'daily_min_spend_target' => 'unsigned int', + 'daily_spend_cap' => 'unsigned int', + 'date_format' => 'string', + 'destination_type' => 'destination_type_enum', + 'end_time' => 'datetime', + 'execution_options' => 'list', + 'full_funnel_exploration_mode' => 'full_funnel_exploration_mode_enum', + 'lifetime_budget' => 'unsigned int', + 'lifetime_imps' => 'unsigned int', + 'lifetime_min_spend_target' => 'unsigned int', + 'lifetime_spend_cap' => 'unsigned int', + 'multi_optimization_goal_weight' => 'multi_optimization_goal_weight_enum', + 'name' => 'string', + 'optimization_goal' => 'optimization_goal_enum', + 'optimization_sub_event' => 'optimization_sub_event_enum', + 'pacing_type' => 'list', + 'promoted_object' => 'Object', + 'rb_prediction_id' => 'string', + 'rf_prediction_id' => 'string', + 'start_time' => 'datetime', + 'status' => 'status_enum', + 'targeting' => 'Targeting', + 'time_based_ad_rotation_id_blocks' => 'list>', + 'time_based_ad_rotation_intervals' => 'list', + 'time_start' => 'datetime', + 'time_stop' => 'datetime', + 'tune_for_category' => 'tune_for_category_enum', + 'upstream_events' => 'map', + ); + $enums = array( + 'bid_strategy_enum' => AdSetBidStrategyValues::getInstance()->getValues(), + 'billing_event_enum' => AdSetBillingEventValues::getInstance()->getValues(), + 'destination_type_enum' => AdSetDestinationTypeValues::getInstance()->getValues(), + 'execution_options_enum' => AdSetExecutionOptionsValues::getInstance()->getValues(), + 'full_funnel_exploration_mode_enum' => AdSetFullFunnelExplorationModeValues::getInstance()->getValues(), + 'multi_optimization_goal_weight_enum' => AdSetMultiOptimizationGoalWeightValues::getInstance()->getValues(), + 'optimization_goal_enum' => AdSetOptimizationGoalValues::getInstance()->getValues(), + 'optimization_sub_event_enum' => AdSetOptimizationSubEventValues::getInstance()->getValues(), + 'status_enum' => AdSetStatusValues::getInstance()->getValues(), + 'tune_for_category_enum' => AdSetTuneForCategoryValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdSet(), + 'NODE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudy.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudy.php new file mode 100644 index 00000000..5111eb99 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudy.php @@ -0,0 +1,228 @@ +getValues(); + return $ref_enums; + } + + + public function getCells(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/cells', + new AdStudyCell(), + 'EDGE', + AdStudyCell::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getObjectives(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/objectives', + new AdStudyObjective(), + 'EDGE', + AdStudyObjective::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createObjective(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adspixels' => 'list', + 'applications' => 'list', + 'customconversions' => 'list', + 'is_primary' => 'bool', + 'name' => 'string', + 'offline_conversion_data_sets' => 'list', + 'product_catalogs' => 'list', + 'product_sets' => 'list', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => AdStudyObjectiveTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/objectives', + new AdStudyObjective(), + 'EDGE', + AdStudyObjective::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdStudy(), + 'NODE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'cells' => 'list', + 'client_business' => 'string', + 'confidence_level' => 'float', + 'cooldown_start_time' => 'int', + 'description' => 'string', + 'end_time' => 'int', + 'name' => 'string', + 'objectives' => 'list', + 'observation_end_time' => 'int', + 'start_time' => 'int', + 'type' => 'type_enum', + 'viewers' => 'list', + ); + $enums = array( + 'type_enum' => AdStudyTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdStudy(), + 'NODE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyCell.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyCell.php new file mode 100644 index 00000000..63de22fd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyCell.php @@ -0,0 +1,204 @@ +getValues(); + return $ref_enums; + } + + + public function getAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCampaigns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/campaigns', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdStudyCell(), + 'NODE', + AdStudyCell::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccounts' => 'list', + 'adsets' => 'list', + 'campaigns' => 'list', + 'creation_template' => 'creation_template_enum', + 'description' => 'string', + 'name' => 'string', + ); + $enums = array( + 'creation_template_enum' => AdStudyCellCreationTemplateValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdStudyCell(), + 'NODE', + AdStudyCell::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjective.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjective.php new file mode 100644 index 00000000..c66679e6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjective.php @@ -0,0 +1,284 @@ +getValues(); + return $ref_enums; + } + + + public function getAdPlacePageSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_place_page_sets', + new AdPlacePageSet(), + 'EDGE', + AdPlacePageSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdsPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adspixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getApplications(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/applications', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomConversions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/customconversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOfflineConversionDataSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/offline_conversion_data_sets', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPartnerStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/partnerstudies', + new PartnerStudy(), + 'EDGE', + PartnerStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breakdowns' => 'list', + 'ds' => 'string', + ); + $enums = array( + 'breakdowns_enum' => array( + 'age', + 'cell_id', + 'country', + 'gender', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdStudyObjective(), + 'NODE', + AdStudyObjective::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adspixels' => 'list', + 'applications' => 'list', + 'customconversions' => 'list', + 'is_primary' => 'bool', + 'name' => 'string', + 'offline_conversion_data_sets' => 'list', + 'product_catalogs' => 'list', + 'product_sets' => 'list', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => AdStudyObjectiveTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdStudyObjective(), + 'NODE', + AdStudyObjective::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjectiveID.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjectiveID.php new file mode 100644 index 00000000..b928f7ec --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdStudyObjectiveID.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['ContentCategory'] = AdVideoContentCategoryValues::getInstance()->getValues(); + $ref_enums['Formatting'] = AdVideoFormattingValues::getInstance()->getValues(); + $ref_enums['OriginalProjectionType'] = AdVideoOriginalProjectionTypeValues::getInstance()->getValues(); + $ref_enums['SwapMode'] = AdVideoSwapModeValues::getInstance()->getValues(); + $ref_enums['UnpublishedContentType'] = AdVideoUnpublishedContentTypeValues::getInstance()->getValues(); + $ref_enums['UploadPhase'] = AdVideoUploadPhaseValues::getInstance()->getValues(); + $ref_enums['Type'] = AdVideoTypeValues::getInstance()->getValues(); + $ref_enums['BackdatedTimeGranularity'] = AdVideoBackdatedTimeGranularityValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getCaptions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/captions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCaption(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'captions_file' => 'file', + 'default_locale' => 'string', + 'locales_to_delete' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/captions', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'facepile_mentioned_ids' => 'list', + 'feedback_source' => 'string', + 'is_offline' => 'bool', + 'message' => 'string', + 'nectar_module' => 'string', + 'object_id' => 'string', + 'parent_comment_id' => 'Object', + 'text' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCrosspostSharedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/crosspost_shared_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLike(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'notify' => 'bool', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/likes', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPollSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/poll_settings', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPolls(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/polls', + new VideoPoll(), + 'EDGE', + VideoPoll::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPoll(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'close_after_voting' => 'bool', + 'correct_option' => 'unsigned int', + 'default_open' => 'bool', + 'options' => 'list', + 'question' => 'string', + 'show_gradient' => 'bool', + 'show_results' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/polls', + new VideoPoll(), + 'EDGE', + VideoPoll::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sharedposts', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSponsorTags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sponsor_tags', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tags', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createTag(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tag_uid' => 'int', + 'uid' => 'int', + 'vid' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/tags', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getThumbnails(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/thumbnails', + new VideoThumbnail(), + 'EDGE', + VideoThumbnail::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createThumbnail(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_preferred' => 'bool', + 'source' => 'file', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/thumbnails', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideoInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metric' => 'list', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'period_enum' => InsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/video_insights', + new InsightsResult(), + 'EDGE', + InsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdVideo(), + 'NODE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_breaks' => 'list', + 'allow_bm_crossposting' => 'bool', + 'allow_crossposting_for_pages' => 'list', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'call_to_action' => 'Object', + 'content_category' => 'content_category_enum', + 'content_tags' => 'list', + 'custom_labels' => 'list', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'embeddable' => 'bool', + 'expiration' => 'Object', + 'expire_now' => 'bool', + 'increment_play_count' => 'bool', + 'name' => 'string', + 'preferred_thumbnail_id' => 'string', + 'privacy' => 'string', + 'publish_to_news_feed' => 'bool', + 'publish_to_videos_tab' => 'bool', + 'published' => 'bool', + 'scheduled_publish_time' => 'unsigned int', + 'social_actions' => 'bool', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'target' => 'string', + 'universal_video_id' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => AdVideoBackdatedTimeGranularityValues::getInstance()->getValues(), + 'content_category_enum' => AdVideoContentCategoryValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdVideo(), + 'NODE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + use FieldValidation; + + public function create(array $params = array()) { + $data = $this->exportData(); + $source = null; + if (array_key_exists(AdVideoFields::SOURCE, $data)) { + $source = $data[AdVideoFields::SOURCE]; + unset($data[AdVideoFields::SOURCE]); + } + $params = array_merge($data, $params); + + $request = $this->getApi()->prepareRequest( + '/'.$this->assureParentId().'/'.$this->getEndpoint(), + RequestInterface::METHOD_POST, + $params + ); + + $request->setLastLevelDomain('graph-video'); + if ($source) { + $request->getFileParams()->offsetSet(AdVideoFields::SOURCE, $source); + } + $response = $this->getApi()->executeRequest($request); + + $data = $response->getContent(); + $this->data[static::FIELD_ID] + = is_string($data) ? $data : (string) $data[static::FIELD_ID]; + + return $this; + } + + /** + * @param array $fields + * @param array $params + * @return Cursor + */ + public function getVideoThumbnails( + array $fields = array(), array $params = array()) { + return $this->getManyByConnection( + VideoThumbnail::className(), $fields, $params, 'thumbnails'); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupActivity.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupActivity.php new file mode 100644 index 00000000..d6f91c5a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupActivity.php @@ -0,0 +1,84 @@ +getValues(); + $ref_enums['ObjectiveOld'] = AdgroupActivityObjectiveOldValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdgroupActivity(), + 'NODE', + AdgroupActivity::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupIssuesInfo.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupIssuesInfo.php new file mode 100644 index 00000000..c1bca7fa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdgroupIssuesInfo.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdoptablePet(), + 'NODE', + AdoptablePet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsActionStats.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsActionStats.php new file mode 100644 index 00000000..35ee665e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsActionStats.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['ActionBreakdowns'] = AdsInsightsActionBreakdownsValues::getInstance()->getValues(); + $ref_enums['ActionReportTime'] = AdsInsightsActionReportTimeValues::getInstance()->getValues(); + $ref_enums['Breakdowns'] = AdsInsightsBreakdownsValues::getInstance()->getValues(); + $ref_enums['DatePreset'] = AdsInsightsDatePresetValues::getInstance()->getValues(); + $ref_enums['Level'] = AdsInsightsLevelValues::getInstance()->getValues(); + $ref_enums['SummaryActionBreakdowns'] = AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsOptimalDeliveryGrowthOpportunity.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsOptimalDeliveryGrowthOpportunity.php new file mode 100644 index 00000000..1bce6b68 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsOptimalDeliveryGrowthOpportunity.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['AutomaticMatchingFields'] = AdsPixelAutomaticMatchingFieldsValues::getInstance()->getValues(); + $ref_enums['DataUseSetting'] = AdsPixelDataUseSettingValues::getInstance()->getValues(); + $ref_enums['FirstPartyCookieStatus'] = AdsPixelFirstPartyCookieStatusValues::getInstance()->getValues(); + $ref_enums['Tasks'] = AdsPixelTasksValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_users', + new AssignedUser(), + 'EDGE', + AssignedUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAssignedUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tasks' => 'list', + 'user' => 'int', + ); + $enums = array( + 'tasks_enum' => AdsPixelTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assigned_users', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDaChecks(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'checks' => 'list', + 'connection_method' => 'connection_method_enum', + ); + $enums = array( + 'connection_method_enum' => DACheckConnectionMethodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/da_checks', + new DACheck(), + 'EDGE', + DACheck::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createEvent(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + 'namespace_id' => 'string', + 'partner_agent' => 'string', + 'test_event_code' => 'string', + 'trace' => 'unsigned int', + 'upload_id' => 'string', + 'upload_source' => 'string', + 'upload_tag' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/events', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSharedAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/shared_accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shared_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSharedAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/shared_accounts', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shared_agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getStats(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation' => 'aggregation_enum', + 'end_time' => 'datetime', + 'event' => 'string', + 'event_source' => 'string', + 'start_time' => 'datetime', + ); + $enums = array( + 'aggregation_enum' => AdsPixelStatsResultAggregationValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/stats', + new AdsPixelStatsResult(), + 'EDGE', + AdsPixelStatsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AdsPixel(), + 'NODE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'automatic_matching_fields' => 'list', + 'data_use_setting' => 'data_use_setting_enum', + 'enable_automatic_matching' => 'bool', + 'first_party_cookie_status' => 'first_party_cookie_status_enum', + 'name' => 'string', + 'server_events_business_ids' => 'list', + ); + $enums = array( + 'automatic_matching_fields_enum' => AdsPixelAutomaticMatchingFieldsValues::getInstance()->getValues(), + 'data_use_setting_enum' => AdsPixelDataUseSettingValues::getInstance()->getValues(), + 'first_party_cookie_status_enum' => AdsPixelFirstPartyCookieStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new AdsPixel(), + 'NODE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + /** + * @param int $business_id + * @param string $account_id + */ + public function sharePixelWithAdAccount($business_id, $account_id) { + $this->getApi()->call( + '/'.$this->assureId().'/shared_accounts', + RequestInterface::METHOD_POST, + array( + 'business' => $business_id, + 'account_id' => $account_id, + )); + } + + /** + * @param $business_id + * @param $account_id + */ + public function unsharePixelWithAdAccount($business_id, $account_id) { + $this->getApi()->call( + '/'.$this->assureId().'/shared_accounts', + RequestInterface::METHOD_DELETE, + array( + 'business' => $business_id, + 'account_id' => $account_id, + )); + } + + /** + * @param int $business_id + * @param int $agency_id + */ + public function sharePixelWithAgency($business_id, $agency_id) { + $this->getApi()->call( + '/'.$this->assureId().'/shared_agencies', + 'POST', + array( + 'business' => $business_id, + 'agency_id' => $agency_id, + )); + } + + /** + * @param int $business_id + * @param int $agency_id + */ + public function unsharePixelWithAgency($business_id, $agency_id) { + $this->getApi()->call( + '/'.$this->assureId().'/shared_agencies', + 'DELETE', + array( + 'business' => $business_id, + 'agency_id' => $agency_id, + )); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsPixelStats.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsPixelStats.php new file mode 100644 index 00000000..10f52db3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AdsPixelStats.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AgeRange.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AgeRange.php new file mode 100644 index 00000000..74b2bdd2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AgeRange.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'facepile_mentioned_ids' => 'list', + 'feedback_source' => 'string', + 'is_offline' => 'bool', + 'message' => 'string', + 'nectar_module' => 'string', + 'object_id' => 'string', + 'parent_comment_id' => 'Object', + 'text' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLike(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'notify' => 'bool', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/likes', + new Album(), + 'EDGE', + Album::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPhotos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPhoto(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aid' => 'string', + 'allow_spherical_photo' => 'bool', + 'alt_text_custom' => 'string', + 'android_key_hash' => 'string', + 'application_id' => 'string', + 'attempt' => 'unsigned int', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'caption' => 'string', + 'composer_session_id' => 'string', + 'direct_share_status' => 'unsigned int', + 'feed_targeting' => 'Object', + 'filter_type' => 'unsigned int', + 'full_res_is_coming_later' => 'bool', + 'initial_view_heading_override_degrees' => 'unsigned int', + 'initial_view_pitch_override_degrees' => 'unsigned int', + 'initial_view_vertical_fov_override_degrees' => 'unsigned int', + 'ios_bundle_id' => 'string', + 'is_explicit_location' => 'bool', + 'is_explicit_place' => 'bool', + 'is_visual_search' => 'bool', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'name' => 'string', + 'no_story' => 'bool', + 'offline_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'place' => 'Object', + 'privacy' => 'string', + 'profile_id' => 'int', + 'proxied_app_id' => 'string', + 'published' => 'bool', + 'qn' => 'string', + 'scheduled_publish_time' => 'unsigned int', + 'spherical_metadata' => 'map', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'target_id' => 'int', + 'targeting' => 'Object', + 'time_since_original_post' => 'unsigned int', + 'uid' => 'int', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'url' => 'string', + 'user_selected_tags' => 'bool', + 'vault_image_id' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => PhotoBackdatedTimeGranularityValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => PhotoUnpublishedContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'redirect' => 'bool', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfilePictureSourceTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sharedposts', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Album(), + 'NODE', + Album::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AndroidAppLink.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AndroidAppLink.php new file mode 100644 index 00000000..dc9efacb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AndroidAppLink.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + 'ids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AppRequest(), + 'NODE', + AppRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AppRequestFormerRecipient.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AppRequestFormerRecipient.php new file mode 100644 index 00000000..c1701672 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AppRequestFormerRecipient.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['AnPlatforms'] = ApplicationAnPlatformsValues::getInstance()->getValues(); + $ref_enums['Platform'] = ApplicationPlatformValues::getInstance()->getValues(); + $ref_enums['RequestType'] = ApplicationRequestTypeValues::getInstance()->getValues(); + $ref_enums['MutationMethod'] = ApplicationMutationMethodValues::getInstance()->getValues(); + $ref_enums['PostMethod'] = ApplicationPostMethodValues::getInstance()->getValues(); + $ref_enums['ScoreType'] = ApplicationScoreTypeValues::getInstance()->getValues(); + $ref_enums['SortOrder'] = ApplicationSortOrderValues::getInstance()->getValues(); + $ref_enums['LoggingSource'] = ApplicationLoggingSourceValues::getInstance()->getValues(); + $ref_enums['LoggingTarget'] = ApplicationLoggingTargetValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + 'uid' => 'int', + ); + $enums = array( + 'type_enum' => array( + 'test-users', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => array( + 'test-users', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'installed' => 'bool', + 'minor' => 'bool', + 'name' => 'string', + 'owner_access_token' => 'string', + 'permissions' => 'list', + 'type' => 'type_enum', + 'uid' => 'int', + ); + $enums = array( + 'type_enum' => array( + 'test-users', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createActivity(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'advertiser_id' => 'string', + 'advertiser_tracking_enabled' => 'bool', + 'anon_id' => 'string', + 'app_user_id' => 'string', + 'application_tracking_enabled' => 'bool', + 'attribution' => 'string', + 'auto_publish' => 'bool', + 'bundle_id' => 'string', + 'bundle_short_version' => 'string', + 'bundle_version' => 'string', + 'click_id' => 'string', + 'consider_views' => 'bool', + 'custom_events' => 'list', + 'custom_events_file' => 'file', + 'data_processing_options' => 'list', + 'data_processing_options_country' => 'unsigned int', + 'data_processing_options_state' => 'unsigned int', + 'device_token' => 'string', + 'event' => 'event_enum', + 'extinfo' => 'Object', + 'include_dwell_data' => 'bool', + 'include_video_data' => 'bool', + 'install_referrer' => 'string', + 'install_timestamp' => 'unsigned int', + 'installer_package' => 'string', + 'limited_data_use' => 'bool', + 'migration_bundle' => 'string', + 'page_id' => 'unsigned int', + 'page_scoped_user_id' => 'unsigned int', + 'receipt_data' => 'string', + 'ud' => 'map', + 'url_schemes' => 'list', + 'user_id' => 'string', + 'user_id_type' => 'user_id_type_enum', + 'windows_attribution_id' => 'string', + ); + $enums = array( + 'event_enum' => array( + 'CUSTOM_APP_EVENTS', + 'DEFERRED_APP_LINK', + 'MOBILE_APP_INSTALL', + ), + 'user_id_type_enum' => array( + 'INSTANT_GAMES_PLAYER_ID', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/activities', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdNetworkAnalytics(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_period' => 'aggregation_period_enum', + 'breakdowns' => 'list', + 'filters' => 'list', + 'limit' => 'unsigned int', + 'metrics' => 'list', + 'ordering_column' => 'ordering_column_enum', + 'ordering_type' => 'ordering_type_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregation_period_enum' => AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues::getInstance()->getValues(), + 'breakdowns_enum' => AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(), + 'metrics_enum' => AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(), + 'ordering_column_enum' => AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(), + 'ordering_type_enum' => AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adnetworkanalytics', + new AdNetworkAnalyticsSyncQueryResult(), + 'EDGE', + AdNetworkAnalyticsSyncQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdNetworkAnalytic(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_period' => 'aggregation_period_enum', + 'breakdowns' => 'list', + 'filters' => 'list', + 'limit' => 'int', + 'metrics' => 'list', + 'ordering_column' => 'ordering_column_enum', + 'ordering_type' => 'ordering_type_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregation_period_enum' => AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues::getInstance()->getValues(), + 'breakdowns_enum' => AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(), + 'metrics_enum' => AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(), + 'ordering_column_enum' => AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(), + 'ordering_type_enum' => AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adnetworkanalytics', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdNetworkAnalyticsResults(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'query_ids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adnetworkanalytics_results', + new AdNetworkAnalyticsAsyncQueryResult(), + 'EDGE', + AdNetworkAnalyticsAsyncQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAggregateRevenue(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ecpms' => 'list', + 'query_ids' => 'list', + 'request_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/aggregate_revenue', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAndroidDialogConfigs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/android_dialog_configs', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAppEventTypes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/app_event_types', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAppIndexing(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_version' => 'string', + 'device_session_id' => 'string', + 'extra_info' => 'string', + 'platform' => 'platform_enum', + 'request_type' => 'request_type_enum', + 'tree' => 'map', + ); + $enums = array( + 'platform_enum' => ApplicationPlatformValues::getInstance()->getValues(), + 'request_type_enum' => ApplicationRequestTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/app_indexing', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAppIndexingSession(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'device_session_id' => 'string', + 'extinfo' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/app_indexing_session', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAppInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregateBy' => 'aggregateBy_enum', + 'breakdowns' => 'list', + 'ecosystem' => 'ecosystem_enum', + 'event_name' => 'string', + 'intervals_to_aggregate' => 'int', + 'metric_key' => 'string', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregateBy_enum' => array( + 'AVERAGE_JOURNEY_LENGTH', + 'CONVERTED_JOURNEY_PERCENT', + 'COUNT', + 'COUNT_IDENTIFIED_USERS', + 'COUNT_PER_USER', + 'DAU', + 'EVENT_LATEST_FIRE_TIME', + 'EVENT_SOURCE_IDS', + 'JOURNEY_CHANNEL_INCLUSION', + 'JOURNEY_INCLUSION', + 'MAU', + 'MEDIAN_JOURNEY_LENGTH', + 'MEDIAN_VALUE', + 'MEDIAN_VALUE_PER_USER', + 'OVERLAP', + 'PERCENTILES_COUNT', + 'PERCENTILES_USD_VALUE', + 'PERCENTILES_VALUE', + 'SCORE', + 'SESSIONS_PER_JOURNEY', + 'SESSION_BOUNCE_RATE', + 'SUM', + 'SUM_IDENTIFIED_USERS', + 'SUM_PER_EVENT', + 'TOPK', + 'UNKNOWN_USERS', + 'USD_SUM', + 'USD_SUM_IDENTIFIED_USERS', + 'USD_SUM_PER_EVENT', + 'USD_SUM_PER_USER', + 'USD_VALUE_PER_USER', + 'USERS', + 'USER_PROPERTY_USER_COUNT', + 'VALUE_PER_USER', + 'WAU', + ), + 'ecosystem_enum' => array( + 'GAME', + 'NON_GAME', + ), + 'period_enum' => array( + 'daily', + 'days_28', + 'days_60', + 'days_90', + 'hourly', + 'lifetime', + 'mins_15', + 'monthly', + 'range', + 'weekly', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/app_insights', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAppInstalledGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'group_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/app_installed_groups', + new Group(), + 'EDGE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAppPushDeviceToken(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'device_id' => 'string', + 'device_token' => 'string', + 'platform' => 'platform_enum', + ); + $enums = array( + 'platform_enum' => ApplicationPlatformValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/app_push_device_token', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAppAssets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/appassets', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAsset(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset' => 'file', + 'comment' => 'string', + 'type' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assets', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAuthorizedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/authorized_adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteBanned(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'uids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/banned', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getButtonAutoDetectionDeviceSelection(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'device_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/button_auto_detection_device_selection', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createButtonIndexing(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_version' => 'string', + 'device_id' => 'string', + 'extinfo' => 'string', + 'indexed_button_list' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/button_indexing', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCodelessEventMapping(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'mappings' => 'list', + 'mutation_method' => 'mutation_method_enum', + 'platform' => 'platform_enum', + 'post_method' => 'post_method_enum', + ); + $enums = array( + 'mutation_method_enum' => ApplicationMutationMethodValues::getInstance()->getValues(), + 'platform_enum' => ApplicationPlatformValues::getInstance()->getValues(), + 'post_method_enum' => ApplicationPostMethodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/codeless_event_mappings', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDaChecks(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'checks' => 'list', + 'connection_method' => 'connection_method_enum', + ); + $enums = array( + 'connection_method_enum' => DACheckConnectionMethodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/da_checks', + new DACheck(), + 'EDGE', + DACheck::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getEvents(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_canceled' => 'bool', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => EventTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/events', + new Event(), + 'EDGE', + Event::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsightsPushSchedule(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights_push_schedule', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createInsightsPushSchedule(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account_ids' => 'list', + 'breakdowns' => 'list', + 'date_preset' => 'string', + 'level' => 'level_enum', + 'metrics' => 'list', + 'object_id' => 'string', + 'owner_id' => 'int', + 'schedule' => 'schedule_enum', + 'status' => 'status_enum', + 'time_increment' => 'unsigned int', + 'time_start' => 'datetime', + 'time_stop' => 'datetime', + ); + $enums = array( + 'level_enum' => array( + 'ACCOUNT', + 'AD', + 'ADSET', + 'CAMPAIGN', + ), + 'schedule_enum' => array( + 'DAILY', + 'FINE_15_MIN', + 'FINE_5_MIN', + 'MONTHLY', + 'WEEKLY', + ), + 'status_enum' => array( + 'ACTIVE', + 'DISABLED', + 'ERROR', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/insights_push_schedule', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getIosDialogConfigs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ios_dialog_configs', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLeaderboardsCreate(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'context_id' => 'string', + 'decimal_offset' => 'unsigned int', + 'name' => 'string', + 'score_type' => 'score_type_enum', + 'sort_order' => 'sort_order_enum', + 'unit' => 'string', + ); + $enums = array( + 'score_type_enum' => ApplicationScoreTypeValues::getInstance()->getValues(), + 'sort_order_enum' => ApplicationSortOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/leaderboards_create', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLeaderboardsDeleteEntry(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + 'player_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/leaderboards_delete_entry', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLeaderboardsReset(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + 'reset_time' => 'datetime', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/leaderboards_reset', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLeaderboardsSetScore(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'extra_data' => 'string', + 'name' => 'string', + 'player_id' => 'string', + 'score' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/leaderboards_set_score', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'broadcast_status' => 'broadcast_status_enum', + ); + $enums = array( + 'broadcast_status_enum' => LiveVideoBroadcastStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMmpAuditing(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'advertiser_id' => 'string', + 'attribution' => 'string', + 'attribution_model' => 'string', + 'auditing_token' => 'string', + 'click_attr_window' => 'unsigned int', + 'custom_events' => 'list', + 'decline_reason' => 'string', + 'event' => 'string', + 'event_reported_time' => 'unsigned int', + 'fb_ad_id' => 'unsigned int', + 'fb_click_time' => 'unsigned int', + 'fb_view_time' => 'unsigned int', + 'is_fb' => 'bool', + 'view_attr_window' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/mmp_auditing', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMobileSdkGk(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'device_id' => 'string', + 'extinfo' => 'Object', + 'os_version' => 'string', + 'platform' => 'platform_enum', + 'sdk_version' => 'string', + ); + $enums = array( + 'platform_enum' => array( + 'ANDROID', + 'IOS', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/mobile_sdk_gk', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOccludesPopup(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'flash' => 'bool', + 'unity' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/occludespopups', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOzoneRelease(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ozone_release', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPageActivity(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'advertiser_tracking_enabled' => 'bool', + 'application_tracking_enabled' => 'bool', + 'custom_events' => 'list', + 'logging_source' => 'logging_source_enum', + 'logging_target' => 'logging_target_enum', + 'page_id' => 'unsigned int', + 'page_scoped_user_id' => 'unsigned int', + ); + $enums = array( + 'logging_source_enum' => ApplicationLoggingSourceValues::getInstance()->getValues(), + 'logging_target_enum' => ApplicationLoggingTargetValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/page_activities', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deletePaymentCurrencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'currency_url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/payment_currencies', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPaymentCurrency(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'currency_url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/payment_currencies', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPermissions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'android_key_hash' => 'string', + 'ios_bundle_id' => 'string', + 'permission' => 'list', + 'proxied_app_id' => 'int', + 'status' => 'list', + ); + $enums = array( + 'status_enum' => array( + 'live', + 'unapproved', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/permissions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProducts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'product_ids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/products', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPurchases(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_premium' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/purchases', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRoles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/roles', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSubscribedDomains(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/subscribed_domains', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSubscribedDomain(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'subscribe' => 'list', + 'unsubscribe' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/subscribed_domains', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSubscribedDomainsPhishing(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/subscribed_domains_phishing', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSubscribedDomainsPhishing(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'subscribe' => 'list', + 'unsubscribe' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/subscribed_domains_phishing', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSubscriptions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'fields' => 'list', + 'object' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/subscriptions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSubscription(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'callback_url' => 'string', + 'fields' => 'list', + 'include_values' => 'bool', + 'object' => 'string', + 'verify_token' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/subscriptions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUpload(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'file_length' => 'unsigned int', + 'file_name' => 'Object', + 'file_type' => 'Object', + 'session_type' => 'session_type_enum', + ); + $enums = array( + 'session_type_enum' => array( + 'attachment', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/uploads', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUserProperty(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + 'limited_data_use' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/user_properties', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'advertiser_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Application(), + 'NODE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'an_platforms' => 'list', + 'android_class_name' => 'string', + 'android_key_hashes' => 'list', + 'android_package_name' => 'string', + 'android_sso' => 'bool', + 'app_domains' => 'list', + 'app_name' => 'string', + 'app_type' => 'bool', + 'auth_dialog_headline' => 'string', + 'auth_dialog_perms_explanation' => 'string', + 'auth_referral_default_activity_privacy' => 'string', + 'auth_referral_enabled' => 'bool', + 'auth_referral_extended_perms' => 'list', + 'auth_referral_friend_perms' => 'list', + 'auth_referral_response_type' => 'string', + 'auth_referral_user_perms' => 'list', + 'canvas_fluid_height' => 'bool', + 'canvas_fluid_width' => 'bool', + 'canvas_url' => 'string', + 'contact_email' => 'string', + 'deauth_callback_url' => 'string', + 'ios_bundle_id' => 'list', + 'mobile_web_url' => 'string', + 'namespace' => 'string', + 'page_tab_default_name' => 'string', + 'privacy_policy_url' => 'string', + 'restrictions' => 'string', + 'secure_canvas_url' => 'string', + 'secure_page_tab_url' => 'string', + 'server_ip_whitelist' => 'list', + 'terms_of_service_url' => 'string', + 'url_scheme_suffix' => 'string', + 'user_support_email' => 'string', + 'user_support_url' => 'string', + 'website_url' => 'string', + ); + $enums = array( + 'an_platforms_enum' => ApplicationAnPlatformsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Application(), + 'NODE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AssignedUser.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AssignedUser.php new file mode 100644 index 00000000..f16080b7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AssignedUser.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Type'] = AsyncRequestTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AsyncSession.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AsyncSession.php new file mode 100644 index 00000000..d6b19d43 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AsyncSession.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AsyncSession(), + 'NODE', + AsyncSession::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AtlasCampaign.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AtlasCampaign.php new file mode 100644 index 00000000..42088131 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AtlasCampaign.php @@ -0,0 +1,197 @@ +assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'metric_scope' => 'map', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_sets', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinessUnit(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/business_unit', + new BusinessUnit(), + 'EDGE', + BusinessUnit::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMetricsBreakdown(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'dimensions' => 'list', + 'granularity' => 'granularity_enum', + 'metric_scope' => 'map', + 'order_by' => 'list', + ); + $enums = array( + 'dimensions_enum' => array( + 'AD_ID', + 'AD_SET_ID', + 'CAMPAIGN_ID', + 'DEVICE_TYPE', + 'SOURCE_CHANNEL', + ), + 'granularity_enum' => array( + 'DAY', + 'HOUR', + 'MONTH', + 'WEEK_SUNDAY', + 'YEAR', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/metrics_breakdown', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSources(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'metric_scope' => 'map', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sources', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metric_scope' => 'map', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AtlasCampaign(), + 'NODE', + AtlasCampaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AttributionSpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AttributionSpec.php new file mode 100644 index 00000000..cc231fc8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AttributionSpec.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AudioCopyright(), + 'NODE', + AudioCopyright::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AutomotiveModel.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AutomotiveModel.php new file mode 100644 index 00000000..5fd5c9d4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/AutomotiveModel.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new AutomotiveModel(), + 'NODE', + AutomotiveModel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BilledAmountDetails.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BilledAmountDetails.php new file mode 100644 index 00000000..1262e8f8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BilledAmountDetails.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Vertical'] = BusinessVerticalValues::getInstance()->getValues(); + $ref_enums['PermittedTasks'] = BusinessPermittedTasksValues::getInstance()->getValues(); + $ref_enums['SurveyBusinessType'] = BusinessSurveyBusinessTypeValues::getInstance()->getValues(); + $ref_enums['PagePermittedTasks'] = BusinessPagePermittedTasksValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function createAccessToken(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'string', + 'fbe_external_business_id' => 'string', + 'scope' => 'list', + 'system_user_name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/access_token', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccount_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/ad_accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdStudy(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'cells' => 'list', + 'client_business' => 'string', + 'confidence_level' => 'float', + 'cooldown_start_time' => 'int', + 'description' => 'string', + 'end_time' => 'int', + 'name' => 'string', + 'objectives' => 'list', + 'observation_end_time' => 'int', + 'start_time' => 'int', + 'type' => 'type_enum', + 'viewers' => 'list', + ); + $enums = array( + 'type_enum' => AdStudyTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account_created_from_bm_flag' => 'bool', + 'currency' => 'string', + 'end_advertiser' => 'Object', + 'funding_id' => 'string', + 'invoice' => 'bool', + 'invoice_group_id' => 'string', + 'invoicing_emails' => 'list', + 'io' => 'bool', + 'media_agency' => 'string', + 'name' => 'string', + 'partner' => 'string', + 'po_number' => 'string', + 'timezone_id' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adaccount', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdNetworkAnalytics(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_period' => 'aggregation_period_enum', + 'breakdowns' => 'list', + 'filters' => 'list', + 'limit' => 'unsigned int', + 'metrics' => 'list', + 'ordering_column' => 'ordering_column_enum', + 'ordering_type' => 'ordering_type_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregation_period_enum' => AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues::getInstance()->getValues(), + 'breakdowns_enum' => AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(), + 'metrics_enum' => AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(), + 'ordering_column_enum' => AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(), + 'ordering_type_enum' => AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adnetworkanalytics', + new AdNetworkAnalyticsSyncQueryResult(), + 'EDGE', + AdNetworkAnalyticsSyncQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdNetworkAnalytic(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_period' => 'aggregation_period_enum', + 'breakdowns' => 'list', + 'filters' => 'list', + 'limit' => 'int', + 'metrics' => 'list', + 'ordering_column' => 'ordering_column_enum', + 'ordering_type' => 'ordering_type_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'aggregation_period_enum' => AdNetworkAnalyticsSyncQueryResultAggregationPeriodValues::getInstance()->getValues(), + 'breakdowns_enum' => AdNetworkAnalyticsSyncQueryResultBreakdownsValues::getInstance()->getValues(), + 'metrics_enum' => AdNetworkAnalyticsSyncQueryResultMetricsValues::getInstance()->getValues(), + 'ordering_column_enum' => AdNetworkAnalyticsSyncQueryResultOrderingColumnValues::getInstance()->getValues(), + 'ordering_type_enum' => AdNetworkAnalyticsSyncQueryResultOrderingTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adnetworkanalytics', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdNetworkAnalyticsResults(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'query_ids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adnetworkanalytics_results', + new AdNetworkAnalyticsAsyncQueryResult(), + 'EDGE', + AdNetworkAnalyticsAsyncQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdsPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'id_filter' => 'string', + 'name_filter' => 'string', + 'sort_by' => 'sort_by_enum', + ); + $enums = array( + 'sort_by_enum' => AdsPixelSortByValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adspixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdsPixel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adspixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/agencies', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAggregateRevenue(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ecpms' => 'list', + 'query_ids' => 'list', + 'request_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/aggregate_revenue', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAnPlacements(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/an_placements', + new AdPlacement(), + 'EDGE', + AdPlacement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBlockListDraft(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'publisher_urls_file' => 'file', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/block_list_drafts', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinessAssetGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/business_asset_groups', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinessInvoices(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_date' => 'string', + 'invoice_id' => 'unsigned int', + 'issue_end_date' => 'string', + 'issue_start_date' => 'string', + 'root_id' => 'unsigned int', + 'start_date' => 'string', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => OracleTransactionTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/business_invoices', + new OracleTransaction(), + 'EDGE', + OracleTransaction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinessUnits(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/business_units', + new BusinessUnit(), + 'EDGE', + BusinessUnit::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBusinessUnit(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business_units' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/business_units', + new BusinessUnit(), + 'EDGE', + BusinessUnit::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinessUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/business_users', + new BusinessUser(), + 'EDGE', + BusinessUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createClaimCustomConversion(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'custom_conversion_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/claim_custom_conversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClientAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/client_ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createClientAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccount_id' => 'string', + 'permitted_tasks' => 'list', + ); + $enums = array( + 'permitted_tasks_enum' => BusinessPermittedTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/client_ad_accounts', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClientApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/client_apps', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createClientApp(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/client_apps', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClientPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/client_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createClientPage(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'page_id' => 'int', + 'permitted_tasks' => 'list', + ); + $enums = array( + 'permitted_tasks_enum' => BusinessPermittedTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/client_pages', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClientPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/client_pixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClientProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/client_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClientWhatsAppBusinessAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/client_whatsapp_business_accounts', + new WhatsAppBusinessAccount(), + 'EDGE', + WhatsAppBusinessAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteClients(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/clients', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClients(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/clients', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCollaborativeAdsCollaborationRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'status' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/collaborative_ads_collaboration_requests', + new CPASCollaborationRequest(), + 'EDGE', + CPASCollaborationRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCollaborativeAdsCollaborationRequest(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'brands' => 'list', + 'contact_email' => 'string', + 'contact_first_name' => 'string', + 'contact_last_name' => 'string', + 'phone_number' => 'string', + 'receiver_business' => 'string', + 'requester_agency_or_brand' => 'requester_agency_or_brand_enum', + 'sender_client_business' => 'string', + ); + $enums = array( + 'requester_agency_or_brand_enum' => CPASCollaborationRequestRequesterAgencyOrBrandValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/collaborative_ads_collaboration_requests', + new CPASCollaborationRequest(), + 'EDGE', + CPASCollaborationRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCollaborativeAdsSuggestedPartners(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/collaborative_ads_suggested_partners', + new CPASAdvertiserPartnershipRecommendation(), + 'EDGE', + CPASAdvertiserPartnershipRecommendation::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCommerceMerchantSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/commerce_merchant_settings', + new CommerceMerchantSettings(), + 'EDGE', + CommerceMerchantSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContentDeliveryReport(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_date' => 'datetime', + 'page_id' => 'unsigned int', + 'platform' => 'platform_enum', + 'position' => 'position_enum', + 'start_date' => 'datetime', + 'summary' => 'bool', + ); + $enums = array( + 'platform_enum' => ContentDeliveryReportPlatformValues::getInstance()->getValues(), + 'position_enum' => ContentDeliveryReportPositionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/content_delivery_report', + new ContentDeliveryReport(), + 'EDGE', + ContentDeliveryReport::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCreateAndApplyPublisherBlockList(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_auto_blocking_on' => 'bool', + 'name' => 'string', + 'publisher_urls' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/create_and_apply_publisher_block_list', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCustomConversion(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'advanced_rule' => 'string', + 'custom_event_type' => 'custom_event_type_enum', + 'default_conversion_value' => 'float', + 'description' => 'string', + 'event_source_id' => 'string', + 'name' => 'string', + 'rule' => 'string', + ); + $enums = array( + 'custom_event_type_enum' => CustomConversionCustomEventTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/customconversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getEventSourceGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/event_source_groups', + new EventSourceGroup(), + 'EDGE', + EventSourceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createEventSourceGroup(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'event_sources' => 'list', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/event_source_groups', + new EventSourceGroup(), + 'EDGE', + EventSourceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getExtendedCredits(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'order_by_is_owned_credential' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/extendedcredits', + new ExtendedCredit(), + 'EDGE', + ExtendedCredit::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInitiatedAudienceSharingRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'recipient_id' => 'string', + 'request_status' => 'request_status_enum', + ); + $enums = array( + 'request_status_enum' => BusinessAssetSharingAgreementRequestStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/initiated_audience_sharing_requests', + new BusinessAssetSharingAgreement(), + 'EDGE', + BusinessAssetSharingAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInitiatedSharingAgreements(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'receiving_business_id' => 'string', + 'request_status' => 'request_status_enum', + ); + $enums = array( + 'request_status_enum' => BusinessAgreementRequestStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/initiated_sharing_agreements', + new BusinessAgreement(), + 'EDGE', + BusinessAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'instagram_account' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/instagram_accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInstagramBusinessAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/instagram_business_accounts', + new IGUser(), + 'EDGE', + IGUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteManagedBusinesses(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'existing_client_business_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/managed_businesses', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createManagedBusiness(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'child_business_external_id' => 'string', + 'existing_client_business_id' => 'string', + 'name' => 'string', + 'sales_rep_email' => 'string', + 'survey_business_type' => 'survey_business_type_enum', + 'survey_num_assets' => 'unsigned int', + 'survey_num_people' => 'unsigned int', + 'timezone_id' => 'unsigned int', + 'vertical' => 'vertical_enum', + ); + $enums = array( + 'survey_business_type_enum' => BusinessSurveyBusinessTypeValues::getInstance()->getValues(), + 'vertical_enum' => BusinessVerticalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/managed_businesses', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMoveAsset(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + 'client_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/move_asset', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOfflineConversionDataSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/offline_conversion_data_sets', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOfflineConversionDataSet(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'auto_assign_to_new_accounts_only' => 'bool', + 'description' => 'string', + 'enable_auto_assign_to_accounts' => 'bool', + 'is_mta_use' => 'bool', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/offline_conversion_data_sets', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOwnedAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccount_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/owned_ad_accounts', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_apps', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOwnedApp(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/owned_apps', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteOwnedBusinesses(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'client_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/owned_businesses', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedBusinesses(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'child_business_external_id' => 'string', + 'client_user_id' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_businesses', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOwnedBusiness(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'child_business_external_id' => 'string', + 'name' => 'string', + 'page_permitted_tasks' => 'list', + 'sales_rep_email' => 'string', + 'shared_page_id' => 'string', + 'survey_business_type' => 'survey_business_type_enum', + 'survey_num_assets' => 'unsigned int', + 'survey_num_people' => 'unsigned int', + 'timezone_id' => 'unsigned int', + 'vertical' => 'vertical_enum', + ); + $enums = array( + 'page_permitted_tasks_enum' => BusinessPagePermittedTasksValues::getInstance()->getValues(), + 'survey_business_type_enum' => BusinessSurveyBusinessTypeValues::getInstance()->getValues(), + 'vertical_enum' => BusinessVerticalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/owned_businesses', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOwnedPage(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'code' => 'string', + 'page_id' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/owned_pages', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_pixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOwnedProductCatalog(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'catalog_segment_filter' => 'Object', + 'catalog_segment_product_set_id' => 'string', + 'da_display_settings' => 'Object', + 'destination_catalog_settings' => 'map', + 'flight_catalog_settings' => 'map', + 'name' => 'string', + 'parent_catalog_id' => 'string', + 'store_catalog_settings' => 'map', + 'vertical' => 'vertical_enum', + ); + $enums = array( + 'vertical_enum' => ProductCatalogVerticalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/owned_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedWhatsAppBusinessAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_whatsapp_business_accounts', + new WhatsAppBusinessAccount(), + 'EDGE', + WhatsAppBusinessAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deletePages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'page_id' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/pages', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPendingClientAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pending_client_ad_accounts', + new BusinessAdAccountRequest(), + 'EDGE', + BusinessAdAccountRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPendingClientApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pending_client_apps', + new BusinessApplicationRequest(), + 'EDGE', + BusinessApplicationRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPendingClientPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pending_client_pages', + new BusinessPageRequest(), + 'EDGE', + BusinessPageRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPendingOwnedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pending_owned_ad_accounts', + new BusinessAdAccountRequest(), + 'EDGE', + BusinessAdAccountRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPendingOwnedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pending_owned_pages', + new BusinessPageRequest(), + 'EDGE', + BusinessPageRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPendingUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'email' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pending_users', + new BusinessRoleRequest(), + 'EDGE', + BusinessRoleRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breaking_change' => 'breaking_change_enum', + 'height' => 'int', + 'redirect' => 'bool', + 'type' => 'type_enum', + 'width' => 'int', + ); + $enums = array( + 'breaking_change_enum' => ProfilePictureSourceBreakingChangeValues::getInstance()->getValues(), + 'type_enum' => ProfilePictureSourceTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPixelTo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/pixel_tos', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReceivedAudienceSharingRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'initiator_id' => 'string', + 'request_status' => 'request_status_enum', + ); + $enums = array( + 'request_status_enum' => BusinessAssetSharingAgreementRequestStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/received_audience_sharing_requests', + new BusinessAssetSharingAgreement(), + 'EDGE', + BusinessAssetSharingAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReceivedSharingAgreements(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'request_status' => 'request_status_enum', + 'requesting_business_id' => 'string', + ); + $enums = array( + 'request_status_enum' => BusinessAgreementRequestStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/received_sharing_agreements', + new BusinessAgreement(), + 'EDGE', + BusinessAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSystemUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/system_users', + new SystemUser(), + 'EDGE', + SystemUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getThirdPartyMeasurementReportDataset(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/third_party_measurement_report_dataset', + new ThirdPartyMeasurementReportDataset(), + 'EDGE', + ThirdPartyMeasurementReportDataset::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUploadEvent(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_level' => 'aggregation_level_enum', + 'conversion_end_date' => 'string', + 'conversion_start_date' => 'string', + 'event_status' => 'event_status_enum', + 'lookback_window' => 'lookback_window_enum', + 'match_universe' => 'match_universe_enum', + 'timezone' => 'timezone_enum', + 'upload_tag' => 'string', + ); + $enums = array( + 'aggregation_level_enum' => MeasurementUploadEventAggregationLevelValues::getInstance()->getValues(), + 'event_status_enum' => MeasurementUploadEventEventStatusValues::getInstance()->getValues(), + 'lookback_window_enum' => MeasurementUploadEventLookbackWindowValues::getInstance()->getValues(), + 'match_universe_enum' => MeasurementUploadEventMatchUniverseValues::getInstance()->getValues(), + 'timezone_enum' => MeasurementUploadEventTimezoneValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/upload_event', + new MeasurementUploadEvent(), + 'EDGE', + MeasurementUploadEvent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Business(), + 'NODE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + 'primary_page' => 'string', + 'timezone_id' => 'unsigned int', + 'two_factor_type' => 'two_factor_type_enum', + 'vertical' => 'vertical_enum', + ); + $enums = array( + 'two_factor_type_enum' => BusinessTwoFactorTypeValues::getInstance()->getValues(), + 'vertical_enum' => BusinessVerticalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Business(), + 'NODE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAdAccountRequest.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAdAccountRequest.php new file mode 100644 index 00000000..70ecf37b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAdAccountRequest.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessAgreement(), + 'NODE', + BusinessAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'unsigned int', + 'request_status' => 'request_status_enum', + ); + $enums = array( + 'request_status_enum' => BusinessAgreementRequestStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new BusinessAgreement(), + 'NODE', + BusinessAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessApplicationRequest.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessApplicationRequest.php new file mode 100644 index 00000000..3c1d31c1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessApplicationRequest.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['OfflineConversionDataSetTasks'] = BusinessAssetGroupOfflineConversionDataSetTasksValues::getInstance()->getValues(); + $ref_enums['PageTasks'] = BusinessAssetGroupPageTasksValues::getInstance()->getValues(); + $ref_enums['PixelTasks'] = BusinessAssetGroupPixelTasksValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/assigned_users', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_users', + new AssignedUser(), + 'EDGE', + AssignedUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAssignedUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccount_tasks' => 'list', + 'offline_conversion_data_set_tasks' => 'list', + 'page_tasks' => 'list', + 'pixel_tasks' => 'list', + 'user' => 'int', + ); + $enums = array( + 'adaccount_tasks_enum' => BusinessAssetGroupAdaccountTasksValues::getInstance()->getValues(), + 'offline_conversion_data_set_tasks_enum' => BusinessAssetGroupOfflineConversionDataSetTasksValues::getInstance()->getValues(), + 'page_tasks_enum' => BusinessAssetGroupPageTasksValues::getInstance()->getValues(), + 'pixel_tasks_enum' => BusinessAssetGroupPixelTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assigned_users', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_adaccounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_adaccounts', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedApplications(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_applications', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedApplications(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_applications', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedApplication(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_applications', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedCustomConversions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_custom_conversions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedCustomConversions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_custom_conversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedCustomConversion(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_custom_conversions', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_instagram_accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedInstagramAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_instagram_accounts', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedOfflineConversionDataSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_offline_conversion_data_sets', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedOfflineConversionDataSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_offline_conversion_data_sets', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedOfflineConversionDataSet(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_offline_conversion_data_sets', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_pages', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedPage(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_pages', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_pixels', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedPixels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_pixels', + new AdsPixel(), + 'EDGE', + AdsPixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedPixel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_pixels', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteContainedProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/contained_product_catalogs', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContainedProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/contained_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createContainedProductCatalog(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/contained_product_catalogs', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessAssetGroup(), + 'NODE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new BusinessAssetGroup(), + 'NODE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAssetSharingAgreement.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAssetSharingAgreement.php new file mode 100644 index 00000000..c2b8357b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessAssetSharingAgreement.php @@ -0,0 +1,106 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessAssetSharingAgreement(), + 'NODE', + BusinessAssetSharingAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'request_response' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new BusinessAssetSharingAgreement(), + 'NODE', + BusinessAssetSharingAgreement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessOwnedObjectOnBehalfOfRequest.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessOwnedObjectOnBehalfOfRequest.php new file mode 100644 index 00000000..24dbaa6b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessOwnedObjectOnBehalfOfRequest.php @@ -0,0 +1,82 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessOwnedObjectOnBehalfOfRequest(), + 'NODE', + BusinessOwnedObjectOnBehalfOfRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessPageRequest.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessPageRequest.php new file mode 100644 index 00000000..ea66a947 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessPageRequest.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessRoleRequest(), + 'NODE', + BusinessRoleRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'role' => 'role_enum', + ); + $enums = array( + 'role_enum' => BusinessRoleRequestRoleValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new BusinessRoleRequest(), + 'NODE', + BusinessRoleRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUnit.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUnit.php new file mode 100644 index 00000000..78cb9de8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUnit.php @@ -0,0 +1,441 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdPlatforms(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'metric_scope' => 'map', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_platforms', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAtlasSalesAccesses(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/atlas_sales_accesses', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAtlasSalesAccess(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'access_request_id' => 'string', + 'status' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/atlas_sales_accesses', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCampaigns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'metric_scope' => 'map', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/campaigns', + new AtlasCampaign(), + 'EDGE', + AtlasCampaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getConversionEvents(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'metric_scope' => 'map', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/conversion_events', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getConversionPaths(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'click_lookback_window' => 'unsigned int', + 'date_range' => 'map', + 'fb_conversion_event_id' => 'unsigned int', + 'limit' => 'unsigned int', + 'metric_context' => 'map', + 'time_period' => 'time_period_enum', + 'view_lookback_window' => 'unsigned int', + ); + $enums = array( + 'time_period_enum' => array( + 'all_available', + 'all_dates', + 'custom', + 'date_range', + 'fifteen_days', + 'last_fourteen_days', + 'last_hundred_fourty_four_hours', + 'last_month', + 'last_ninety_days', + 'last_quarter', + 'last_seven_days', + 'last_sixty_days', + 'last_thirty_days', + 'last_twenty_four_hours', + 'last_year', + 'month_to_date', + 'quarter_to_date', + 'seven_days', + 'thirty_days', + 'this_month_whole_days', + 'today', + 'week_to_date', + 'year_to_date', + 'yesterday', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/conversion_paths', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomBreakdowns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/custom_breakdowns', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDiagnostics(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/diagnostics', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getExternalImportFile(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/external_import_file', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReports(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reports', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSources(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter_by' => 'string', + 'metric_scope' => 'map', + 'order_by' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sources', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/users', + new BusinessUser(), + 'EDGE', + BusinessUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessUnit(), + 'NODE', + BusinessUnit::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUser.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUser.php new file mode 100644 index 00000000..59eaee33 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/BusinessUser.php @@ -0,0 +1,229 @@ +getValues(); + return $ref_enums; + } + + + public function getAssignedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedBusinessAssetGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'contained_asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_business_asset_groups', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new BusinessUser(), + 'NODE', + BusinessUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'clear_pending_email' => 'bool', + 'email' => 'string', + 'first_name' => 'string', + 'last_name' => 'string', + 'pending_email' => 'string', + 'role' => 'role_enum', + 'title' => 'string', + ); + $enums = array( + 'role_enum' => BusinessUserRoleValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new BusinessUser(), + 'NODE', + BusinessUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASAdvertiserPartnershipRecommendation.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASAdvertiserPartnershipRecommendation.php new file mode 100644 index 00000000..2f8bee20 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASAdvertiserPartnershipRecommendation.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CPASAdvertiserPartnershipRecommendation(), + 'NODE', + CPASAdvertiserPartnershipRecommendation::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASCollaborationRequest.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASCollaborationRequest.php new file mode 100644 index 00000000..549e19f8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASCollaborationRequest.php @@ -0,0 +1,89 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CPASCollaborationRequest(), + 'NODE', + CPASCollaborationRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASParentCatalogSettings.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASParentCatalogSettings.php new file mode 100644 index 00000000..3a1519bc --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CPASParentCatalogSettings.php @@ -0,0 +1,107 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CPASParentCatalogSettings(), + 'NODE', + CPASParentCatalogSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attribution_windows' => 'list', + ); + $enums = array( + 'attribution_windows_enum' => CPASParentCatalogSettingsAttributionWindowsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new CPASParentCatalogSettings(), + 'NODE', + CPASParentCatalogSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Campaign.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Campaign.php new file mode 100644 index 00000000..d21de39c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Campaign.php @@ -0,0 +1,548 @@ +getValues(); + $ref_enums['ConfiguredStatus'] = CampaignConfiguredStatusValues::getInstance()->getValues(); + $ref_enums['EffectiveStatus'] = CampaignEffectiveStatusValues::getInstance()->getValues(); + $ref_enums['Status'] = CampaignStatusValues::getInstance()->getValues(); + $ref_enums['DatePreset'] = CampaignDatePresetValues::getInstance()->getValues(); + $ref_enums['ExecutionOptions'] = CampaignExecutionOptionsValues::getInstance()->getValues(); + $ref_enums['Objective'] = CampaignObjectiveValues::getInstance()->getValues(); + $ref_enums['SmartPromotionType'] = CampaignSmartPromotionTypeValues::getInstance()->getValues(); + $ref_enums['SpecialAdCategories'] = CampaignSpecialAdCategoriesValues::getInstance()->getValues(); + $ref_enums['SpecialAdCategoryCountry'] = CampaignSpecialAdCategoryCountryValues::getInstance()->getValues(); + $ref_enums['Operator'] = CampaignOperatorValues::getInstance()->getValues(); + $ref_enums['SpecialAdCategory'] = CampaignSpecialAdCategoryValues::getInstance()->getValues(); + $ref_enums['StatusOption'] = CampaignStatusOptionValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAdStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'execution_options' => 'list', + ); + $enums = array( + 'execution_options_enum' => CampaignExecutionOptionsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adlabels', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdRulesGoverned(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'pass_evaluation' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adrules_governed', + new AdRule(), + 'EDGE', + AdRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'time_range' => 'Object', + 'updated_since' => 'int', + ); + $enums = array( + 'date_preset_enum' => AdDatePresetValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'is_completed' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => AdSetDatePresetValues::getInstance()->getValues(), + 'effective_status_enum' => AdSetEffectiveStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adsets', + new AdSet(), + 'EDGE', + AdSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getContentDeliveryReport(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_date' => 'datetime', + 'page_id' => 'unsigned int', + 'platform' => 'platform_enum', + 'position' => 'position_enum', + 'start_date' => 'datetime', + 'summary' => 'bool', + ); + $enums = array( + 'platform_enum' => ContentDeliveryReportPlatformValues::getInstance()->getValues(), + 'position_enum' => ContentDeliveryReportPositionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/content_delivery_report', + new ContentDeliveryReport(), + 'EDGE', + ContentDeliveryReport::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCopies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'effective_status' => 'list', + 'is_completed' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => CampaignDatePresetValues::getInstance()->getValues(), + 'effective_status_enum' => CampaignEffectiveStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/copies', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCopy(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'deep_copy' => 'bool', + 'end_time' => 'datetime', + 'rename_options' => 'Object', + 'start_time' => 'datetime', + 'status_option' => 'status_option_enum', + ); + $enums = array( + 'status_option_enum' => CampaignStatusOptionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/copies', + new Campaign(), + 'EDGE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new AdsInsights(), + 'EDGE', + AdsInsights::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsightsAsync(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'action_report_time_enum', + 'breakdowns' => 'list', + 'date_preset' => 'date_preset_enum', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'level_enum', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + $enums = array( + 'action_attribution_windows_enum' => AdsInsightsActionAttributionWindowsValues::getInstance()->getValues(), + 'action_breakdowns_enum' => AdsInsightsActionBreakdownsValues::getInstance()->getValues(), + 'action_report_time_enum' => AdsInsightsActionReportTimeValues::getInstance()->getValues(), + 'breakdowns_enum' => AdsInsightsBreakdownsValues::getInstance()->getValues(), + 'date_preset_enum' => AdsInsightsDatePresetValues::getInstance()->getValues(), + 'level_enum' => AdsInsightsLevelValues::getInstance()->getValues(), + 'summary_action_breakdowns_enum' => AdsInsightsSummaryActionBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/insights', + new AdReportRun(), + 'EDGE', + AdReportRun::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'am_call_tags' => 'map', + 'date_preset' => 'date_preset_enum', + 'from_adtable' => 'bool', + 'time_range' => 'Object', + ); + $enums = array( + 'date_preset_enum' => array( + 'last_14d', + 'last_28d', + 'last_30d', + 'last_3d', + 'last_7d', + 'last_90d', + 'last_month', + 'last_quarter', + 'last_week_mon_sun', + 'last_week_sun_sat', + 'last_year', + 'lifetime', + 'this_month', + 'this_quarter', + 'this_week_mon_today', + 'this_week_sun_today', + 'this_year', + 'today', + 'yesterday', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Campaign(), + 'NODE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adlabels' => 'list', + 'adset_bid_amounts' => 'map', + 'adset_budgets' => 'list', + 'bid_strategy' => 'bid_strategy_enum', + 'budget_rebalance_flag' => 'bool', + 'daily_budget' => 'unsigned int', + 'execution_options' => 'list', + 'iterative_split_test_configs' => 'list', + 'lifetime_budget' => 'unsigned int', + 'name' => 'string', + 'objective' => 'objective_enum', + 'pacing_type' => 'list', + 'promoted_object' => 'Object', + 'smart_promotion_type' => 'smart_promotion_type_enum', + 'special_ad_categories' => 'list', + 'special_ad_category' => 'special_ad_category_enum', + 'special_ad_category_country' => 'list', + 'spend_cap' => 'unsigned int', + 'status' => 'status_enum', + 'upstream_events' => 'map', + ); + $enums = array( + 'bid_strategy_enum' => CampaignBidStrategyValues::getInstance()->getValues(), + 'execution_options_enum' => CampaignExecutionOptionsValues::getInstance()->getValues(), + 'objective_enum' => CampaignObjectiveValues::getInstance()->getValues(), + 'smart_promotion_type_enum' => CampaignSmartPromotionTypeValues::getInstance()->getValues(), + 'special_ad_categories_enum' => CampaignSpecialAdCategoriesValues::getInstance()->getValues(), + 'special_ad_category_enum' => CampaignSpecialAdCategoryValues::getInstance()->getValues(), + 'special_ad_category_country_enum' => CampaignSpecialAdCategoryCountryValues::getInstance()->getValues(), + 'status_enum' => CampaignStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Campaign(), + 'NODE', + Campaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CampaignGroupBrandConfiguration.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CampaignGroupBrandConfiguration.php new file mode 100644 index 00000000..8783034f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CampaignGroupBrandConfiguration.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/duplicate_canvas', + new Canvas(), + 'EDGE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPreviewNotification(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user_ids' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/preview_notifications', + new Canvas(), + 'EDGE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Canvas(), + 'NODE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'background_color' => 'string', + 'body_element_ids' => 'list', + 'enable_swipe_to_open' => 'bool', + 'is_hidden' => 'bool', + 'is_published' => 'bool', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Canvas(), + 'NODE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanvasAdSettings.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanvasAdSettings.php new file mode 100644 index 00000000..63df2847 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CanvasAdSettings.php @@ -0,0 +1,57 @@ +getApi()->call( + '/'.$this->parentId.'/'.$this->getEndpoint(), + RequestInterface::METHOD_DELETE, + $params); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CollaborativeAdsPartnerInfoListItem.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CollaborativeAdsPartnerInfoListItem.php new file mode 100644 index 00000000..70a9b212 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CollaborativeAdsPartnerInfoListItem.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CollaborativeAdsShareSettings(), + 'NODE', + CollaborativeAdsShareSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'utm_campaign' => 'string', + 'utm_medium' => 'string', + 'utm_source' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new CollaborativeAdsShareSettings(), + 'NODE', + CollaborativeAdsShareSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Comment.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Comment.php new file mode 100644 index 00000000..02a3f246 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Comment.php @@ -0,0 +1,307 @@ +getValues(); + $ref_enums['Filter'] = CommentFilterValues::getInstance()->getValues(); + $ref_enums['LiveFilter'] = CommentLiveFilterValues::getInstance()->getValues(); + $ref_enums['Order'] = CommentOrderValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'facepile_mentioned_ids' => 'list', + 'feedback_source' => 'string', + 'is_offline' => 'bool', + 'message' => 'string', + 'nectar_module' => 'string', + 'object_id' => 'string', + 'parent_comment_id' => 'Object', + 'text' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/likes', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLike(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/likes', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Comment(), + 'NODE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'is_hidden' => 'bool', + 'message' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Comment(), + 'NODE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettings.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettings.php new file mode 100644 index 00000000..3fae3100 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettings.php @@ -0,0 +1,310 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/order_management_apps', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOrderManagementApp(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/order_management_apps', + new CommerceMerchantSettings(), + 'EDGE', + CommerceMerchantSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReturns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_time_created' => 'datetime', + 'merchant_return_id' => 'string', + 'start_time_created' => 'datetime', + 'statuses' => 'list', + ); + $enums = array( + 'statuses_enum' => array( + 'APPROVED', + 'DISAPPROVED', + 'MERCHANT_MARKED_COMPLETED', + 'REFUNDED', + 'REQUESTED', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/returns', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSetupStatus(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/setup_status', + new CommerceMerchantSettingsSetupStatus(), + 'EDGE', + CommerceMerchantSettingsSetupStatus::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getShippingProfiles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'reference_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shipping_profiles', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createShippingProfile(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'handling_time' => 'map', + 'is_default_shipping_profile' => 'bool', + 'name' => 'string', + 'reference_id' => 'string', + 'shipping_destinations' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/shipping_profiles', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTaxSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tax_settings', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createWhatsappChannel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'op' => 'op_enum', + 'whatsapp_business_accounts' => 'list', + ); + $enums = array( + 'op_enum' => array( + 'ADD', + 'REMOVE', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/whatsapp_channel', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CommerceMerchantSettings(), + 'NODE', + CommerceMerchantSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettingsSetupStatus.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettingsSetupStatus.php new file mode 100644 index 00000000..5a1fefcf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceMerchantSettingsSetupStatus.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Filters'] = CommerceOrderFiltersValues::getInstance()->getValues(); + $ref_enums['State'] = CommerceOrderStateValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function createAcknowledgeOrder(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'idempotency_key' => 'string', + 'merchant_order_reference' => 'string', + 'return_error_response' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/acknowledge_order', + new CommerceOrder(), + 'EDGE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCancellations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/cancellations', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCancellation(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'cancel_reason' => 'map', + 'idempotency_key' => 'string', + 'items' => 'list', + 'restock_items' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/cancellations', + new CommerceOrder(), + 'EDGE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getItems(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/items', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPayments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/payments', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPromotionDetails(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/promotion_details', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPromotions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/promotions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRefunds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/refunds', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createRefund(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'deductions' => 'list', + 'idempotency_key' => 'string', + 'items' => 'list', + 'reason_code' => 'reason_code_enum', + 'reason_text' => 'string', + 'return_id' => 'string', + 'shipping' => 'map', + ); + $enums = array( + 'reason_code_enum' => CommerceOrderReasonCodeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/refunds', + new CommerceOrder(), + 'EDGE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReturns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'merchant_return_id' => 'string', + 'statuses' => 'list', + ); + $enums = array( + 'statuses_enum' => array( + 'APPROVED', + 'DISAPPROVED', + 'MERCHANT_MARKED_COMPLETED', + 'REFUNDED', + 'REQUESTED', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/returns', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getShipments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shipments', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createShipment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'external_redemption_link' => 'string', + 'external_shipment_id' => 'string', + 'fulfillment' => 'map', + 'idempotency_key' => 'string', + 'items' => 'list', + 'merchant_order_reference' => 'string', + 'shipment_origin_postal_code' => 'string', + 'shipping_tax_details' => 'map', + 'tracking_info' => 'map', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/shipments', + new CommerceOrder(), + 'EDGE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUpdateShipment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'fulfillment_id' => 'string', + 'idempotency_key' => 'string', + 'tracking_info' => 'map', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/update_shipment', + new CommerceOrder(), + 'EDGE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CommerceOrder(), + 'NODE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceOrderTransactionDetail.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceOrderTransactionDetail.php new file mode 100644 index 00000000..9d0505b9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommerceOrderTransactionDetail.php @@ -0,0 +1,103 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/items', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTaxDetails(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tax_details', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommercePayout.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommercePayout.php new file mode 100644 index 00000000..1ee8d9ad --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CommercePayout.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Position'] = ContentDeliveryReportPositionValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ConversionActionQuery.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ConversionActionQuery.php new file mode 100644 index 00000000..c8d88fba --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ConversionActionQuery.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['ContentType'] = CustomAudienceContentTypeValues::getInstance()->getValues(); + $ref_enums['CustomerFileSource'] = CustomAudienceCustomerFileSourceValues::getInstance()->getValues(); + $ref_enums['Subtype'] = CustomAudienceSubtypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccounts' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/adaccounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'permissions' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaccounts' => 'list', + 'permissions' => 'string', + 'relationship_type' => 'list', + 'replace' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adaccounts', + new CustomAudience(), + 'EDGE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'effective_status' => 'list', + 'status' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads', + new Ad(), + 'EDGE', + Ad::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSessions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'session_id' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sessions', + new CustomAudienceSession(), + 'EDGE', + CustomAudienceSession::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedAccountInfo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shared_account_info', + new CustomAudiencesharedAccountInfo(), + 'EDGE', + CustomAudiencesharedAccountInfo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'namespace' => 'string', + 'payload' => 'Object', + 'session' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/users', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'namespace' => 'string', + 'payload' => 'Object', + 'session' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/users', + new CustomAudience(), + 'EDGE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account_id' => 'string', + 'target_countries' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CustomAudience(), + 'NODE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'accountID' => 'string', + 'additionalMetadata' => 'string', + 'allowed_domains' => 'list', + 'claim_objective' => 'claim_objective_enum', + 'content_type' => 'content_type_enum', + 'countries' => 'string', + 'customer_file_source' => 'customer_file_source_enum', + 'description' => 'string', + 'details' => 'string', + 'enable_fetch_or_create' => 'bool', + 'event_source_group' => 'string', + 'event_sources' => 'list', + 'exclusions' => 'list', + 'expectedSize' => 'unsigned int', + 'gender' => 'string', + 'inclusions' => 'list', + 'isPrivate' => 'bool', + 'is_household' => 'bool', + 'is_household_exclusion' => 'bool', + 'lookalike_spec' => 'string', + 'maxAge' => 'unsigned int', + 'minAge' => 'unsigned int', + 'name' => 'string', + 'opt_out_link' => 'string', + 'parent_audience_id' => 'unsigned int', + 'partnerID' => 'string', + 'partner_reference_key' => 'string', + 'product_set_id' => 'string', + 'retention_days' => 'unsigned int', + 'rev_share_policy_id' => 'unsigned int', + 'rule' => 'string', + 'rule_aggregation' => 'string', + 'seed_audience' => 'unsigned int', + 'source' => 'string', + 'tags' => 'list', + ); + $enums = array( + 'claim_objective_enum' => CustomAudienceClaimObjectiveValues::getInstance()->getValues(), + 'content_type_enum' => CustomAudienceContentTypeValues::getInstance()->getValues(), + 'customer_file_source_enum' => CustomAudienceCustomerFileSourceValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new CustomAudience(), + 'NODE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function addUsers( + array $users, + $type, + array $app_ids = array(), + $is_hashed = false, + $pending = false) { + + $params = $this->formatParams($users, $type, $app_ids, $is_hashed); + return $this->createUser(array(), $params, $pending); + } + + public function removeUsers( + array $users, + $type, + array $app_ids = array(), + $is_hashed = false, + $pending = false) { + + $params = $this->formatParams($users, $type, $app_ids, $is_hashed); + return $this->deleteUsers(array(), $params, $pending); + } + + + /** + * Take users and format them correctly for the request + * + * @param array $users + * @param string $type + * @param array $app_ids + * @param bool $is_hashed + * @return array + */ + protected function formatParams( + array $users, + $type, + array $app_ids = array(), + $is_hashed = false) { + + if ($type == CustomAudienceTypes::EMAIL + || $type == CustomAudienceTypes::PHONE) { + $normalizer = new EmailNormalizer(); + $hash_normalizer = new HashNormalizer(); + foreach ($users as &$user) { + if ($type == CustomAudienceTypes::EMAIL) { + $user = $normalizer->normalize(CustomAudienceTypes::EMAIL, $user); + } + if (!$is_hashed) { + $user = $hash_normalizer->normalize( + CustomAudienceTypes::EMAIL, $user); + } + } + } + + $payload = array( + 'schema' => $type, + 'data' => $users, + ); + + if ($type === CustomAudienceTypes::ID) { + if (empty($app_ids)) { + throw new \InvalidArgumentException( + "Custom audiences with type ".CustomAudienceTypes::ID." require" + ."at least one app_id"); + } + + $payload['app_ids'] = $app_ids; + } + + return array('payload' => $payload); + } + + /** + * @var \ArrayObject + */ + protected $normalizers; + + /** + * @return \ArrayObject + */ + public function getNormalizers() { + if ($this->normalizers === null) { + $this->normalizers = new \ArrayObject(array( + new CustomAudienceNormalizers\EmailNormalizer(), + new CustomAudienceNormalizers\PhoneNormalizer(), + new CustomAudienceNormalizers\MadidNormalizer(), + new CustomAudienceNormalizers\GenderNormalizer(), + new CustomAudienceNormalizers\BirthYearNormalizer(), + new CustomAudienceNormalizers\DateNormalizer(), + new CustomAudienceNormalizers\FirstNameNormalizer(), + new CustomAudienceNormalizers\LastNameNormalizer(), + new CustomAudienceNormalizers\FirstNameInitialNormalizer(), + new CustomAudienceNormalizers\StateNormalizer(), + new CustomAudienceNormalizers\CityNormalizer(), + new CustomAudienceNormalizers\ZipNormalizer(), + new CustomAudienceNormalizers\CountryNormalizer(), + )); + } + return $this->normalizers; + } + + /** + * Add users to the CustomAudiences with multiple keys. There is no max on the + * total number of users that can be added to an audience, but up to 10000 + * users can be added at a given time. + * + * @param array $users + * @param array $types + * @param bool $is_hashed + * @param bool $is_normalized + * @return array + */ + public function addUsersMultiKey( + array $users, + array $types, + $is_hashed = false, + $is_normalized = false) { + $params = $this->formatParamsMultiKey($users, $types, $is_hashed, $is_normalized); + return $this->getApi()->call( + '/'.$this->assureId().'/users', + RequestInterface::METHOD_POST, + $params)->getContent(); + } + + + /** + * Delete users from AdCustomAudiences with multiple keys + * + * @param array $users + * @param array $types + * @param bool $is_hashed + * @param bool $is_normalized + * @return array + */ + public function removeUsersMultiKey( + array $users, + array $types, + $is_hashed = false, + $is_normalized = false) { + $params = $this->formatParamsMultiKey($users, $types, $is_hashed, $is_normalized); + return $this->getApi()->call( + '/'.$this->assureId().'/users', + RequestInterface::METHOD_DELETE, + $params)->getContent(); + } + + /** + * Take users and format them correctly for the request + * + * @param array $users + * @param array $types + * @param bool $is_hashed + * @param bool $is_normalized + * @return array + */ + protected function formatParamsMultiKey( + array $users, + array $types, + $is_hashed = false, + $is_normalized = false) { + + if (!$is_hashed) { + if ($is_normalized) { + $normalizers = new \ArrayObject(array( + new HashNormalizer() + )); + } + else { + $normalizers = clone $this->getNormalizers(); + $normalizers->append(new HashNormalizer()); + } + foreach ($users as &$user) { + if (count($types) != count($user)) { + throw new \InvalidArgumentException( + "Number of keys in each list in the data should ". + "match the number of keys specified in scheme"); + break; + } + foreach ($user as $index => &$key_value) { + $key = $types[$index]; + foreach ($normalizers as $normalizer) { + if ($key_value && + $key !== CustomAudienceMultikeySchemaFields::EXTERN_ID && + $normalizer->shouldNormalize($key, $key_value)) { + $key_value = $normalizer->normalize($key, $key_value); + } + } + } + } + } + + $payload = array( + 'schema' => $types, + 'data' => $users, + ); + + return array('payload' => $payload); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceAdAccount.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceAdAccount.php new file mode 100644 index 00000000..174df79c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceAdAccount.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Type'] = CustomAudienceDataSourceTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceMultiKey.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceMultiKey.php new file mode 100644 index 00000000..62d9b65f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceMultiKey.php @@ -0,0 +1,193 @@ +normalizers === null) { + $this->normalizers = new \ArrayObject(array( + new CustomAudienceNormalizers\EmailNormalizer(), + new CustomAudienceNormalizers\PhoneNormalizer(), + new CustomAudienceNormalizers\MadidNormalizer(), + new CustomAudienceNormalizers\GenderNormalizer(), + new CustomAudienceNormalizers\BirthYearNormalizer(), + new CustomAudienceNormalizers\DateNormalizer(), + new CustomAudienceNormalizers\FirstNameNormalizer(), + new CustomAudienceNormalizers\LastNameNormalizer(), + new CustomAudienceNormalizers\FirstNameInitialNormalizer(), + new CustomAudienceNormalizers\StateNormalizer(), + new CustomAudienceNormalizers\CityNormalizer(), + new CustomAudienceNormalizers\ZipNormalizer(), + new CustomAudienceNormalizers\CountryNormalizer(), + )); + } + return $this->normalizers; + } + + /** + * @deprecated + * Add users to the AdCustomAudiences. There is no max on the total number of + * users that can be added to an audience, but up to 10000 users can be added + * at a given time. + * + * @param array $users + * @param array $types + * @param bool $is_hashed + * @param bool $is_normalized + * @return array + */ + public function addUsers( + array $users, + array $types, + $is_hashed = false, + $is_normalized = false) { + $warning_message = 'CustomAudienceMultiKey is being deprecated, please use'. + '`new CustomAudience(...)->addUsers(..)` instead'; + trigger_error($warning_message, E_USER_DEPRECATED); + + $params = $this->formatParams($users, $types, $is_hashed, $is_normalized); + return $this->getApi()->call( + '/'.$this->assureId().'/users', + RequestInterface::METHOD_POST, + $params)->getContent(); + } + + /** + * @deprecated + * Delete users from AdCustomAudiences + * + * @param array $users + * @param array $types + * @param bool $is_hashed + * @param bool $is_normalized + * @return array + */ + public function removeUsers( + array $users, + array $types, + $is_hashed = false, + $is_normalized = false) { + $warning_message = 'CustomAudienceMultiKey is being deprecated, please use'. + '`new CustomAudience(...)->removeUsers(..)` instead'; + trigger_error($warning_message, E_USER_DEPRECATED); + $params = $this->formatParams($users, $types, $is_hashed, $is_normalized); + return $this->getApi()->call( + '/'.$this->assureId().'/users', + RequestInterface::METHOD_DELETE, + $params)->getContent(); + } + + /** + * Take users and format them correctly for the request + * + * @param array $users + * @param array $types + * @param bool $is_hashed + * @param bool $is_normalized + * @return array + */ + protected function formatParams( + array $users, + array $types, + $is_hashed = false, + $is_normalized = false) { + + if (!$is_hashed) { + if ($is_normalized) { + $normalizers = new \ArrayObject(array( + new HashNormalizer() + )); + } + else { + $normalizers = clone $this->getNormalizers(); + $normalizers->append(new HashNormalizer()); + } + foreach ($users as &$user) { + if (count($types) != count($user)) { + throw new \InvalidArgumentException( + "Number of keys in each list in the data should ". + "match the number of keys specified in scheme"); + break; + } + foreach ($user as $index => &$key_value) { + $key = $types[$index]; + foreach ($normalizers as $normalizer) { + if ($key_value && + $key !== CustomAudienceMultikeySchemaFields::EXTERN_ID && + $normalizer->shouldNormalize($key, $key_value)) { + $key_value = $normalizer->normalize($key, $key_value); + } + } + } + } + } + + $payload = array( + 'schema' => $types, + 'data' => $users, + ); + + return array('payload' => $payload); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/BirthYearNormalizer.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/BirthYearNormalizer.php new file mode 100644 index 00000000..88844b3a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomAudienceNormalizers/BirthYearNormalizer.php @@ -0,0 +1,49 @@ +getValues(); + return $ref_enums; + } + + + public function getStats(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation' => 'aggregation_enum', + 'end_time' => 'datetime', + 'start_time' => 'datetime', + ); + $enums = array( + 'aggregation_enum' => CustomConversionStatsResultAggregationValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/stats', + new CustomConversionStatsResult(), + 'EDGE', + CustomConversionStatsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new CustomConversion(), + 'NODE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'default_conversion_value' => 'float', + 'description' => 'string', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new CustomConversion(), + 'NODE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomConversionStatsResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomConversionStatsResult.php new file mode 100644 index 00000000..43ea3fe7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomConversionStatsResult.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomUserSettings.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomUserSettings.php new file mode 100644 index 00000000..852b4252 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/CustomUserSettings.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DayPart.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DayPart.php new file mode 100644 index 00000000..13cb66e3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DayPart.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Destination(), + 'NODE', + Destination::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DestinationCatalogSettings.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DestinationCatalogSettings.php new file mode 100644 index 00000000..10ea5a2d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DestinationCatalogSettings.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new DestinationCatalogSettings(), + 'NODE', + DestinationCatalogSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Domain.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Domain.php new file mode 100644 index 00000000..2cc14c2c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Domain.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Domain(), + 'NODE', + Domain::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicContentSet.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicContentSet.php new file mode 100644 index 00000000..d0b9bfc4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicContentSet.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new DynamicContentSet(), + 'NODE', + DynamicContentSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicPostChildAttachment.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicPostChildAttachment.php new file mode 100644 index 00000000..6676213d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/DynamicPostChildAttachment.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new DynamicPriceConfigByDate(), + 'NODE', + DynamicPriceConfigByDate::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Engagement.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Engagement.php new file mode 100644 index 00000000..8a06190a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Engagement.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Event.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Event.php new file mode 100644 index 00000000..be8afcef --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Event.php @@ -0,0 +1,328 @@ +getValues(); + $ref_enums['OnlineEventFormat'] = EventOnlineEventFormatValues::getInstance()->getValues(); + $ref_enums['Type'] = EventTypeValues::getInstance()->getValues(); + $ref_enums['EventStateFilter'] = EventEventStateFilterValues::getInstance()->getValues(); + $ref_enums['TimeFilter'] = EventTimeFilterValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/feed', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_videos', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLiveVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'content_tags' => 'list', + 'description' => 'string', + 'enable_backup_ingest' => 'bool', + 'encoding_settings' => 'string', + 'fisheye_video_cropped' => 'bool', + 'front_z_rotation' => 'float', + 'is_audio_only' => 'bool', + 'is_spherical' => 'bool', + 'live_encoders' => 'list', + 'original_fov' => 'unsigned int', + 'planned_start_time' => 'int', + 'privacy' => 'string', + 'projection' => 'projection_enum', + 'published' => 'bool', + 'schedule_custom_profile_image' => 'file', + 'spatial_audio_format' => 'spatial_audio_format_enum', + 'status' => 'status_enum', + 'stereoscopic_mode' => 'stereoscopic_mode_enum', + 'stop_on_delete_stream' => 'bool', + 'stream_type' => 'stream_type_enum', + 'title' => 'string', + ); + $enums = array( + 'projection_enum' => LiveVideoProjectionValues::getInstance()->getValues(), + 'spatial_audio_format_enum' => LiveVideoSpatialAudioFormatValues::getInstance()->getValues(), + 'status_enum' => LiveVideoStatusValues::getInstance()->getValues(), + 'stereoscopic_mode_enum' => LiveVideoStereoscopicModeValues::getInstance()->getValues(), + 'stream_type_enum' => LiveVideoStreamTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPhotos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/photos', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/posts', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRoles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/roles', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/videos', + new NullNode(), + 'EDGE', + NullNode::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Event(), + 'NODE', + Event::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventSourceGroup.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventSourceGroup.php new file mode 100644 index 00000000..2834a2ec --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventSourceGroup.php @@ -0,0 +1,159 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shared_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSharedAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'accounts' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/shared_accounts', + new EventSourceGroup(), + 'EDGE', + EventSourceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new EventSourceGroup(), + 'NODE', + EventSourceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'event_sources' => 'list', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new EventSourceGroup(), + 'NODE', + EventSourceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventTour.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventTour.php new file mode 100644 index 00000000..861b659b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/EventTour.php @@ -0,0 +1,126 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/events', + new Event(), + 'EDGE', + Event::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new EventTour(), + 'NODE', + EventTour::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Experience.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Experience.php new file mode 100644 index 00000000..842aa346 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Experience.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/extended_credit_invoice_groups', + new ExtendedCreditInvoiceGroup(), + 'EDGE', + ExtendedCreditInvoiceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createExtendedCreditInvoiceGroup(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'emails' => 'list', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/extended_credit_invoice_groups', + new ExtendedCreditInvoiceGroup(), + 'EDGE', + ExtendedCreditInvoiceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwningCreditAllocationConfigs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'receiving_business_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owning_credit_allocation_configs', + new ExtendedCreditAllocationConfig(), + 'EDGE', + ExtendedCreditAllocationConfig::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createOwningCreditAllocationConfig(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'amount' => 'Object', + 'liability_type' => 'liability_type_enum', + 'partition_type' => 'partition_type_enum', + 'receiving_business_id' => 'string', + 'send_bill_to' => 'send_bill_to_enum', + ); + $enums = array( + 'liability_type_enum' => ExtendedCreditAllocationConfigLiabilityTypeValues::getInstance()->getValues(), + 'partition_type_enum' => ExtendedCreditAllocationConfigPartitionTypeValues::getInstance()->getValues(), + 'send_bill_to_enum' => ExtendedCreditAllocationConfigSendBillToValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/owning_credit_allocation_configs', + new ExtendedCreditAllocationConfig(), + 'EDGE', + ExtendedCreditAllocationConfig::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createWhatsappCreditSharingAndAttach(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'waba_currency' => 'string', + 'waba_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/whatsapp_credit_sharing_and_attach', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ExtendedCredit(), + 'NODE', + ExtendedCredit::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditAllocationConfig.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditAllocationConfig.php new file mode 100644 index 00000000..164b2034 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditAllocationConfig.php @@ -0,0 +1,133 @@ +getValues(); + $ref_enums['PartitionType'] = ExtendedCreditAllocationConfigPartitionTypeValues::getInstance()->getValues(); + $ref_enums['SendBillTo'] = ExtendedCreditAllocationConfigSendBillToValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ExtendedCreditAllocationConfig(), + 'NODE', + ExtendedCreditAllocationConfig::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'amount' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ExtendedCreditAllocationConfig(), + 'NODE', + ExtendedCreditAllocationConfig::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditInvoiceGroup.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditInvoiceGroup.php new file mode 100644 index 00000000..7300a490 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExtendedCreditInvoiceGroup.php @@ -0,0 +1,199 @@ +assureId(); + + $param_types = array( + 'ad_account_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/ad_accounts', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ExtendedCreditInvoiceGroup(), + 'NODE', + ExtendedCreditInvoiceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'emails' => 'list', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ExtendedCreditInvoiceGroup(), + 'NODE', + ExtendedCreditInvoiceGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExternalEventSource.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExternalEventSource.php new file mode 100644 index 00000000..38028b37 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ExternalEventSource.php @@ -0,0 +1,64 @@ + 'Profile', + 'created_time' => 'datetime', + 'credit_new' => 'Object', + 'credit_old' => 'Object', + 'currency_new' => 'string', + 'currency_old' => 'string', + 'daily_spend_limit_new' => 'Object', + 'daily_spend_limit_old' => 'Object', + 'event_time' => 'datetime', + 'event_type' => 'string', + 'funding_id_new' => 'string', + 'funding_id_old' => 'string', + 'grace_period_time_new' => 'int', + 'grace_period_time_old' => 'int', + 'id' => 'string', + 'manager_id_new' => 'Profile', + 'manager_id_old' => 'Profile', + 'name_new' => 'string', + 'name_old' => 'string', + 'spend_cap_new' => 'Object', + 'spend_cap_old' => 'Object', + 'status_new' => 'string', + 'status_old' => 'string', + 'terms_new' => 'int', + 'terms_old' => 'int', + 'tier_new' => 'string', + 'tier_old' => 'string', + 'time_updated_new' => 'datetime', + 'time_updated_old' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdRulesHistoryFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdRulesHistoryFields.php new file mode 100644 index 00000000..6e138a74 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdRulesHistoryFields.php @@ -0,0 +1,63 @@ + 'AdRuleEvaluationSpec', + 'exception_code' => 'int', + 'exception_message' => 'string', + 'execution_spec' => 'AdRuleExecutionSpec', + 'is_manual' => 'bool', + 'results' => 'list', + 'rule_id' => 'int', + 'schedule_spec' => 'AdRuleScheduleSpec', + 'timestamp' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdVolumeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdVolumeFields.php new file mode 100644 index 00000000..2bfcdd17 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountAdVolumeFields.php @@ -0,0 +1,69 @@ + 'string', + 'actor_name' => 'string', + 'ad_limit_scope_business' => 'Business', + 'ad_limit_scope_business_manager_id' => 'string', + 'ad_limit_set_by_page_admin' => 'unsigned int', + 'ads_running_or_in_review_count' => 'unsigned int', + 'ads_running_or_in_review_count_subject_to_limit_set_by_page' => 'unsigned int', + 'current_account_ads_running_or_in_review_count' => 'unsigned int', + 'future_limit_activation_date' => 'string', + 'future_limit_on_ads_running_or_in_review' => 'unsigned int', + 'limit_on_ads_running_or_in_review' => 'unsigned int', + 'recommendations' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountContentFilterLevelsInheritanceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountContentFilterLevelsInheritanceFields.php new file mode 100644 index 00000000..41c123ac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountContentFilterLevelsInheritanceFields.php @@ -0,0 +1,53 @@ + 'list', + 'an_level' => 'string', + 'facebook_business_ids' => 'list', + 'facebook_level' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountCreationRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountCreationRequestFields.php new file mode 100644 index 00000000..d65a8064 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountCreationRequestFields.php @@ -0,0 +1,111 @@ + 'string', + 'ad_accounts_info' => 'list', + 'additional_comment' => 'string', + 'address_in_chinese' => 'string', + 'address_in_english' => 'Object', + 'address_in_local_language' => 'string', + 'advertiser_business' => 'Business', + 'appeal_reason' => 'Object', + 'business' => 'Business', + 'business_registration_id' => 'string', + 'chinese_legal_entity_name' => 'string', + 'contact' => 'Object', + 'creator' => 'User', + 'credit_card_id' => 'string', + 'disapproval_reasons' => 'list', + 'english_legal_entity_name' => 'string', + 'extended_credit_id' => 'string', + 'id' => 'string', + 'is_smb' => 'bool', + 'is_test' => 'bool', + 'legal_entity_name_in_local_language' => 'string', + 'oe_request_id' => 'string', + 'official_website_url' => 'string', + 'planning_agency_business' => 'Business', + 'planning_agency_business_id' => 'string', + 'promotable_app_ids' => 'list', + 'promotable_page_ids' => 'list', + 'promotable_urls' => 'list', + 'request_change_reasons' => 'list', + 'status' => 'string', + 'subvertical' => 'string', + 'time_created' => 'datetime', + 'vertical' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultDestinationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultDestinationFields.php new file mode 100644 index 00000000..2cce365c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultDestinationFields.php @@ -0,0 +1,49 @@ + 'string', + 'destination_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultObjectiveFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultObjectiveFields.php new file mode 100644 index 00000000..ff702685 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDefaultObjectiveFields.php @@ -0,0 +1,49 @@ + 'DefaultObjectiveForUser', + 'objective_for_level' => 'ObjectiveForLevel', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDeliveryEstimateFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDeliveryEstimateFields.php new file mode 100644 index 00000000..ff5f90b6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountDeliveryEstimateFields.php @@ -0,0 +1,53 @@ + 'list', + 'estimate_dau' => 'int', + 'estimate_mau' => 'int', + 'estimate_ready' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountFields.php new file mode 100644 index 00000000..7f579671 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountFields.php @@ -0,0 +1,165 @@ + 'string', + 'account_status' => 'unsigned int', + 'ad_account_creation_request' => 'AdAccountCreationRequest', + 'ad_account_promotable_objects' => 'AdAccountPromotableObjects', + 'age' => 'float', + 'agency_client_declaration' => 'AgencyClientDeclaration', + 'amount_spent' => 'string', + 'attribution_spec' => 'list', + 'balance' => 'string', + 'business' => 'Business', + 'business_city' => 'string', + 'business_country_code' => 'string', + 'business_name' => 'string', + 'business_state' => 'string', + 'business_street' => 'string', + 'business_street2' => 'string', + 'business_zip' => 'string', + 'capabilities' => 'list', + 'created_time' => 'datetime', + 'currency' => 'string', + 'disable_reason' => 'unsigned int', + 'end_advertiser' => 'string', + 'end_advertiser_name' => 'string', + 'extended_credit_invoice_group' => 'ExtendedCreditInvoiceGroup', + 'failed_delivery_checks' => 'list', + 'fb_entity' => 'unsigned int', + 'funding_source' => 'string', + 'funding_source_details' => 'FundingSourceDetails', + 'has_migrated_permissions' => 'bool', + 'has_page_authorized_adaccount' => 'bool', + 'id' => 'string', + 'io_number' => 'string', + 'is_attribution_spec_system_default' => 'bool', + 'is_direct_deals_enabled' => 'bool', + 'is_in_3ds_authorization_enabled_market' => 'bool', + 'is_in_middle_of_local_entity_migration' => 'bool', + 'is_notifications_enabled' => 'bool', + 'is_personal' => 'unsigned int', + 'is_prepay_account' => 'bool', + 'is_tax_id_required' => 'bool', + 'line_numbers' => 'list', + 'media_agency' => 'string', + 'min_campaign_group_spend_cap' => 'string', + 'min_daily_budget' => 'unsigned int', + 'name' => 'string', + 'offsite_pixels_tos_accepted' => 'bool', + 'owner' => 'string', + 'partner' => 'string', + 'rf_spec' => 'ReachFrequencySpec', + 'show_checkout_experience' => 'bool', + 'spend_cap' => 'string', + 'tax_id' => 'string', + 'tax_id_status' => 'unsigned int', + 'tax_id_type' => 'string', + 'timezone_id' => 'unsigned int', + 'timezone_name' => 'string', + 'timezone_offset_hours_utc' => 'float', + 'tos_accepted' => 'map', + 'user_tasks' => 'list', + 'user_tos_accepted' => 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMatchedSearchApplicationsEdgeDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMatchedSearchApplicationsEdgeDataFields.php new file mode 100644 index 00000000..098d0700 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMatchedSearchApplicationsEdgeDataFields.php @@ -0,0 +1,61 @@ + 'string', + 'are_app_events_unavailable' => 'bool', + 'icon_url' => 'string', + 'name' => 'string', + 'search_source_store' => 'string', + 'store' => 'string', + 'unique_id' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMaxBidFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMaxBidFields.php new file mode 100644 index 00000000..9edde89e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountMaxBidFields.php @@ -0,0 +1,47 @@ + 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountPromotableObjectsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountPromotableObjectsFields.php new file mode 100644 index 00000000..c069f03b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountPromotableObjectsFields.php @@ -0,0 +1,51 @@ + 'list', + 'promotable_page_ids' => 'list', + 'promotable_urls' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountReachEstimateFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountReachEstimateFields.php new file mode 100644 index 00000000..5f4f62bd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountReachEstimateFields.php @@ -0,0 +1,49 @@ + 'bool', + 'users' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRecommendedCamapaignBudgetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRecommendedCamapaignBudgetFields.php new file mode 100644 index 00000000..610ac0a8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRecommendedCamapaignBudgetFields.php @@ -0,0 +1,51 @@ + 'string', + 'lifetime' => 'string', + 'objective' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRoasFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRoasFields.php new file mode 100644 index 00000000..d3d5e410 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountRoasFields.php @@ -0,0 +1,103 @@ + 'string', + 'arpu_180d' => 'float', + 'arpu_1d' => 'float', + 'arpu_30d' => 'float', + 'arpu_365d' => 'float', + 'arpu_3d' => 'float', + 'arpu_7d' => 'float', + 'arpu_90d' => 'float', + 'campaign_group_id' => 'string', + 'campaign_id' => 'string', + 'date_start' => 'string', + 'date_stop' => 'string', + 'installs' => 'unsigned int', + 'revenue' => 'float', + 'revenue_180d' => 'float', + 'revenue_1d' => 'float', + 'revenue_30d' => 'float', + 'revenue_365d' => 'float', + 'revenue_3d' => 'float', + 'revenue_7d' => 'float', + 'revenue_90d' => 'float', + 'spend' => 'float', + 'yield_180d' => 'float', + 'yield_1d' => 'float', + 'yield_30d' => 'float', + 'yield_365d' => 'float', + 'yield_3d' => 'float', + 'yield_7d' => 'float', + 'yield_90d' => 'float', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountSubscribedAppsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountSubscribedAppsFields.php new file mode 100644 index 00000000..7e3d4068 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountSubscribedAppsFields.php @@ -0,0 +1,49 @@ + 'string', + 'app_name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTargetingUnifiedFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTargetingUnifiedFields.php new file mode 100644 index 00000000..a77053de --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTargetingUnifiedFields.php @@ -0,0 +1,89 @@ + 'unsigned int', + 'conversion_lift' => 'float', + 'description' => 'string', + 'id' => 'string', + 'img' => 'string', + 'info' => 'string', + 'info_title' => 'string', + 'is_recommendation' => 'bool', + 'key' => 'string', + 'link' => 'string', + 'name' => 'string', + 'parent' => 'string', + 'partner' => 'string', + 'path' => 'list', + 'performance_rating' => 'unsigned int', + 'raw_name' => 'string', + 'recommendation_model' => 'string', + 'search_interest_id' => 'string', + 'source' => 'string', + 'spend' => 'float', + 'type' => 'string', + 'valid' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTrackingDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTrackingDataFields.php new file mode 100644 index 00000000..91890992 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountTrackingDataFields.php @@ -0,0 +1,47 @@ + 'ConversionActionQuery', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountUserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountUserFields.php new file mode 100644 index 00000000..4cfb08af --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAccountUserFields.php @@ -0,0 +1,51 @@ + 'string', + 'name' => 'string', + 'tasks' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdActivityFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdActivityFields.php new file mode 100644 index 00000000..4f7a0d61 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdActivityFields.php @@ -0,0 +1,69 @@ + 'string', + 'actor_name' => 'string', + 'application_id' => 'string', + 'application_name' => 'string', + 'date_time_in_timezone' => 'string', + 'event_time' => 'datetime', + 'event_type' => 'EventType', + 'extra_data' => 'string', + 'object_id' => 'string', + 'object_name' => 'string', + 'object_type' => 'string', + 'translated_event_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecAssetLabelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecAssetLabelFields.php new file mode 100644 index 00000000..8c0bf194 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecAssetLabelFields.php @@ -0,0 +1,49 @@ + 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecBodyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecBodyFields.php new file mode 100644 index 00000000..1ee64651 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecBodyFields.php @@ -0,0 +1,51 @@ + 'list', + 'text' => 'string', + 'url_tags' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecCaptionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecCaptionFields.php new file mode 100644 index 00000000..71b31e9a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecCaptionFields.php @@ -0,0 +1,51 @@ + 'list', + 'text' => 'string', + 'url_tags' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecDescriptionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecDescriptionFields.php new file mode 100644 index 00000000..d598952b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecDescriptionFields.php @@ -0,0 +1,51 @@ + 'list', + 'text' => 'string', + 'url_tags' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecFields.php new file mode 100644 index 00000000..e6beed50 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecFields.php @@ -0,0 +1,79 @@ + 'list', + 'additional_data' => 'Object', + 'asset_customization_rules' => 'list', + 'autotranslate' => 'list', + 'bodies' => 'list', + 'call_to_action_types' => 'list', + 'call_to_actions' => 'list', + 'captions' => 'list', + 'carousels' => 'list', + 'descriptions' => 'list', + 'groups' => 'list', + 'images' => 'list', + 'link_urls' => 'list', + 'optimization_type' => 'string', + 'posts' => 'list', + 'titles' => 'list', + 'videos' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecGroupRuleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecGroupRuleFields.php new file mode 100644 index 00000000..51217450 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecGroupRuleFields.php @@ -0,0 +1,59 @@ + 'AdAssetFeedSpecAssetLabel', + 'caption_label' => 'AdAssetFeedSpecAssetLabel', + 'description_label' => 'AdAssetFeedSpecAssetLabel', + 'image_label' => 'AdAssetFeedSpecAssetLabel', + 'link_url_label' => 'AdAssetFeedSpecAssetLabel', + 'title_label' => 'AdAssetFeedSpecAssetLabel', + 'video_label' => 'AdAssetFeedSpecAssetLabel', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecImageFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecImageFields.php new file mode 100644 index 00000000..1b77e610 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecImageFields.php @@ -0,0 +1,55 @@ + 'list', + 'hash' => 'string', + 'image_crops' => 'AdsImageCrops', + 'url' => 'string', + 'url_tags' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecLinkURLFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecLinkURLFields.php new file mode 100644 index 00000000..576ac988 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecLinkURLFields.php @@ -0,0 +1,57 @@ + 'list', + 'carousel_see_more_url' => 'string', + 'deeplink_url' => 'string', + 'display_url' => 'string', + 'url_tags' => 'string', + 'website_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecTitleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecTitleFields.php new file mode 100644 index 00000000..087df912 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecTitleFields.php @@ -0,0 +1,51 @@ + 'list', + 'text' => 'string', + 'url_tags' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecVideoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecVideoFields.php new file mode 100644 index 00000000..840b1000 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAssetFeedSpecVideoFields.php @@ -0,0 +1,57 @@ + 'list', + 'caption_ids' => 'list', + 'thumbnail_hash' => 'string', + 'thumbnail_url' => 'string', + 'url_tags' => 'string', + 'video_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestFields.php new file mode 100644 index 00000000..123a99cb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestFields.php @@ -0,0 +1,63 @@ + 'AdAsyncRequestSet', + 'created_time' => 'datetime', + 'id' => 'string', + 'input' => 'map', + 'result' => 'map', + 'scope_object_id' => 'string', + 'status' => 'string', + 'type' => 'string', + 'updated_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetFields.php new file mode 100644 index 00000000..dd647a0f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetFields.php @@ -0,0 +1,79 @@ + 'int', + 'created_time' => 'datetime', + 'error_count' => 'int', + 'id' => 'string', + 'in_progress_count' => 'int', + 'initial_count' => 'unsigned int', + 'is_completed' => 'bool', + 'name' => 'string', + 'notification_mode' => 'NotificationMode', + 'notification_result' => 'AdAsyncRequestSetNotificationResult', + 'notification_status' => 'NotificationStatus', + 'notification_uri' => 'string', + 'owner_id' => 'string', + 'success_count' => 'int', + 'total_count' => 'unsigned int', + 'updated_time' => 'datetime', + 'ad_specs' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetNotificationResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetNotificationResultFields.php new file mode 100644 index 00000000..f70ba7ea --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdAsyncRequestSetNotificationResultFields.php @@ -0,0 +1,49 @@ + 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdBidAdjustmentsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdBidAdjustmentsFields.php new file mode 100644 index 00000000..76c810d6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdBidAdjustmentsFields.php @@ -0,0 +1,51 @@ + 'map', + 'page_types' => 'Object', + 'user_groups' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignActivityFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignActivityFields.php new file mode 100644 index 00000000..c14e8295 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignActivityFields.php @@ -0,0 +1,161 @@ + 'bool', + 'auto_create_lookalike_old' => 'bool', + 'bid_adjustments_spec_new' => 'string', + 'bid_adjustments_spec_old' => 'string', + 'bid_amount_new' => 'int', + 'bid_amount_old' => 'int', + 'bid_constraints_new' => 'Object', + 'bid_constraints_old' => 'Object', + 'bid_info_new' => 'map', + 'bid_info_old' => 'map', + 'bid_strategy_new' => 'BidStrategyNew', + 'bid_strategy_old' => 'BidStrategyOld', + 'bid_type_new' => 'string', + 'bid_type_old' => 'string', + 'billing_event_new' => 'BillingEventNew', + 'billing_event_old' => 'BillingEventOld', + 'budget_limit_new' => 'Object', + 'budget_limit_old' => 'Object', + 'created_time' => 'datetime', + 'daily_impressions_new' => 'int', + 'daily_impressions_old' => 'int', + 'dco_mode_new' => 'string', + 'dco_mode_old' => 'string', + 'delivery_behavior_new' => 'string', + 'delivery_behavior_old' => 'string', + 'destination_type_new' => 'string', + 'destination_type_old' => 'string', + 'event_time' => 'datetime', + 'event_type' => 'string', + 'id' => 'string', + 'invoicing_limit_new' => 'int', + 'invoicing_limit_old' => 'int', + 'min_spend_target_new' => 'Object', + 'min_spend_target_old' => 'Object', + 'name_new' => 'string', + 'name_old' => 'string', + 'optimization_goal_new' => 'OptimizationGoalNew', + 'optimization_goal_old' => 'OptimizationGoalOld', + 'pacing_type_new' => 'int', + 'pacing_type_old' => 'int', + 'promoted_object_id_new' => 'string', + 'promoted_object_id_old' => 'string', + 'run_status_new' => 'string', + 'run_status_old' => 'string', + 'schedule_new' => 'list', + 'schedule_old' => 'list', + 'spend_cap_new' => 'Object', + 'spend_cap_old' => 'Object', + 'start_time_new' => 'datetime', + 'start_time_old' => 'datetime', + 'stop_time_new' => 'datetime', + 'stop_time_old' => 'datetime', + 'targeting_expansion_new' => 'Object', + 'targeting_expansion_old' => 'Object', + 'targeting_new' => 'Object', + 'targeting_old' => 'Object', + 'updated_time_new' => 'datetime', + 'updated_time_old' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignBidConstraintFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignBidConstraintFields.php new file mode 100644 index 00000000..9c445cca --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignBidConstraintFields.php @@ -0,0 +1,47 @@ + 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryEstimateFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryEstimateFields.php new file mode 100644 index 00000000..3d8cfe59 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryEstimateFields.php @@ -0,0 +1,53 @@ + 'list', + 'estimate_dau' => 'int', + 'estimate_mau' => 'int', + 'estimate_ready' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryStatsUnsupportedReasonsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryStatsUnsupportedReasonsFields.php new file mode 100644 index 00000000..e9c52fc8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignDeliveryStatsUnsupportedReasonsFields.php @@ -0,0 +1,49 @@ + 'map', + 'reason_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignFrequencyControlSpecsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignFrequencyControlSpecsFields.php new file mode 100644 index 00000000..34158b6a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignFrequencyControlSpecsFields.php @@ -0,0 +1,51 @@ + 'string', + 'interval_days' => 'unsigned int', + 'max_frequency' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignGroupActivityFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignGroupActivityFields.php new file mode 100644 index 00000000..a5dd7035 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignGroupActivityFields.php @@ -0,0 +1,91 @@ + 'Object', + 'budget_limit_old' => 'Object', + 'buying_type_new' => 'string', + 'buying_type_old' => 'string', + 'event_time' => 'datetime', + 'event_type' => 'string', + 'id' => 'string', + 'is_autobid_new' => 'bool', + 'is_autobid_old' => 'bool', + 'is_average_price_pacing_new' => 'bool', + 'is_average_price_pacing_old' => 'bool', + 'name_new' => 'string', + 'name_old' => 'string', + 'objective_new' => 'ObjectiveNew', + 'objective_old' => 'ObjectiveOld', + 'pacing_type' => 'int', + 'run_status_new' => 'string', + 'run_status_old' => 'string', + 'spend_cap_new' => 'int', + 'spend_cap_old' => 'int', + 'time_created' => 'datetime', + 'time_updated_new' => 'datetime', + 'time_updated_old' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignIssuesInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignIssuesInfoFields.php new file mode 100644 index 00000000..e1f8d1ac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignIssuesInfoFields.php @@ -0,0 +1,55 @@ + 'int', + 'error_message' => 'string', + 'error_summary' => 'string', + 'error_type' => 'string', + 'level' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignLearningStageInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignLearningStageInfoFields.php new file mode 100644 index 00000000..981118ad --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignLearningStageInfoFields.php @@ -0,0 +1,53 @@ + 'list', + 'conversions' => 'unsigned int', + 'last_sig_edit_ts' => 'int', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignOptimizationEventFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignOptimizationEventFields.php new file mode 100644 index 00000000..fa97c353 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignOptimizationEventFields.php @@ -0,0 +1,51 @@ + 'string', + 'event_sequence' => 'unsigned int', + 'event_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignPacedBidInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignPacedBidInfoFields.php new file mode 100644 index 00000000..c49888b6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCampaignPacedBidInfoFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeAdDisclaimerFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeAdDisclaimerFields.php new file mode 100644 index 00000000..43d42c55 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeAdDisclaimerFields.php @@ -0,0 +1,51 @@ + 'string', + 'title' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeCollectionThumbnailInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeCollectionThumbnailInfoFields.php new file mode 100644 index 00000000..41991607 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeCollectionThumbnailInfoFields.php @@ -0,0 +1,51 @@ + 'int', + 'element_crops' => 'AdsImageCrops', + 'element_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeFields.php new file mode 100644 index 00000000..72f5f126 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeFields.php @@ -0,0 +1,167 @@ + 'string', + 'actor_id' => 'string', + 'adlabels' => 'list', + 'applink_treatment' => 'ApplinkTreatment', + 'asset_feed_spec' => 'AdAssetFeedSpec', + 'authorization_category' => 'string', + 'auto_update' => 'bool', + 'body' => 'string', + 'branded_content_sponsor_page_id' => 'string', + 'bundle_folder_id' => 'string', + 'call_to_action_type' => 'CallToActionType', + 'categorization_criteria' => 'string', + 'category_media_source' => 'string', + 'destination_set_id' => 'string', + 'dynamic_ad_voice' => 'string', + 'effective_authorization_category' => 'string', + 'effective_instagram_media_id' => 'string', + 'effective_instagram_story_id' => 'string', + 'effective_object_story_id' => 'string', + 'enable_direct_install' => 'bool', + 'enable_launch_instant_app' => 'bool', + 'id' => 'string', + 'image_crops' => 'AdsImageCrops', + 'image_hash' => 'string', + 'image_url' => 'string', + 'instagram_actor_id' => 'string', + 'instagram_permalink_url' => 'string', + 'instagram_story_id' => 'string', + 'instagram_user_id' => 'string', + 'interactive_components_spec' => 'AdCreativeInteractiveComponentsSpec', + 'link_deep_link_url' => 'string', + 'link_destination_display_url' => 'string', + 'link_og_id' => 'string', + 'link_url' => 'string', + 'messenger_sponsored_message' => 'string', + 'name' => 'string', + 'object_id' => 'string', + 'object_store_url' => 'string', + 'object_story_id' => 'string', + 'object_story_spec' => 'AdCreativeObjectStorySpec', + 'object_type' => 'ObjectType', + 'object_url' => 'string', + 'place_page_set_id' => 'string', + 'platform_customizations' => 'AdCreativePlatformCustomization', + 'playable_asset_id' => 'string', + 'portrait_customizations' => 'AdCreativePortraitCustomizations', + 'product_set_id' => 'string', + 'recommender_settings' => 'AdCreativeRecommenderSettings', + 'source_instagram_media_id' => 'string', + 'status' => 'Status', + 'template_url' => 'string', + 'template_url_spec' => 'AdCreativeTemplateURLSpec', + 'thumbnail_url' => 'string', + 'title' => 'string', + 'url_tags' => 'string', + 'use_page_actor_override' => 'bool', + 'video_id' => 'string', + 'call_to_action' => 'Object', + 'image_file' => 'string', + 'instant_checkout_setting' => 'InstantCheckoutSetting', + 'is_dco_internal' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInsightsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInsightsFields.php new file mode 100644 index 00000000..daee8a2d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInsightsFields.php @@ -0,0 +1,47 @@ + 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInteractiveComponentsSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInteractiveComponentsSpecFields.php new file mode 100644 index 00000000..a3e581f1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeInteractiveComponentsSpecFields.php @@ -0,0 +1,49 @@ + 'list', + 'components' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataAppLinkSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataAppLinkSpecFields.php new file mode 100644 index 00000000..fac7efbf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataAppLinkSpecFields.php @@ -0,0 +1,53 @@ + 'list', + 'ios' => 'list', + 'ipad' => 'list', + 'iphone' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionFields.php new file mode 100644 index 00000000..15f0b138 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionFields.php @@ -0,0 +1,49 @@ + 'Type', + 'value' => 'AdCreativeLinkDataCallToActionValue', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionValueFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionValueFields.php new file mode 100644 index 00000000..2880f198 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataCallToActionValueFields.php @@ -0,0 +1,67 @@ + 'string', + 'app_link' => 'string', + 'application' => 'string', + 'event_id' => 'string', + 'lead_gen_form_id' => 'string', + 'link' => 'string', + 'link_caption' => 'string', + 'link_format' => 'string', + 'page' => 'string', + 'product_link' => 'string', + 'whatsapp_number' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataChildAttachmentFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataChildAttachmentFields.php new file mode 100644 index 00000000..c120f97d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataChildAttachmentFields.php @@ -0,0 +1,67 @@ + 'AdCreativeLinkDataCallToAction', + 'caption' => 'string', + 'description' => 'string', + 'image_crops' => 'AdsImageCrops', + 'image_hash' => 'string', + 'link' => 'string', + 'name' => 'string', + 'picture' => 'string', + 'place_data' => 'AdCreativePlaceData', + 'static_card' => 'bool', + 'video_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataFields.php new file mode 100644 index 00000000..35edc36a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataFields.php @@ -0,0 +1,109 @@ + 'int', + 'app_link_spec' => 'AdCreativeLinkDataAppLinkSpec', + 'attachment_style' => 'AttachmentStyle', + 'branded_content_shared_to_sponsor_status' => 'string', + 'branded_content_sponsor_page_id' => 'string', + 'call_to_action' => 'AdCreativeLinkDataCallToAction', + 'caption' => 'string', + 'child_attachments' => 'list', + 'collection_thumbnails' => 'list', + 'customization_rules_spec' => 'list', + 'description' => 'string', + 'event_id' => 'string', + 'force_single_link' => 'bool', + 'format_option' => 'FormatOption', + 'image_crops' => 'AdsImageCrops', + 'image_hash' => 'string', + 'image_layer_specs' => 'list', + 'image_overlay_spec' => 'AdCreativeLinkDataImageOverlaySpec', + 'link' => 'string', + 'message' => 'string', + 'multi_share_end_card' => 'bool', + 'multi_share_optimized' => 'bool', + 'name' => 'string', + 'offer_id' => 'string', + 'page_welcome_message' => 'string', + 'picture' => 'string', + 'post_click_configuration' => 'AdCreativePostClickConfiguration', + 'preferred_image_tags' => 'list', + 'retailer_item_ids' => 'list', + 'show_multiple_images' => 'bool', + 'static_fallback_spec' => 'AdCreativeStaticFallbackSpec', + 'use_flexible_image_aspect_ratio' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageLayerSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageLayerSpecFields.php new file mode 100644 index 00000000..1d6ef51c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageLayerSpecFields.php @@ -0,0 +1,71 @@ + 'BlendingMode', + 'content' => 'Object', + 'frame_image_hash' => 'string', + 'frame_source' => 'FrameSource', + 'image_source' => 'ImageSource', + 'layer_type' => 'LayerType', + 'opacity' => 'int', + 'overlay_position' => 'OverlayPosition', + 'overlay_shape' => 'OverlayShape', + 'scale' => 'int', + 'shape_color' => 'string', + 'text_color' => 'string', + 'text_font' => 'TextFont', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageOverlaySpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageOverlaySpecFields.php new file mode 100644 index 00000000..59bca2bf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataImageOverlaySpecFields.php @@ -0,0 +1,61 @@ + 'CustomTextType', + 'float_with_margin' => 'bool', + 'overlay_template' => 'OverlayTemplate', + 'position' => 'Position', + 'text_font' => 'TextFont', + 'text_template_tags' => 'list', + 'text_type' => 'TextType', + 'theme_color' => 'ThemeColor', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataSponsorshipInfoSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataSponsorshipInfoSpecFields.php new file mode 100644 index 00000000..f9ea864d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataSponsorshipInfoSpecFields.php @@ -0,0 +1,49 @@ + 'string', + 'sponsor_name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataTemplateVideoSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataTemplateVideoSpecFields.php new file mode 100644 index 00000000..f5a5f0ac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeLinkDataTemplateVideoSpecFields.php @@ -0,0 +1,51 @@ + 'string', + 'customization' => 'map', + 'template_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeObjectStorySpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeObjectStorySpecFields.php new file mode 100644 index 00000000..4d72a89b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeObjectStorySpecFields.php @@ -0,0 +1,59 @@ + 'string', + 'link_data' => 'AdCreativeLinkData', + 'page_id' => 'string', + 'photo_data' => 'AdCreativePhotoData', + 'template_data' => 'AdCreativeLinkData', + 'text_data' => 'AdCreativeTextData', + 'video_data' => 'AdCreativeVideoData', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataFields.php new file mode 100644 index 00000000..d128e6fb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataFields.php @@ -0,0 +1,57 @@ + 'string', + 'branded_content_sponsor_page_id' => 'string', + 'caption' => 'string', + 'image_hash' => 'string', + 'page_welcome_message' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataMediaElementsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataMediaElementsFields.php new file mode 100644 index 00000000..08b478b3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePhotoDataMediaElementsFields.php @@ -0,0 +1,53 @@ + 'string', + 'element_type' => 'string', + 'x' => 'float', + 'y' => 'float', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlaceDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlaceDataFields.php new file mode 100644 index 00000000..212d47d7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlaceDataFields.php @@ -0,0 +1,57 @@ + 'string', + 'label' => 'string', + 'latitude' => 'float', + 'location_source_id' => 'string', + 'longitude' => 'float', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlatformCustomizationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlatformCustomizationFields.php new file mode 100644 index 00000000..60b6b25e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePlatformCustomizationFields.php @@ -0,0 +1,47 @@ + 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePortraitCustomizationsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePortraitCustomizationsFields.php new file mode 100644 index 00000000..881f0a2e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePortraitCustomizationsFields.php @@ -0,0 +1,47 @@ + 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePostClickConfigurationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePostClickConfigurationFields.php new file mode 100644 index 00000000..3a057b93 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativePostClickConfigurationFields.php @@ -0,0 +1,49 @@ + 'string', + 'post_click_item_headline' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeRecommenderSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeRecommenderSettingsFields.php new file mode 100644 index 00000000..2e108087 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeRecommenderSettingsFields.php @@ -0,0 +1,49 @@ + 'list', + 'product_sales_channel' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeStaticFallbackSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeStaticFallbackSpecFields.php new file mode 100644 index 00000000..454a44e7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeStaticFallbackSpecFields.php @@ -0,0 +1,57 @@ + 'AdCreativeLinkDataCallToAction', + 'description' => 'string', + 'image_hash' => 'string', + 'link' => 'string', + 'message' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTemplateURLSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTemplateURLSpecFields.php new file mode 100644 index 00000000..ecbc7d8e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTemplateURLSpecFields.php @@ -0,0 +1,59 @@ + 'Object', + 'config' => 'Object', + 'ios' => 'Object', + 'ipad' => 'Object', + 'iphone' => 'Object', + 'web' => 'Object', + 'windows_phone' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTextDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTextDataFields.php new file mode 100644 index 00000000..ca4af01e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeTextDataFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeVideoDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeVideoDataFields.php new file mode 100644 index 00000000..17019e0f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCreativeVideoDataFields.php @@ -0,0 +1,79 @@ + 'int', + 'branded_content_shared_to_sponsor_status' => 'string', + 'branded_content_sponsor_page_id' => 'string', + 'call_to_action' => 'AdCreativeLinkDataCallToAction', + 'collection_thumbnails' => 'list', + 'customization_rules_spec' => 'list', + 'image_hash' => 'string', + 'image_url' => 'string', + 'link_description' => 'string', + 'message' => 'string', + 'offer_id' => 'string', + 'page_welcome_message' => 'string', + 'post_click_configuration' => 'AdCreativePostClickConfiguration', + 'retailer_item_ids' => 'list', + 'targeting' => 'Targeting', + 'title' => 'string', + 'video_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCustomizationRuleSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCustomizationRuleSpecFields.php new file mode 100644 index 00000000..bbbcbb46 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdCustomizationRuleSpecFields.php @@ -0,0 +1,65 @@ + 'string', + 'customization_spec' => 'Object', + 'description' => 'string', + 'image_hash' => 'string', + 'link' => 'string', + 'message' => 'string', + 'name' => 'string', + 'priority' => 'int', + 'template_url_spec' => 'AdCreativeTemplateURLSpec', + 'video_id' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdDynamicCreativeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdDynamicCreativeFields.php new file mode 100644 index 00000000..2eb738f1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdDynamicCreativeFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdEntityTargetSpendFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdEntityTargetSpendFields.php new file mode 100644 index 00000000..a72633fd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdEntityTargetSpendFields.php @@ -0,0 +1,55 @@ + 'string', + 'has_error' => 'bool', + 'is_accurate' => 'bool', + 'is_prorated' => 'bool', + 'is_updating' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdFields.php new file mode 100644 index 00000000..8c123e0e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdFields.php @@ -0,0 +1,125 @@ + 'string', + 'ad_review_feedback' => 'AdgroupReviewFeedback', + 'adlabels' => 'list', + 'adset' => 'AdSet', + 'adset_id' => 'string', + 'bid_amount' => 'int', + 'bid_info' => 'map', + 'bid_type' => 'BidType', + 'campaign' => 'Campaign', + 'campaign_id' => 'string', + 'configured_status' => 'ConfiguredStatus', + 'conversion_specs' => 'list', + 'created_time' => 'datetime', + 'creative' => 'AdCreative', + 'demolink_hash' => 'string', + 'display_sequence' => 'int', + 'effective_status' => 'EffectiveStatus', + 'engagement_audience' => 'bool', + 'failed_delivery_checks' => 'list', + 'id' => 'string', + 'issues_info' => 'list', + 'last_updated_by_app_id' => 'string', + 'name' => 'string', + 'preview_shareable_link' => 'string', + 'priority' => 'unsigned int', + 'recommendations' => 'list', + 'source_ad' => 'Ad', + 'source_ad_id' => 'string', + 'status' => 'Status', + 'targeting' => 'Targeting', + 'tracking_and_conversion_with_defaults' => 'TrackingAndConversionWithDefaults', + 'tracking_specs' => 'list', + 'updated_time' => 'datetime', + 'adset_spec' => 'AdSet', + 'audience_id' => 'string', + 'date_format' => 'string', + 'draft_adgroup_id' => 'string', + 'execution_options' => 'list', + 'include_demolink_hashes' => 'bool', + 'filename' => 'file', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdImageFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdImageFields.php new file mode 100644 index 00000000..7d0248c5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdImageFields.php @@ -0,0 +1,83 @@ + 'string', + 'created_time' => 'datetime', + 'creatives' => 'list', + 'hash' => 'string', + 'height' => 'unsigned int', + 'id' => 'string', + 'is_associated_creatives_in_adgroups' => 'bool', + 'name' => 'string', + 'original_height' => 'unsigned int', + 'original_width' => 'unsigned int', + 'permalink_url' => 'string', + 'status' => 'Status', + 'updated_time' => 'datetime', + 'url' => 'string', + 'url_128' => 'string', + 'width' => 'unsigned int', + 'bytes' => 'Object', + 'copy_from' => 'Object', + 'filename' => 'file', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdKeywordsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdKeywordsFields.php new file mode 100644 index 00000000..b6c26d97 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdKeywordsFields.php @@ -0,0 +1,53 @@ + 'list', + 'product_categories' => 'list', + 'product_names' => 'list', + 'search_terms' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdLabelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdLabelFields.php new file mode 100644 index 00000000..6a09a1f4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdLabelFields.php @@ -0,0 +1,55 @@ + 'AdAccount', + 'created_time' => 'datetime', + 'id' => 'string', + 'name' => 'string', + 'updated_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdMonetizationPropertyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdMonetizationPropertyFields.php new file mode 100644 index 00000000..d6571329 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdMonetizationPropertyFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsAsyncQueryResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsAsyncQueryResultFields.php new file mode 100644 index 00000000..6e71d19d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsAsyncQueryResultFields.php @@ -0,0 +1,55 @@ + 'Object', + 'error' => 'Object', + 'query_id' => 'string', + 'results' => 'list', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsSyncQueryResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsSyncQueryResultFields.php new file mode 100644 index 00000000..01a886f4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdNetworkAnalyticsSyncQueryResultFields.php @@ -0,0 +1,49 @@ + 'string', + 'results' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetFields.php new file mode 100644 index 00000000..b0b9a639 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetFields.php @@ -0,0 +1,61 @@ + 'string', + 'id' => 'string', + 'location_types' => 'list', + 'name' => 'string', + 'pages_count' => 'int', + 'parent_page' => 'Page', + 'category' => 'Category', + 'targeted_area_type' => 'TargetedAreaType', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetMetadataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetMetadataFields.php new file mode 100644 index 00000000..b8e3684f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacePageSetMetadataFields.php @@ -0,0 +1,53 @@ + 'Object', + 'custom' => 'Object', + 'extra_data' => 'string', + 'fixed_radius' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacementFields.php new file mode 100644 index 00000000..ee1a2cb0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPlacementFields.php @@ -0,0 +1,61 @@ + 'string', + 'display_format' => 'string', + 'external_placement_id' => 'string', + 'google_display_format' => 'string', + 'id' => 'string', + 'name' => 'string', + 'platform' => 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPreviewFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPreviewFields.php new file mode 100644 index 00000000..cd4c62c5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPreviewFields.php @@ -0,0 +1,51 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPromotedObjectFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPromotedObjectFields.php new file mode 100644 index 00000000..e8566a17 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdPromotedObjectFields.php @@ -0,0 +1,81 @@ + 'string', + 'custom_conversion_id' => 'string', + 'custom_event_str' => 'string', + 'custom_event_type' => 'CustomEventType', + 'event_id' => 'string', + 'fundraiser_campaign_id' => 'string', + 'object_store_url' => 'string', + 'offer_id' => 'string', + 'offline_conversion_data_set_id' => 'string', + 'page_id' => 'string', + 'pixel_aggregation_rule' => 'string', + 'pixel_id' => 'string', + 'pixel_rule' => 'string', + 'place_page_set_id' => 'string', + 'product_catalog_id' => 'string', + 'product_item_id' => 'string', + 'product_set_id' => 'string', + 'retention_days' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationDataFields.php new file mode 100644 index 00000000..7331e567 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationDataFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationFields.php new file mode 100644 index 00000000..0052cbdf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRecommendationFields.php @@ -0,0 +1,59 @@ + 'string', + 'code' => 'int', + 'confidence' => 'Confidence', + 'importance' => 'Importance', + 'message' => 'string', + 'recommendation_data' => 'AdRecommendationData', + 'title' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportRunFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportRunFields.php new file mode 100644 index 00000000..88d00e12 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportRunFields.php @@ -0,0 +1,111 @@ + 'string', + 'async_percent_completion' => 'unsigned int', + 'async_status' => 'string', + 'date_start' => 'string', + 'date_stop' => 'string', + 'emails' => 'list', + 'friendly_name' => 'string', + 'id' => 'string', + 'is_bookmarked' => 'bool', + 'is_running' => 'bool', + 'schedule_id' => 'string', + 'time_completed' => 'unsigned int', + 'time_ref' => 'unsigned int', + 'action_attribution_windows' => 'list', + 'action_breakdowns' => 'list', + 'action_report_time' => 'ActionReportTime', + 'breakdowns' => 'list', + 'date_preset' => 'DatePreset', + 'default_summary' => 'bool', + 'export_columns' => 'list', + 'export_format' => 'string', + 'export_name' => 'string', + 'fields' => 'list', + 'filtering' => 'list', + 'level' => 'Level', + 'product_id_limit' => 'int', + 'sort' => 'list', + 'summary' => 'list', + 'summary_action_breakdowns' => 'list', + 'time_increment' => 'string', + 'time_range' => 'Object', + 'time_ranges' => 'list', + 'use_account_attribution_setting' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportSpecFields.php new file mode 100644 index 00000000..e4f29059 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdReportSpecFields.php @@ -0,0 +1,79 @@ + 'string', + 'actions_group_by' => 'list', + 'creation_source' => 'string', + 'data_columns' => 'list', + 'date_preset' => 'string', + 'export_columns' => 'list', + 'filters' => 'list', + 'format_version' => 'int', + 'id' => 'string', + 'insights_section' => 'Object', + 'name' => 'string', + 'report_schedule_id' => 'string', + 'sort_by' => 'string', + 'sort_dir' => 'string', + 'time_increment' => 'string', + 'time_interval' => 'Object', + 'time_ranges' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleEvaluationSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleEvaluationSpecFields.php new file mode 100644 index 00000000..7446ee17 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleEvaluationSpecFields.php @@ -0,0 +1,51 @@ + 'EvaluationType', + 'filters' => 'list', + 'trigger' => 'AdRuleTrigger', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionOptionsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionOptionsFields.php new file mode 100644 index 00000000..33493940 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionOptionsFields.php @@ -0,0 +1,51 @@ + 'string', + 'operator' => 'Operator', + 'value' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionSpecFields.php new file mode 100644 index 00000000..a61a0889 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleExecutionSpecFields.php @@ -0,0 +1,49 @@ + 'list', + 'execution_type' => 'ExecutionType', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFields.php new file mode 100644 index 00000000..30927da3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFields.php @@ -0,0 +1,65 @@ + 'string', + 'created_by' => 'User', + 'created_time' => 'datetime', + 'evaluation_spec' => 'AdRuleEvaluationSpec', + 'execution_spec' => 'AdRuleExecutionSpec', + 'id' => 'string', + 'name' => 'string', + 'schedule_spec' => 'AdRuleScheduleSpec', + 'status' => 'string', + 'updated_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFiltersFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFiltersFields.php new file mode 100644 index 00000000..27bc0ecf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleFiltersFields.php @@ -0,0 +1,51 @@ + 'string', + 'operator' => 'Operator', + 'value' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryFields.php new file mode 100644 index 00000000..06bfe958 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryFields.php @@ -0,0 +1,61 @@ + 'AdRuleEvaluationSpec', + 'exception_code' => 'int', + 'exception_message' => 'string', + 'execution_spec' => 'AdRuleExecutionSpec', + 'is_manual' => 'bool', + 'results' => 'list', + 'schedule_spec' => 'AdRuleScheduleSpec', + 'timestamp' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultActionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultActionFields.php new file mode 100644 index 00000000..b7624ad8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultActionFields.php @@ -0,0 +1,53 @@ + 'string', + 'field' => 'string', + 'new_value' => 'string', + 'old_value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultFields.php new file mode 100644 index 00000000..a4a2ead9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleHistoryResultFields.php @@ -0,0 +1,51 @@ + 'list', + 'object_id' => 'string', + 'object_type' => 'ObjectType', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleFields.php new file mode 100644 index 00000000..f679e342 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleFields.php @@ -0,0 +1,51 @@ + 'list', + 'end_minute' => 'int', + 'start_minute' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleSpecFields.php new file mode 100644 index 00000000..728cfd28 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleScheduleSpecFields.php @@ -0,0 +1,49 @@ + 'list', + 'schedule_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleTriggerFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleTriggerFields.php new file mode 100644 index 00000000..482d6868 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdRuleTriggerFields.php @@ -0,0 +1,53 @@ + 'string', + 'operator' => 'Operator', + 'type' => 'Type', + 'value' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdSetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdSetFields.php new file mode 100644 index 00000000..39a0709f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdSetFields.php @@ -0,0 +1,173 @@ + 'string', + 'adlabels' => 'list', + 'adset_schedule' => 'list', + 'asset_feed_id' => 'string', + 'attribution_spec' => 'list', + 'bid_adjustments' => 'AdBidAdjustments', + 'bid_amount' => 'unsigned int', + 'bid_constraints' => 'AdCampaignBidConstraint', + 'bid_info' => 'map', + 'bid_strategy' => 'BidStrategy', + 'billing_event' => 'BillingEvent', + 'budget_remaining' => 'string', + 'campaign' => 'Campaign', + 'campaign_id' => 'string', + 'configured_status' => 'ConfiguredStatus', + 'created_time' => 'datetime', + 'creative_sequence' => 'list', + 'daily_budget' => 'string', + 'daily_min_spend_target' => 'string', + 'daily_spend_cap' => 'string', + 'destination_type' => 'string', + 'effective_status' => 'EffectiveStatus', + 'end_time' => 'datetime', + 'frequency_control_specs' => 'list', + 'full_funnel_exploration_mode' => 'string', + 'id' => 'string', + 'instagram_actor_id' => 'string', + 'is_dynamic_creative' => 'bool', + 'issues_info' => 'list', + 'learning_stage_info' => 'AdCampaignLearningStageInfo', + 'lifetime_budget' => 'string', + 'lifetime_imps' => 'int', + 'lifetime_min_spend_target' => 'string', + 'lifetime_spend_cap' => 'string', + 'multi_optimization_goal_weight' => 'string', + 'name' => 'string', + 'optimization_goal' => 'OptimizationGoal', + 'optimization_sub_event' => 'string', + 'pacing_type' => 'list', + 'promoted_object' => 'AdPromotedObject', + 'recommendations' => 'list', + 'recurring_budget_semantics' => 'bool', + 'review_feedback' => 'string', + 'rf_prediction_id' => 'string', + 'source_adset' => 'AdSet', + 'source_adset_id' => 'string', + 'start_time' => 'datetime', + 'status' => 'Status', + 'targeting' => 'Targeting', + 'time_based_ad_rotation_id_blocks' => 'list>', + 'time_based_ad_rotation_intervals' => 'list', + 'updated_time' => 'datetime', + 'use_new_app_click' => 'bool', + 'campaign_spec' => 'Object', + 'daily_imps' => 'unsigned int', + 'date_format' => 'string', + 'execution_options' => 'list', + 'line_number' => 'unsigned int', + 'rb_prediction_id' => 'string', + 'time_start' => 'datetime', + 'time_stop' => 'datetime', + 'topline_id' => 'string', + 'tune_for_category' => 'TuneForCategory', + 'upstream_events' => 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyCellFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyCellFields.php new file mode 100644 index 00000000..656caa9b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyCellFields.php @@ -0,0 +1,55 @@ + 'unsigned int', + 'control_percentage' => 'float', + 'id' => 'string', + 'name' => 'string', + 'treatment_percentage' => 'float', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyFields.php new file mode 100644 index 00000000..a17b3781 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyFields.php @@ -0,0 +1,85 @@ + 'Business', + 'canceled_time' => 'datetime', + 'cooldown_start_time' => 'datetime', + 'created_by' => 'User', + 'created_time' => 'datetime', + 'description' => 'string', + 'end_time' => 'datetime', + 'id' => 'string', + 'name' => 'string', + 'observation_end_time' => 'datetime', + 'results_first_available_date' => 'string', + 'start_time' => 'datetime', + 'type' => 'string', + 'updated_by' => 'User', + 'updated_time' => 'datetime', + 'cells' => 'list', + 'client_business' => 'string', + 'confidence_level' => 'float', + 'objectives' => 'list', + 'viewers' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveFields.php new file mode 100644 index 00000000..c5008ee2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveFields.php @@ -0,0 +1,57 @@ + 'string', + 'is_primary' => 'bool', + 'last_updated_results' => 'string', + 'name' => 'string', + 'results' => 'list', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveIDFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveIDFields.php new file mode 100644 index 00000000..231f8659 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdStudyObjectiveIDFields.php @@ -0,0 +1,51 @@ + 'list', + 'id' => 'string', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdVideoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdVideoFields.php new file mode 100644 index 00000000..3f38eff4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdVideoFields.php @@ -0,0 +1,51 @@ + 'AdCreative', + 'ad_creative_id_old' => 'AdCreative', + 'asset_feed_id_new' => 'string', + 'asset_feed_id_old' => 'string', + 'bid_amount_new' => 'int', + 'bid_amount_old' => 'int', + 'bid_info_new' => 'map', + 'bid_info_old' => 'map', + 'bid_type_new' => 'string', + 'bid_type_old' => 'string', + 'conversion_specs_new' => 'list', + 'conversion_specs_old' => 'list', + 'created_time' => 'datetime', + 'display_sequence_new' => 'int', + 'display_sequence_old' => 'int', + 'engagement_audience_new' => 'bool', + 'engagement_audience_old' => 'bool', + 'event_time' => 'datetime', + 'event_type' => 'string', + 'force_run_status_new' => 'bool', + 'force_run_status_old' => 'bool', + 'friendly_name_new' => 'string', + 'friendly_name_old' => 'string', + 'id' => 'string', + 'is_reviewer_admin_new' => 'bool', + 'is_reviewer_admin_old' => 'bool', + 'objective_new' => 'ObjectiveNew', + 'objective_old' => 'ObjectiveOld', + 'objective_source_new' => 'string', + 'objective_source_old' => 'string', + 'priority_new' => 'int', + 'priority_old' => 'int', + 'reason_new' => 'string', + 'reason_old' => 'string', + 'run_status_new' => 'string', + 'run_status_old' => 'string', + 'source_adgroup_id_new' => 'Ad', + 'source_adgroup_id_old' => 'Ad', + 'start_time_new' => 'datetime', + 'start_time_old' => 'datetime', + 'stop_time_new' => 'datetime', + 'stop_time_old' => 'datetime', + 'target_spec_id_new' => 'string', + 'target_spec_id_old' => 'string', + 'targets_spec_new' => 'Object', + 'targets_spec_old' => 'Object', + 'tracking_pixel_ids_new' => 'list', + 'tracking_pixel_ids_old' => 'list', + 'tracking_specs_new' => 'list', + 'tracking_specs_old' => 'list', + 'update_time_new' => 'datetime', + 'update_time_old' => 'datetime', + 'view_tags_new' => 'list', + 'view_tags_old' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupIssuesInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupIssuesInfoFields.php new file mode 100644 index 00000000..c882050f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupIssuesInfoFields.php @@ -0,0 +1,55 @@ + 'int', + 'error_message' => 'string', + 'error_summary' => 'string', + 'error_type' => 'string', + 'level' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupPlacementSpecificReviewFeedbackFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupPlacementSpecificReviewFeedbackFields.php new file mode 100644 index 00000000..23235ca3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupPlacementSpecificReviewFeedbackFields.php @@ -0,0 +1,109 @@ + 'map', + 'ad' => 'map', + 'ads_conversion_experiences' => 'map', + 'b2c' => 'map', + 'b2c_commerce_unified' => 'map', + 'bsg' => 'map', + 'city_community' => 'map', + 'commerce' => 'map', + 'daily_deals' => 'map', + 'daily_deals_legacy' => 'map', + 'dpa' => 'map', + 'dri_copyright' => 'map', + 'dri_counterfeit' => 'map', + 'facebook' => 'map', + 'facebook_pages_live_shopping' => 'map', + 'instagram' => 'map', + 'instagram_shop' => 'map', + 'lead_gen_honeypot' => 'map', + 'marketplace' => 'map', + 'marketplace_home_rentals' => 'map', + 'marketplace_home_sales' => 'map', + 'marketplace_motors' => 'map', + 'marketplace_shops' => 'map', + 'max_review_placements' => 'map', + 'page_admin' => 'map', + 'product' => 'map', + 'product_service' => 'map', + 'profile' => 'map', + 'seller' => 'map', + 'shops' => 'map', + 'traffic_quality' => 'map', + 'whatsapp' => 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupRelevanceScoreFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupRelevanceScoreFields.php new file mode 100644 index 00000000..1dddfd01 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupRelevanceScoreFields.php @@ -0,0 +1,53 @@ + 'string', + 'positive_feedback' => 'string', + 'score' => 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupReviewFeedbackFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupReviewFeedbackFields.php new file mode 100644 index 00000000..14fefeb4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdgroupReviewFeedbackFields.php @@ -0,0 +1,49 @@ + 'map', + 'placement_specific' => 'AdgroupPlacementSpecificReviewFeedback', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdoptablePetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdoptablePetFields.php new file mode 100644 index 00000000..d4ff5bb5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdoptablePetFields.php @@ -0,0 +1,101 @@ + 'Object', + 'adoptable_pet_id' => 'string', + 'adoption_application_form_url' => 'string', + 'age_bucket' => 'string', + 'animal_type' => 'string', + 'applinks' => 'CatalogItemAppLinks', + 'availability' => 'string', + 'breed' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'coat_length' => 'string', + 'color' => 'string', + 'currency' => 'string', + 'description' => 'string', + 'features' => 'list', + 'gender' => 'string', + 'id' => 'string', + 'images' => 'list', + 'name' => 'string', + 'price' => 'string', + 'sanitized_images' => 'list', + 'secondary_color' => 'string', + 'shelter_email' => 'string', + 'shelter_name' => 'string', + 'shelter_page_id' => 'Page', + 'shelter_phone' => 'string', + 'size' => 'string', + 'tertiary_color' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsActionStatsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsActionStatsFields.php new file mode 100644 index 00000000..d34474fb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsActionStatsFields.php @@ -0,0 +1,99 @@ + 'string', + '1d_view' => 'string', + '28d_click' => 'string', + '28d_view' => 'string', + '7d_click' => 'string', + '7d_view' => 'string', + 'action_canvas_component_id' => 'string', + 'action_canvas_component_name' => 'string', + 'action_carousel_card_id' => 'string', + 'action_carousel_card_name' => 'string', + 'action_converted_product_id' => 'string', + 'action_destination' => 'string', + 'action_device' => 'string', + 'action_event_channel' => 'string', + 'action_link_click_destination' => 'string', + 'action_location_code' => 'string', + 'action_reaction' => 'string', + 'action_target_id' => 'string', + 'action_type' => 'string', + 'action_video_asset_id' => 'string', + 'action_video_sound' => 'string', + 'action_video_type' => 'string', + 'dda' => 'string', + 'inline' => 'string', + 'interactive_component_sticker_id' => 'string', + 'interactive_component_sticker_response' => 'string', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsImageCropsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsImageCropsFields.php new file mode 100644 index 00000000..4177c21b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsImageCropsFields.php @@ -0,0 +1,59 @@ + 'list', + '100x72' => 'list', + '191x100' => 'list', + '400x150' => 'list', + '400x500' => 'list', + '600x360' => 'list', + '90x160' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsInsightsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsInsightsFields.php new file mode 100644 index 00000000..396fb25b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsInsightsFields.php @@ -0,0 +1,313 @@ + 'string', + 'account_id' => 'string', + 'account_name' => 'string', + 'action_values' => 'list', + 'actions' => 'list', + 'ad_bid_type' => 'string', + 'ad_bid_value' => 'string', + 'ad_click_actions' => 'list', + 'ad_delivery' => 'string', + 'ad_id' => 'string', + 'ad_impression_actions' => 'list', + 'ad_name' => 'string', + 'adset_bid_type' => 'string', + 'adset_bid_value' => 'string', + 'adset_budget_type' => 'string', + 'adset_budget_value' => 'string', + 'adset_delivery' => 'string', + 'adset_end' => 'string', + 'adset_id' => 'string', + 'adset_name' => 'string', + 'adset_start' => 'string', + 'age_targeting' => 'string', + 'auction_bid' => 'string', + 'auction_competitiveness' => 'string', + 'auction_max_competitor_bid' => 'string', + 'buying_type' => 'string', + 'campaign_id' => 'string', + 'campaign_name' => 'string', + 'canvas_avg_view_percent' => 'string', + 'canvas_avg_view_time' => 'string', + 'catalog_segment_actions' => 'list', + 'catalog_segment_value' => 'list', + 'catalog_segment_value_mobile_purchase_roas' => 'list', + 'catalog_segment_value_omni_purchase_roas' => 'list', + 'catalog_segment_value_website_purchase_roas' => 'list', + 'clicks' => 'string', + 'conversion_rate_ranking' => 'string', + 'conversion_values' => 'list', + 'conversions' => 'list', + 'converted_product_quantity' => 'list', + 'converted_product_value' => 'list', + 'cost_per_15_sec_video_view' => 'list', + 'cost_per_2_sec_continuous_video_view' => 'list', + 'cost_per_action_type' => 'list', + 'cost_per_ad_click' => 'list', + 'cost_per_conversion' => 'list', + 'cost_per_dda_countby_convs' => 'string', + 'cost_per_estimated_ad_recallers' => 'string', + 'cost_per_inline_link_click' => 'string', + 'cost_per_inline_post_engagement' => 'string', + 'cost_per_one_thousand_ad_impression' => 'list', + 'cost_per_outbound_click' => 'list', + 'cost_per_store_visit_action' => 'list', + 'cost_per_thruplay' => 'list', + 'cost_per_unique_action_type' => 'list', + 'cost_per_unique_click' => 'string', + 'cost_per_unique_conversion' => 'list', + 'cost_per_unique_inline_link_click' => 'string', + 'cost_per_unique_outbound_click' => 'list', + 'cpc' => 'string', + 'cpm' => 'string', + 'cpp' => 'string', + 'created_time' => 'string', + 'ctr' => 'string', + 'date_start' => 'string', + 'date_stop' => 'string', + 'dda_countby_convs' => 'string', + 'engagement_rate_ranking' => 'string', + 'estimated_ad_recall_rate' => 'string', + 'estimated_ad_recall_rate_lower_bound' => 'string', + 'estimated_ad_recall_rate_upper_bound' => 'string', + 'estimated_ad_recallers' => 'string', + 'estimated_ad_recallers_lower_bound' => 'string', + 'estimated_ad_recallers_upper_bound' => 'string', + 'frequency' => 'string', + 'full_view_impressions' => 'string', + 'full_view_reach' => 'string', + 'gender_targeting' => 'string', + 'impressions' => 'string', + 'inline_link_click_ctr' => 'string', + 'inline_link_clicks' => 'string', + 'inline_post_engagement' => 'string', + 'instant_experience_clicks_to_open' => 'string', + 'instant_experience_clicks_to_start' => 'string', + 'instant_experience_outbound_clicks' => 'string', + 'interactive_component_tap' => 'list', + 'labels' => 'string', + 'location' => 'string', + 'mobile_app_purchase_roas' => 'list', + 'objective' => 'string', + 'outbound_clicks' => 'list', + 'outbound_clicks_ctr' => 'list', + 'place_page_name' => 'string', + 'purchase_roas' => 'list', + 'qualifying_question_qualify_answer_rate' => 'string', + 'quality_ranking' => 'string', + 'quality_score_ectr' => 'string', + 'quality_score_ecvr' => 'string', + 'quality_score_organic' => 'string', + 'reach' => 'string', + 'social_spend' => 'string', + 'spend' => 'string', + 'store_visit_actions' => 'list', + 'unique_actions' => 'list', + 'unique_clicks' => 'string', + 'unique_conversions' => 'list', + 'unique_ctr' => 'string', + 'unique_inline_link_click_ctr' => 'string', + 'unique_inline_link_clicks' => 'string', + 'unique_link_clicks_ctr' => 'string', + 'unique_outbound_clicks' => 'list', + 'unique_outbound_clicks_ctr' => 'list', + 'unique_video_continuous_2_sec_watched_actions' => 'list', + 'unique_video_view_15_sec' => 'list', + 'updated_time' => 'string', + 'video_15_sec_watched_actions' => 'list', + 'video_30_sec_watched_actions' => 'list', + 'video_avg_time_watched_actions' => 'list', + 'video_continuous_2_sec_watched_actions' => 'list', + 'video_p100_watched_actions' => 'list', + 'video_p25_watched_actions' => 'list', + 'video_p50_watched_actions' => 'list', + 'video_p75_watched_actions' => 'list', + 'video_p95_watched_actions' => 'list', + 'video_play_actions' => 'list', + 'video_play_curve_actions' => 'list', + 'video_play_retention_0_to_15s_actions' => 'list', + 'video_play_retention_20_to_60s_actions' => 'list', + 'video_play_retention_graph_actions' => 'list', + 'video_thruplay_watched_actions' => 'list', + 'video_time_watched_actions' => 'list', + 'website_ctr' => 'list', + 'website_purchase_roas' => 'list', + 'wish_bid' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsOptimalDeliveryGrowthOpportunityFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsOptimalDeliveryGrowthOpportunityFields.php new file mode 100644 index 00000000..bd639ea9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsOptimalDeliveryGrowthOpportunityFields.php @@ -0,0 +1,51 @@ + 'map', + 'metadata' => 'Object', + 'optimization_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelFields.php new file mode 100644 index 00000000..89e28a2b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelFields.php @@ -0,0 +1,75 @@ + 'list', + 'can_proxy' => 'bool', + 'code' => 'string', + 'creation_time' => 'datetime', + 'creator' => 'User', + 'data_use_setting' => 'string', + 'enable_automatic_matching' => 'bool', + 'first_party_cookie_status' => 'string', + 'id' => 'string', + 'is_created_by_business' => 'bool', + 'is_unavailable' => 'bool', + 'last_fired_time' => 'datetime', + 'name' => 'string', + 'owner_ad_account' => 'AdAccount', + 'owner_business' => 'Business', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsFields.php new file mode 100644 index 00000000..b6fe52ec --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsFields.php @@ -0,0 +1,53 @@ + 'int', + 'diagnostics_hourly_last_timestamp' => 'datetime', + 'event' => 'string', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsResultFields.php new file mode 100644 index 00000000..1ec46bd7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AdsPixelStatsResultFields.php @@ -0,0 +1,51 @@ + 'string', + 'data' => 'list', + 'start_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AgeRangeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AgeRangeFields.php new file mode 100644 index 00000000..1526e4b5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AgeRangeFields.php @@ -0,0 +1,49 @@ + 'unsigned int', + 'min' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/Agency.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/Agency.php new file mode 100644 index 00000000..fe1f56a8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/Agency.php @@ -0,0 +1,29 @@ + 'unsigned int', + 'client_based_in_france' => 'unsigned int', + 'client_city' => 'string', + 'client_country_code' => 'string', + 'client_email_address' => 'string', + 'client_name' => 'string', + 'client_postal_code' => 'string', + 'client_province' => 'string', + 'client_street' => 'string', + 'client_street2' => 'string', + 'has_written_mandate_from_advertiser' => 'unsigned int', + 'is_client_paying_invoices' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AlbumFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AlbumFields.php new file mode 100644 index 00000000..d0fad30a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AlbumFields.php @@ -0,0 +1,91 @@ + 'datetime', + 'backdated_time_granularity' => 'string', + 'can_backdate' => 'bool', + 'can_upload' => 'bool', + 'count' => 'unsigned int', + 'cover_photo' => 'Photo', + 'created_time' => 'datetime', + 'description' => 'string', + 'edit_link' => 'Object', + 'event' => 'Event', + 'from' => 'Object', + 'id' => 'string', + 'is_user_facing' => 'bool', + 'link' => 'Object', + 'location' => 'string', + 'modified_major' => 'datetime', + 'name' => 'string', + 'photo_count' => 'unsigned int', + 'place' => 'Place', + 'privacy' => 'string', + 'type' => 'string', + 'updated_time' => 'datetime', + 'video_count' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AndroidAppLinkFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AndroidAppLinkFields.php new file mode 100644 index 00000000..c08e924e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AndroidAppLinkFields.php @@ -0,0 +1,53 @@ + 'string', + 'class' => 'string', + 'package' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFields.php new file mode 100644 index 00000000..9d79a071 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFields.php @@ -0,0 +1,63 @@ + 'string', + 'application' => 'Application', + 'created_time' => 'datetime', + 'data' => 'string', + 'from' => 'Object', + 'id' => 'string', + 'message' => 'string', + 'object' => 'Object', + 'to' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFormerRecipientFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFormerRecipientFields.php new file mode 100644 index 00000000..8ee37699 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AppRequestFormerRecipientFields.php @@ -0,0 +1,49 @@ + 'string', + 'recipient_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ApplicationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ApplicationFields.php new file mode 100644 index 00000000..a44d80be --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ApplicationFields.php @@ -0,0 +1,247 @@ + 'string', + 'an_ad_space_limit' => 'unsigned int', + 'an_platforms' => 'list', + 'android_key_hash' => 'list', + 'android_sdk_error_categories' => 'list', + 'app_domains' => 'list', + 'app_events_config' => 'Object', + 'app_events_feature_bitmask' => 'unsigned int', + 'app_events_session_timeout' => 'unsigned int', + 'app_install_tracked' => 'bool', + 'app_name' => 'string', + 'app_signals_binding_ios' => 'list', + 'app_type' => 'unsigned int', + 'auth_dialog_data_help_url' => 'string', + 'auth_dialog_headline' => 'string', + 'auth_dialog_perms_explanation' => 'string', + 'auth_referral_default_activity_privacy' => 'string', + 'auth_referral_enabled' => 'unsigned int', + 'auth_referral_extended_perms' => 'list', + 'auth_referral_friend_perms' => 'list', + 'auth_referral_response_type' => 'string', + 'auth_referral_user_perms' => 'list', + 'auto_event_mapping_android' => 'list', + 'auto_event_mapping_ios' => 'list', + 'auto_event_setup_enabled' => 'bool', + 'canvas_fluid_height' => 'bool', + 'canvas_fluid_width' => 'unsigned int', + 'canvas_url' => 'string', + 'category' => 'string', + 'client_config' => 'map', + 'company' => 'string', + 'configured_ios_sso' => 'bool', + 'contact_email' => 'string', + 'created_time' => 'datetime', + 'creator_uid' => 'string', + 'daily_active_users' => 'string', + 'daily_active_users_rank' => 'unsigned int', + 'deauth_callback_url' => 'string', + 'default_share_mode' => 'string', + 'description' => 'string', + 'financial_id' => 'string', + 'gdpv4_chrome_custom_tabs_enabled' => 'bool', + 'gdpv4_enabled' => 'bool', + 'gdpv4_nux_content' => 'string', + 'gdpv4_nux_enabled' => 'bool', + 'has_messenger_product' => 'bool', + 'hosting_url' => 'string', + 'icon_url' => 'string', + 'id' => 'string', + 'ios_bundle_id' => 'list', + 'ios_sdk_dialog_flows' => 'Object', + 'ios_sdk_error_categories' => 'list', + 'ios_sfvc_attr' => 'bool', + 'ios_supports_native_proxy_auth_flow' => 'bool', + 'ios_supports_system_auth' => 'bool', + 'ipad_app_store_id' => 'string', + 'iphone_app_store_id' => 'string', + 'latest_sdk_version' => 'Object', + 'link' => 'string', + 'logging_token' => 'string', + 'login_secret' => 'string', + 'logo_url' => 'string', + 'migrations' => 'map', + 'mobile_profile_section_url' => 'string', + 'mobile_web_url' => 'string', + 'monthly_active_users' => 'string', + 'monthly_active_users_rank' => 'unsigned int', + 'name' => 'string', + 'namespace' => 'string', + 'object_store_urls' => 'Object', + 'page_tab_default_name' => 'string', + 'page_tab_url' => 'string', + 'photo_url' => 'string', + 'privacy_policy_url' => 'string', + 'profile_section_url' => 'string', + 'property_id' => 'string', + 'real_time_mode_devices' => 'list', + 'restrictions' => 'Object', + 'restrictive_data_filter_params' => 'string', + 'restrictive_data_filter_rules' => 'string', + 'sdk_update_message' => 'string', + 'seamless_login' => 'int', + 'secure_canvas_url' => 'string', + 'secure_page_tab_url' => 'string', + 'server_ip_whitelist' => 'string', + 'smart_login_bookmark_icon_url' => 'string', + 'smart_login_menu_icon_url' => 'string', + 'social_discovery' => 'unsigned int', + 'subcategory' => 'string', + 'suggested_events_setting' => 'string', + 'supported_platforms' => 'list', + 'supports_apprequests_fast_app_switch' => 'Object', + 'supports_attribution' => 'bool', + 'supports_implicit_sdk_logging' => 'bool', + 'suppress_native_ios_gdp' => 'bool', + 'terms_of_service_url' => 'string', + 'url_scheme_suffix' => 'string', + 'user_support_email' => 'string', + 'user_support_url' => 'string', + 'website_url' => 'string', + 'weekly_active_users' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AssignedUserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AssignedUserFields.php new file mode 100644 index 00000000..ab6ee3d7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AssignedUserFields.php @@ -0,0 +1,53 @@ + 'Business', + 'id' => 'string', + 'name' => 'string', + 'user_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncRequestFields.php new file mode 100644 index 00000000..543e2034 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncRequestFields.php @@ -0,0 +1,53 @@ + 'int', + 'result' => 'string', + 'status' => 'int', + 'type' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncSessionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncSessionFields.php new file mode 100644 index 00000000..54e9a1f4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AsyncSessionFields.php @@ -0,0 +1,75 @@ + 'Application', + 'complete_time' => 'datetime', + 'error_code' => 'int', + 'exception' => 'string', + 'id' => 'string', + 'method' => 'string', + 'name' => 'string', + 'page' => 'Page', + 'percent_completed' => 'int', + 'platform_version' => 'string', + 'result' => 'string', + 'start_time' => 'datetime', + 'status' => 'string', + 'uri' => 'string', + 'user' => 'User', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AtlasCampaignFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AtlasCampaignFields.php new file mode 100644 index 00000000..71672a22 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AtlasCampaignFields.php @@ -0,0 +1,241 @@ + 'Object', + 'alias' => 'string', + 'cost_per_1k_impressions' => 'float', + 'cost_per_click' => 'float', + 'cost_per_visit' => 'float', + 'created_by' => 'Object', + 'created_date' => 'datetime', + 'data_driven_convs' => 'float', + 'data_driven_convs_per_1k_impress' => 'float', + 'data_driven_convs_per_click' => 'float', + 'data_driven_convs_per_visit' => 'float', + 'data_driven_cpa' => 'float', + 'data_driven_nullable_convs' => 'float', + 'data_driven_revenue' => 'float', + 'data_driven_roas' => 'float', + 'even_credit_convs' => 'float', + 'even_credit_convs_per_1k_impress' => 'float', + 'even_credit_convs_per_click' => 'float', + 'even_credit_convs_per_visit' => 'float', + 'even_credit_cpa' => 'float', + 'even_credit_revenue' => 'float', + 'even_credit_roas' => 'float', + 'first_click_convs' => 'float', + 'first_click_convs_per_1k_impress' => 'float', + 'first_click_convs_per_click' => 'float', + 'first_click_convs_per_visit' => 'float', + 'first_click_cpa' => 'float', + 'first_click_revenue' => 'float', + 'first_click_roas' => 'float', + 'first_touch_convs' => 'float', + 'first_touch_convs_per_1k_impress' => 'float', + 'first_touch_convs_per_click' => 'float', + 'first_touch_convs_per_visit' => 'float', + 'first_touch_cpa' => 'float', + 'first_touch_revenue' => 'float', + 'first_touch_roas' => 'float', + 'id' => 'string', + 'is_archived' => 'bool', + 'last_click_convs' => 'float', + 'last_click_convs_per_1k_impress' => 'float', + 'last_click_convs_per_click' => 'float', + 'last_click_convs_per_visit' => 'float', + 'last_click_cpa' => 'float', + 'last_click_revenue' => 'float', + 'last_click_roas' => 'float', + 'last_click_with_extrapolation_convs' => 'float', + 'last_click_with_extrapolation_convs_per_100_clicks' => 'float', + 'last_click_with_extrapolation_convs_per_1k_impress' => 'float', + 'last_click_with_extrapolation_convs_per_click' => 'float', + 'last_click_with_extrapolation_convs_per_visit' => 'float', + 'last_click_with_extrapolation_cpa' => 'float', + 'last_click_with_extrapolation_revenue' => 'float', + 'last_click_with_extrapolation_roas' => 'float', + 'last_click_with_extrapolation_unattributed' => 'float', + 'last_modified_by' => 'Object', + 'last_modified_date' => 'datetime', + 'last_touch_convs' => 'float', + 'last_touch_convs_per_1k_impress' => 'float', + 'last_touch_convs_per_click' => 'float', + 'last_touch_convs_per_visit' => 'float', + 'last_touch_cpa' => 'float', + 'last_touch_revenue' => 'float', + 'last_touch_roas' => 'float', + 'name' => 'string', + 'net_media_cost' => 'float', + 'positional_30fl_convs' => 'float', + 'positional_30fl_convs_per_1k_impress' => 'float', + 'positional_30fl_convs_per_click' => 'float', + 'positional_30fl_convs_per_visit' => 'float', + 'positional_30fl_cpa' => 'float', + 'positional_30fl_revenue' => 'float', + 'positional_30fl_roas' => 'float', + 'positional_40fl_convs' => 'float', + 'positional_40fl_convs_per_1k_impress' => 'float', + 'positional_40fl_convs_per_click' => 'float', + 'positional_40fl_convs_per_visit' => 'float', + 'positional_40fl_cpa' => 'float', + 'positional_40fl_revenue' => 'float', + 'positional_40fl_roas' => 'float', + 'report_click_through_rate' => 'float', + 'report_clicks' => 'int', + 'report_impressions' => 'int', + 'report_visits' => 'int', + 'time_decay_1day_convs' => 'float', + 'time_decay_1day_convs_per_1k_impress' => 'float', + 'time_decay_1day_convs_per_click' => 'float', + 'time_decay_1day_convs_per_visit' => 'float', + 'time_decay_1day_cpa' => 'float', + 'time_decay_1day_revenue' => 'float', + 'time_decay_1day_roas' => 'float', + 'time_decay_7day_convs' => 'float', + 'time_decay_7day_convs_per_1k_impress' => 'float', + 'time_decay_7day_convs_per_click' => 'float', + 'time_decay_7day_convs_per_visit' => 'float', + 'time_decay_7day_cpa' => 'float', + 'time_decay_7day_revenue' => 'float', + 'time_decay_7day_roas' => 'float', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AttributionSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AttributionSpecFields.php new file mode 100644 index 00000000..e1abec36 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AttributionSpecFields.php @@ -0,0 +1,49 @@ + 'string', + 'window_days' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudienceInsightsStudySpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudienceInsightsStudySpecFields.php new file mode 100644 index 00000000..9d41c6f4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudienceInsightsStudySpecFields.php @@ -0,0 +1,61 @@ + 'Object', + 'author_info' => 'Object', + 'creation_time' => 'int', + 'end_time' => 'int', + 'excluded_rules' => 'list', + 'included_rules' => 'list', + 'start_time' => 'int', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudiencePermissionForActionsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudiencePermissionForActionsFields.php new file mode 100644 index 00000000..d6a22606 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudiencePermissionForActionsFields.php @@ -0,0 +1,55 @@ + 'bool', + 'can_see_insight' => 'bool', + 'can_share' => 'bool', + 'subtype_supports_lookalike' => 'bool', + 'supports_recipient_lookalike' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudioCopyrightFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudioCopyrightFields.php new file mode 100644 index 00000000..0dc9e208 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AudioCopyrightFields.php @@ -0,0 +1,71 @@ + 'datetime', + 'displayed_matches_count' => 'int', + 'id' => 'string', + 'in_conflict' => 'bool', + 'isrc' => 'string', + 'match_rule' => 'VideoCopyrightRule', + 'ownership_countries' => 'list', + 'reference_file_status' => 'string', + 'ridge_monitoring_status' => 'string', + 'tags' => 'list', + 'update_time' => 'datetime', + 'whitelisted_fb_users' => 'list', + 'whitelisted_ig_users' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AutomotiveModelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AutomotiveModelFields.php new file mode 100644 index 00000000..3ce7fc49 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/AutomotiveModelFields.php @@ -0,0 +1,99 @@ + 'CatalogItemAppLinks', + 'automotive_model_id' => 'string', + 'availability' => 'string', + 'body_style' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'currency' => 'string', + 'custom_label_0' => 'string', + 'description' => 'string', + 'drivetrain' => 'string', + 'exterior_color' => 'string', + 'finance_description' => 'string', + 'finance_type' => 'string', + 'fuel_type' => 'string', + 'generation' => 'string', + 'id' => 'string', + 'images' => 'list', + 'interior_color' => 'string', + 'interior_upholstery' => 'string', + 'make' => 'string', + 'model' => 'string', + 'price' => 'string', + 'sanitized_images' => 'list', + 'title' => 'string', + 'transmission' => 'string', + 'trim' => 'string', + 'url' => 'string', + 'year' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BilledAmountDetailsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BilledAmountDetailsFields.php new file mode 100644 index 00000000..7e709ff9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BilledAmountDetailsFields.php @@ -0,0 +1,53 @@ + 'string', + 'net_amount' => 'string', + 'tax_amount' => 'string', + 'total_amount' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BrandSafetyBlockListUsageFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BrandSafetyBlockListUsageFields.php new file mode 100644 index 00000000..024c32d9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BrandSafetyBlockListUsageFields.php @@ -0,0 +1,55 @@ + 'int', + 'new_usage' => 'int', + 'platform' => 'string', + 'position' => 'string', + 'threshold' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BroadTargetingCategoriesFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BroadTargetingCategoriesFields.php new file mode 100644 index 00000000..c176564f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BroadTargetingCategoriesFields.php @@ -0,0 +1,67 @@ + 'string', + 'id' => 'string', + 'name' => 'string', + 'parent_category' => 'string', + 'path' => 'list', + 'size' => 'int', + 'source' => 'string', + 'type' => 'int', + 'type_name' => 'string', + 'untranslated_name' => 'string', + 'untranslated_parent_name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAdAccountRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAdAccountRequestFields.php new file mode 100644 index 00000000..354b5946 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAdAccountRequestFields.php @@ -0,0 +1,49 @@ + 'AdAccount', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAgreementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAgreementFields.php new file mode 100644 index 00000000..5f1c5057 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAgreementFields.php @@ -0,0 +1,49 @@ + 'string', + 'request_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessApplicationRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessApplicationRequestFields.php new file mode 100644 index 00000000..fcbc62d9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessApplicationRequestFields.php @@ -0,0 +1,49 @@ + 'Application', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetGroupFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetGroupFields.php new file mode 100644 index 00000000..d9f5f414 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetGroupFields.php @@ -0,0 +1,49 @@ + 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetSharingAgreementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetSharingAgreementFields.php new file mode 100644 index 00000000..d7fcc8c2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessAssetSharingAgreementFields.php @@ -0,0 +1,57 @@ + 'string', + 'initiator' => 'Business', + 'recipient' => 'Business', + 'relationship_type' => 'list', + 'request_status' => 'string', + 'request_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessFields.php new file mode 100644 index 00000000..dc447873 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessFields.php @@ -0,0 +1,81 @@ + 'bool', + 'created_by' => 'Object', + 'created_time' => 'datetime', + 'extended_updated_time' => 'datetime', + 'id' => 'string', + 'is_hidden' => 'bool', + 'is_instagram_enabled_in_fb_analytics' => 'bool', + 'link' => 'string', + 'name' => 'string', + 'primary_page' => 'Page', + 'profile_picture_uri' => 'string', + 'timezone_id' => 'unsigned int', + 'two_factor_type' => 'string', + 'updated_by' => 'Object', + 'updated_time' => 'datetime', + 'verification_status' => 'string', + 'vertical' => 'string', + 'vertical_id' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessOwnedObjectOnBehalfOfRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessOwnedObjectOnBehalfOfRequestFields.php new file mode 100644 index 00000000..917c07ee --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessOwnedObjectOnBehalfOfRequestFields.php @@ -0,0 +1,55 @@ + 'string', + 'id' => 'string', + 'receiving_business' => 'Business', + 'requesting_business' => 'Business', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessPageRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessPageRequestFields.php new file mode 100644 index 00000000..1e32246e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessPageRequestFields.php @@ -0,0 +1,49 @@ + 'string', + 'page' => 'Page', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessRoleRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessRoleRequestFields.php new file mode 100644 index 00000000..7074467a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessRoleRequestFields.php @@ -0,0 +1,73 @@ + 'Object', + 'created_time' => 'datetime', + 'email' => 'string', + 'expiration_time' => 'datetime', + 'expiry_time' => 'datetime', + 'finance_role' => 'string', + 'id' => 'string', + 'invite_link' => 'string', + 'ip_role' => 'string', + 'owner' => 'Business', + 'role' => 'string', + 'status' => 'string', + 'updated_by' => 'Object', + 'updated_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUnitFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUnitFields.php new file mode 100644 index 00000000..8477c064 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUnitFields.php @@ -0,0 +1,65 @@ + 'Business', + 'creation_time' => 'datetime', + 'currency' => 'string', + 'excluded_sources' => 'Object', + 'id' => 'string', + 'is_enabled_for_measurement' => 'bool', + 'name' => 'string', + 'time_zone' => 'string', + 'visits_available_date' => 'int', + 'business_units' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUserFields.php new file mode 100644 index 00000000..869401aa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/BusinessUserFields.php @@ -0,0 +1,71 @@ + 'Business', + 'email' => 'string', + 'finance_permission' => 'string', + 'first_name' => 'string', + 'id' => 'string', + 'ip_permission' => 'string', + 'last_name' => 'string', + 'marked_for_removal' => 'bool', + 'name' => 'string', + 'pending_email' => 'string', + 'role' => 'string', + 'title' => 'string', + 'two_fac_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASAdvertiserPartnershipRecommendationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASAdvertiserPartnershipRecommendationFields.php new file mode 100644 index 00000000..daedbf92 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASAdvertiserPartnershipRecommendationFields.php @@ -0,0 +1,63 @@ + 'string', + 'brand_business_id' => 'string', + 'brands' => 'list', + 'countries' => 'list', + 'id' => 'string', + 'merchant_business_id' => 'string', + 'merchant_categories' => 'list', + 'status' => 'string', + 'status_reason' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASCollaborationRequestFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASCollaborationRequestFields.php new file mode 100644 index 00000000..62694492 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASCollaborationRequestFields.php @@ -0,0 +1,65 @@ + 'list', + 'contact_email' => 'string', + 'contact_first_name' => 'string', + 'contact_last_name' => 'string', + 'id' => 'string', + 'phone_number' => 'string', + 'receiver_business' => 'Business', + 'requester_agency_or_brand' => 'string', + 'sender_client_business' => 'Business', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASParentCatalogSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASParentCatalogSettingsFields.php new file mode 100644 index 00000000..8924e748 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CPASParentCatalogSettingsFields.php @@ -0,0 +1,51 @@ + 'list', + 'default_currency' => 'string', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignFields.php new file mode 100644 index 00000000..1ce00c23 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignFields.php @@ -0,0 +1,125 @@ + 'string', + 'ad_strategy_id' => 'string', + 'adlabels' => 'list', + 'bid_strategy' => 'BidStrategy', + 'boosted_object_id' => 'string', + 'brand_lift_studies' => 'list', + 'budget_rebalance_flag' => 'bool', + 'budget_remaining' => 'string', + 'buying_type' => 'string', + 'can_create_brand_lift_study' => 'bool', + 'can_use_spend_cap' => 'bool', + 'configured_status' => 'ConfiguredStatus', + 'created_time' => 'datetime', + 'daily_budget' => 'string', + 'effective_status' => 'EffectiveStatus', + 'id' => 'string', + 'issues_info' => 'list', + 'last_budget_toggling_time' => 'datetime', + 'lifetime_budget' => 'string', + 'name' => 'string', + 'objective' => 'string', + 'pacing_type' => 'list', + 'promoted_object' => 'AdPromotedObject', + 'recommendations' => 'list', + 'source_campaign' => 'Campaign', + 'source_campaign_id' => 'string', + 'special_ad_categories' => 'list', + 'special_ad_category' => 'string', + 'special_ad_category_country' => 'list', + 'spend_cap' => 'string', + 'start_time' => 'datetime', + 'status' => 'Status', + 'stop_time' => 'datetime', + 'topline_id' => 'string', + 'updated_time' => 'datetime', + 'adbatch' => 'list', + 'execution_options' => 'list', + 'iterative_split_test_configs' => 'list', + 'smart_promotion_type' => 'SmartPromotionType', + 'upstream_events' => 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupBrandConfigurationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupBrandConfigurationFields.php new file mode 100644 index 00000000..57a50e2f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupBrandConfigurationFields.php @@ -0,0 +1,51 @@ + 'string', + 'locale' => 'string', + 'vertical' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupCollaborativeAdsPartnerInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupCollaborativeAdsPartnerInfoFields.php new file mode 100644 index 00000000..f4cee7c0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CampaignGroupCollaborativeAdsPartnerInfoFields.php @@ -0,0 +1,45 @@ + 'bool', + 'lead_form_created_time' => 'unsigned int', + 'lead_form_name' => 'string', + 'lead_gen_form_id' => 'string', + 'leads_count' => 'int', + 'product_set_id' => 'string', + 'use_retailer_item_ids' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasBodyElementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasBodyElementFields.php new file mode 100644 index 00000000..e036b788 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasBodyElementFields.php @@ -0,0 +1,47 @@ + 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasCollectionThumbnailFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasCollectionThumbnailFields.php new file mode 100644 index 00000000..8b657450 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasCollectionThumbnailFields.php @@ -0,0 +1,51 @@ + 'int', + 'element_id' => 'string', + 'photo' => 'Photo', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasFields.php new file mode 100644 index 00000000..86687a3c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CanvasFields.php @@ -0,0 +1,65 @@ + 'string', + 'body_elements' => 'list', + 'canvas_link' => 'string', + 'id' => 'string', + 'is_hidden' => 'bool', + 'is_published' => 'bool', + 'last_editor' => 'User', + 'name' => 'string', + 'owner' => 'Page', + 'update_time' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogBasedTargetingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogBasedTargetingFields.php new file mode 100644 index 00000000..9ab23ead --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogBasedTargetingFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppLinksFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppLinksFields.php new file mode 100644 index 00000000..8ef05f02 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppLinksFields.php @@ -0,0 +1,61 @@ + 'list', + 'ios' => 'list', + 'ipad' => 'list', + 'iphone' => 'list', + 'web' => 'WebAppLink', + 'windows' => 'list', + 'windows_phone' => 'list', + 'windows_universal' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppealStatusFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppealStatusFields.php new file mode 100644 index 00000000..aa55be6a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogItemAppealStatusFields.php @@ -0,0 +1,53 @@ + 'string', + 'item_id' => 'int', + 'status' => 'string', + 'use_cases' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogSubVerticalListFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogSubVerticalListFields.php new file mode 100644 index 00000000..5da21664 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CatalogSubVerticalListFields.php @@ -0,0 +1,149 @@ + 'Object', + 'baby_feeding' => 'Object', + 'baby_transport' => 'Object', + 'beauty' => 'Object', + 'bedding' => 'Object', + 'cameras' => 'Object', + 'cameras_and_photos' => 'Object', + 'cell_phones_and_smart_watches' => 'Object', + 'cleaning_supplies' => 'Object', + 'clo_offer' => 'Object', + 'clothing' => 'Object', + 'clothing_accessories' => 'Object', + 'clothing_group' => 'Object', + 'computer_components' => 'Object', + 'computers_and_tablets' => 'Object', + 'computers_laptops_and_tablets' => 'Object', + 'diapering_and_potty_training' => 'Object', + 'electronic_accessories_and_cables' => 'Object', + 'electronics_accessories' => 'Object', + 'furniture' => 'Object', + 'health' => 'Object', + 'home' => 'Object', + 'home_goods' => 'Object', + 'household_and_cleaning_supplies' => 'Object', + 'jewelry' => 'Object', + 'large_appliances' => 'Object', + 'loyalty_offer' => 'Object', + 'meetup_space' => 'Object', + 'nursery' => 'Object', + 'printers_and_scanners' => 'Object', + 'printers_scanners_and_fax_machines' => 'Object', + 'product_discount' => 'Object', + 'projectors' => 'Object', + 'shoes' => 'Object', + 'shoes_and_footwear' => 'Object', + 'software' => 'Object', + 'televisions_and_monitors' => 'Object', + 'test_child_sub_vertical' => 'Object', + 'test_grand_child_sub_vertical' => 'Object', + 'test_sub_vertical' => 'Object', + 'test_sub_vertical_alias' => 'Object', + 'test_sub_vertical_data_object' => 'Object', + 'third_party_electronics' => 'Object', + 'third_party_toys_and_games' => 'Object', + 'toys' => 'Object', + 'toys_and_games' => 'Object', + 'tvs_and_monitors' => 'Object', + 'vehicle_manufacturer' => 'Object', + 'video_game_consoles_and_video_games' => 'Object', + 'video_games_and_consoles' => 'Object', + 'video_projectors' => 'Object', + 'watches' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CheckBatchRequestStatusFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CheckBatchRequestStatusFields.php new file mode 100644 index 00000000..cfee02fb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CheckBatchRequestStatusFields.php @@ -0,0 +1,59 @@ + 'list', + 'errors_total_count' => 'int', + 'handle' => 'string', + 'ids_of_invalid_requests' => 'list', + 'status' => 'string', + 'warnings' => 'list', + 'warnings_total_count' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ChildEventFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ChildEventFields.php new file mode 100644 index 00000000..82776eed --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ChildEventFields.php @@ -0,0 +1,53 @@ + 'string', + 'id' => 'string', + 'start_time' => 'string', + 'ticket_uri' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ClickTrackingTagFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ClickTrackingTagFields.php new file mode 100644 index 00000000..7a425d43 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ClickTrackingTagFields.php @@ -0,0 +1,38 @@ + 'Business', + 'id' => 'string', + 'product_catalog_proxy_id' => 'string', + 'utm_campaign' => 'string', + 'utm_medium' => 'string', + 'utm_source' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommentFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommentFields.php new file mode 100644 index 00000000..b9ceac82 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommentFields.php @@ -0,0 +1,91 @@ + 'User', + 'application' => 'Application', + 'attachment' => 'Object', + 'can_comment' => 'bool', + 'can_hide' => 'bool', + 'can_like' => 'bool', + 'can_remove' => 'bool', + 'can_reply_privately' => 'bool', + 'comment_count' => 'unsigned int', + 'created_time' => 'datetime', + 'from' => 'Object', + 'id' => 'string', + 'is_hidden' => 'bool', + 'is_private' => 'bool', + 'like_count' => 'unsigned int', + 'live_broadcast_timestamp' => 'unsigned int', + 'message' => 'string', + 'message_tags' => 'list', + 'object' => 'Object', + 'parent' => 'Comment', + 'permalink_url' => 'string', + 'private_reply_conversation' => 'Object', + 'user_likes' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsFields.php new file mode 100644 index 00000000..66c793ad --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsFields.php @@ -0,0 +1,93 @@ + 'string', + 'checkout_message' => 'string', + 'contact_email' => 'string', + 'cta' => 'string', + 'disable_checkout_urls' => 'bool', + 'display_name' => 'string', + 'external_merchant_id' => 'string', + 'facebook_channel' => 'Object', + 'has_discount_code' => 'bool', + 'id' => 'string', + 'instagram_channel' => 'Object', + 'merchant_alert_email' => 'string', + 'merchant_page' => 'Profile', + 'merchant_status' => 'string', + 'onsite_commerce_merchant' => 'Object', + 'payment_provider' => 'string', + 'privacy_url_by_locale' => 'map', + 'review_rejection_messages' => 'list', + 'review_rejection_reasons' => 'list', + 'review_status' => 'string', + 'supported_card_types' => 'list', + 'terms' => 'string', + 'terms_url_by_locale' => 'map', + 'whatsapp_channel' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsSetupStatusFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsSetupStatusFields.php new file mode 100644 index 00000000..377aec6a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceMerchantSettingsSetupStatusFields.php @@ -0,0 +1,57 @@ + 'string', + 'marketplace_approval_status' => 'string', + 'marketplace_approval_status_details' => 'Object', + 'payment_setup' => 'string', + 'review_status' => 'Object', + 'shop_setup' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderFields.php new file mode 100644 index 00000000..76b13e16 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderFields.php @@ -0,0 +1,71 @@ + 'Object', + 'channel' => 'string', + 'created' => 'string', + 'estimated_payment_details' => 'Object', + 'id' => 'string', + 'is_group_buy' => 'bool', + 'is_test_order' => 'bool', + 'last_updated' => 'string', + 'merchant_order_id' => 'string', + 'order_status' => 'Object', + 'selected_shipping_option' => 'Object', + 'ship_by_date' => 'string', + 'shipping_address' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderTransactionDetailFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderTransactionDetailFields.php new file mode 100644 index 00000000..d74c0cb8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceOrderTransactionDetailFields.php @@ -0,0 +1,63 @@ + 'Object', + 'order_details' => 'CommerceOrder', + 'payout_reference_id' => 'string', + 'processing_fee' => 'Object', + 'tax_rate' => 'string', + 'transaction_date' => 'string', + 'transaction_type' => 'string', + 'transfer_id' => 'string', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommercePayoutFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommercePayoutFields.php new file mode 100644 index 00000000..8db1b656 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommercePayoutFields.php @@ -0,0 +1,55 @@ + 'Object', + 'payout_date' => 'string', + 'payout_reference_id' => 'string', + 'status' => 'string', + 'transfer_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceSettingsFields.php new file mode 100644 index 00000000..0992858c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CommerceSettingsFields.php @@ -0,0 +1,49 @@ + 'int', + 'total_inventory' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConnectionsTargetingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConnectionsTargetingFields.php new file mode 100644 index 00000000..51775b08 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConnectionsTargetingFields.php @@ -0,0 +1,49 @@ + 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ContentDeliveryReportFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ContentDeliveryReportFields.php new file mode 100644 index 00000000..6d9bbce0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ContentDeliveryReportFields.php @@ -0,0 +1,55 @@ + 'string', + 'content_url' => 'string', + 'creator_name' => 'string', + 'creator_url' => 'string', + 'estimated_impressions' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConversionActionQueryFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConversionActionQueryFields.php new file mode 100644 index 00000000..65181749 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ConversionActionQueryFields.php @@ -0,0 +1,97 @@ + 'list', + 'application' => 'list', + 'conversion_id' => 'list', + 'creative' => 'list', + 'dataset' => 'list', + 'event' => 'list', + 'event.creator' => 'list', + 'event_type' => 'list', + 'fb_pixel' => 'list', + 'fb_pixel_event' => 'list', + 'leadgen' => 'list', + 'object' => 'list', + 'object.domain' => 'list', + 'offer' => 'list', + 'offer.creator' => 'list', + 'offsite_pixel' => 'list', + 'page' => 'list', + 'page.parent' => 'list', + 'post' => 'list', + 'post.object' => 'list', + 'post.object.wall' => 'list', + 'post.wall' => 'list', + 'question' => 'list', + 'question.creator' => 'list', + 'response' => 'list', + 'subtype' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CopyrightReferenceContainerFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CopyrightReferenceContainerFields.php new file mode 100644 index 00000000..2ed54cb2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CopyrightReferenceContainerFields.php @@ -0,0 +1,69 @@ + 'string', + 'copyright_creation_time' => 'datetime', + 'download_hd_url' => 'string', + 'duration_in_sec' => 'float', + 'id' => 'string', + 'iswc' => 'string', + 'metadata' => 'Object', + 'published_time' => 'datetime', + 'thumbnail_url' => 'string', + 'title' => 'string', + 'universal_content_id' => 'string', + 'writer_names' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CoverPhotoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CoverPhotoFields.php new file mode 100644 index 00000000..489ce14f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CoverPhotoFields.php @@ -0,0 +1,55 @@ + 'string', + 'id' => 'string', + 'offset_x' => 'float', + 'offset_y' => 'float', + 'source' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreativeHistoryFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreativeHistoryFields.php new file mode 100644 index 00000000..e03034a4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreativeHistoryFields.php @@ -0,0 +1,49 @@ + 'int', + 'time_ranges' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreditPartitionActionOptionsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreditPartitionActionOptionsFields.php new file mode 100644 index 00000000..e5283b81 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CreditPartitionActionOptionsFields.php @@ -0,0 +1,51 @@ + 'Object', + 'partition_type' => 'Object', + 'send_bill_to' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyAmountFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyAmountFields.php new file mode 100644 index 00000000..2de425f0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyAmountFields.php @@ -0,0 +1,53 @@ + 'string', + 'amount_in_hundredths' => 'string', + 'currency' => 'string', + 'offsetted_amount' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyFields.php new file mode 100644 index 00000000..76d082d9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CurrencyFields.php @@ -0,0 +1,53 @@ + 'unsigned int', + 'usd_exchange' => 'float', + 'usd_exchange_inverse' => 'float', + 'user_currency' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceAdAccountFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceAdAccountFields.php new file mode 100644 index 00000000..068f5e10 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceAdAccountFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceDataSourceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceDataSourceFields.php new file mode 100644 index 00000000..8e0b03b1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceDataSourceFields.php @@ -0,0 +1,51 @@ + 'string', + 'sub_type' => 'SubType', + 'type' => 'Type', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceFields.php new file mode 100644 index 00000000..216f0e5b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceFields.php @@ -0,0 +1,177 @@ + 'string', + 'approximate_count' => 'int', + 'customer_file_source' => 'string', + 'data_source' => 'CustomAudienceDataSource', + 'data_source_types' => 'string', + 'datafile_custom_audience_uploading_status' => 'string', + 'delivery_status' => 'CustomAudienceStatus', + 'description' => 'string', + 'excluded_custom_audiences' => 'list', + 'external_event_source' => 'AdsPixel', + 'household_audience' => 'int', + 'id' => 'string', + 'included_custom_audiences' => 'list', + 'is_household' => 'bool', + 'is_snapshot' => 'bool', + 'is_value_based' => 'bool', + 'lookalike_audience_ids' => 'list', + 'lookalike_spec' => 'LookalikeSpec', + 'name' => 'string', + 'operation_status' => 'CustomAudienceStatus', + 'opt_out_link' => 'string', + 'permission_for_actions' => 'AudiencePermissionForActions', + 'pixel_id' => 'string', + 'regulated_audience_spec' => 'LookalikeSpec', + 'retention_days' => 'int', + 'rev_share_policy_id' => 'unsigned int', + 'rule' => 'string', + 'rule_aggregation' => 'string', + 'rule_v2' => 'string', + 'seed_audience' => 'int', + 'sharing_status' => 'CustomAudienceSharingStatus', + 'subtype' => 'string', + 'time_content_updated' => 'unsigned int', + 'time_created' => 'unsigned int', + 'time_updated' => 'unsigned int', + 'accountID' => 'string', + 'additionalMetadata' => 'string', + 'allowed_domains' => 'list', + 'associated_audience_id' => 'unsigned int', + 'claim_objective' => 'ClaimObjective', + 'content_type' => 'ContentType', + 'countries' => 'string', + 'creation_params' => 'map', + 'dataset_id' => 'string', + 'details' => 'string', + 'enable_fetch_or_create' => 'bool', + 'event_source_group' => 'string', + 'event_sources' => 'list', + 'exclusions' => 'list', + 'expectedSize' => 'unsigned int', + 'gender' => 'string', + 'inclusions' => 'list', + 'isPrivate' => 'bool', + 'is_household_exclusion' => 'bool', + 'list_of_accounts' => 'list', + 'maxAge' => 'unsigned int', + 'minAge' => 'unsigned int', + 'origin_audience_id' => 'string', + 'parent_audience_id' => 'unsigned int', + 'partnerID' => 'string', + 'partner_reference_key' => 'string', + 'prefill' => 'bool', + 'product_set_id' => 'string', + 'source' => 'string', + 'tags' => 'list', + 'video_group_ids' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceMultikeySchemaFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceMultikeySchemaFields.php new file mode 100644 index 00000000..c3b3757f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceMultikeySchemaFields.php @@ -0,0 +1,51 @@ + 'string', + 'num_invalid_entries' => 'string', + 'num_matched' => 'string', + 'num_received' => 'string', + 'progress' => 'string', + 'session_id' => 'string', + 'stage' => 'string', + 'start_time' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceSharingStatusFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceSharingStatusFields.php new file mode 100644 index 00000000..cfd83d33 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceSharingStatusFields.php @@ -0,0 +1,49 @@ + 'unsigned int', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceStatusFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceStatusFields.php new file mode 100644 index 00000000..7ce9e788 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudienceStatusFields.php @@ -0,0 +1,49 @@ + 'unsigned int', + 'description' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesTOSFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesTOSFields.php new file mode 100644 index 00000000..d7fee3ba --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesTOSFields.php @@ -0,0 +1,51 @@ + 'string', + 'id' => 'string', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesharedAccountInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesharedAccountInfoFields.php new file mode 100644 index 00000000..94faef51 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomAudiencesharedAccountInfoFields.php @@ -0,0 +1,55 @@ + 'string', + 'account_name' => 'string', + 'business_id' => 'string', + 'business_name' => 'string', + 'sharing_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionFields.php new file mode 100644 index 00000000..c302cf13 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionFields.php @@ -0,0 +1,89 @@ + 'string', + 'aggregation_rule' => 'string', + 'business' => 'Business', + 'creation_time' => 'datetime', + 'custom_event_type' => 'CustomEventType', + 'data_sources' => 'list', + 'default_conversion_value' => 'int', + 'description' => 'string', + 'event_source_type' => 'string', + 'first_fired_time' => 'datetime', + 'id' => 'string', + 'is_archived' => 'bool', + 'is_unavailable' => 'bool', + 'last_fired_time' => 'datetime', + 'name' => 'string', + 'offline_conversion_data_set' => 'OfflineConversionDataSet', + 'pixel' => 'AdsPixel', + 'retention_days' => 'unsigned int', + 'rule' => 'string', + 'advanced_rule' => 'string', + 'event_source_id' => 'string', + 'custom_conversion_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionStatsResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionStatsResultFields.php new file mode 100644 index 00000000..5b618dcc --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomConversionStatsResultFields.php @@ -0,0 +1,51 @@ + 'Aggregation', + 'data' => 'list', + 'timestamp' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomUserSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomUserSettingsFields.php new file mode 100644 index 00000000..feba8ad5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/CustomUserSettingsFields.php @@ -0,0 +1,49 @@ + 'list', + 'user_level_persistent_menu' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DACheckFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DACheckFields.php new file mode 100644 index 00000000..ad7748f9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DACheckFields.php @@ -0,0 +1,57 @@ + 'string', + 'description' => 'string', + 'key' => 'string', + 'result' => 'string', + 'title' => 'string', + 'user_message' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DayPartFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DayPartFields.php new file mode 100644 index 00000000..3ebcd39b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DayPartFields.php @@ -0,0 +1,53 @@ + 'list', + 'end_minute' => 'int', + 'start_minute' => 'int', + 'timezone_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckExtraInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckExtraInfoFields.php new file mode 100644 index 00000000..872a865d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckExtraInfoFields.php @@ -0,0 +1,51 @@ + 'list', + 'campaign_ids' => 'list', + 'countries' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckFields.php new file mode 100644 index 00000000..3817921c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DeliveryCheckFields.php @@ -0,0 +1,53 @@ + 'string', + 'description' => 'string', + 'extra_info' => 'DeliveryCheckExtraInfo', + 'summary' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationCatalogSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationCatalogSettingsFields.php new file mode 100644 index 00000000..d9615863 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationCatalogSettingsFields.php @@ -0,0 +1,49 @@ + 'bool', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationFields.php new file mode 100644 index 00000000..0799a4dd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DestinationFields.php @@ -0,0 +1,73 @@ + 'string', + 'applinks' => 'CatalogItemAppLinks', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'currency' => 'string', + 'description' => 'string', + 'destination_id' => 'string', + 'id' => 'string', + 'images' => 'list', + 'name' => 'string', + 'price' => 'string', + 'price_change' => 'string', + 'sanitized_images' => 'list', + 'types' => 'list', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DomainFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DomainFields.php new file mode 100644 index 00000000..7855a381 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DomainFields.php @@ -0,0 +1,51 @@ + 'string', + 'name' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicContentSetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicContentSetFields.php new file mode 100644 index 00000000..6c7b1a9e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicContentSetFields.php @@ -0,0 +1,51 @@ + 'string', + 'id' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPostChildAttachmentFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPostChildAttachmentFields.php new file mode 100644 index 00000000..0d26f54d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPostChildAttachmentFields.php @@ -0,0 +1,57 @@ + 'string', + 'image_url' => 'string', + 'link' => 'string', + 'place_id' => 'string', + 'product_id' => 'string', + 'title' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPriceConfigByDateFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPriceConfigByDateFields.php new file mode 100644 index 00000000..11fd4aac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/DynamicPriceConfigByDateFields.php @@ -0,0 +1,53 @@ + 'string', + 'prices' => 'string', + 'prices_pretty' => 'list', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EngagementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EngagementFields.php new file mode 100644 index 00000000..11c371fb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EngagementFields.php @@ -0,0 +1,59 @@ + 'unsigned int', + 'count_string' => 'string', + 'count_string_with_like' => 'string', + 'count_string_without_like' => 'string', + 'social_sentence' => 'string', + 'social_sentence_with_like' => 'string', + 'social_sentence_without_like' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EntityAtTextRangeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EntityAtTextRangeFields.php new file mode 100644 index 00000000..b6c82af2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EntityAtTextRangeFields.php @@ -0,0 +1,57 @@ + 'string', + 'length' => 'unsigned int', + 'name' => 'string', + 'object' => 'Profile', + 'offset' => 'unsigned int', + 'type' => 'Type', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventFields.php new file mode 100644 index 00000000..93f0c5ee --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventFields.php @@ -0,0 +1,111 @@ + 'int', + 'can_guests_invite' => 'bool', + 'category' => 'Category', + 'cover' => 'CoverPhoto', + 'declined_count' => 'int', + 'description' => 'string', + 'discount_code_enabled' => 'bool', + 'end_time' => 'string', + 'event_times' => 'list', + 'guest_list_enabled' => 'bool', + 'id' => 'string', + 'interested_count' => 'int', + 'is_canceled' => 'bool', + 'is_draft' => 'bool', + 'is_online' => 'bool', + 'is_page_owned' => 'bool', + 'maybe_count' => 'int', + 'name' => 'string', + 'noreply_count' => 'int', + 'online_event_format' => 'OnlineEventFormat', + 'online_event_third_party_url' => 'string', + 'owner' => 'Object', + 'parent_group' => 'Group', + 'place' => 'Place', + 'scheduled_publish_time' => 'string', + 'start_time' => 'string', + 'ticket_uri' => 'string', + 'ticket_uri_start_sales_time' => 'string', + 'ticketing_privacy_uri' => 'string', + 'ticketing_terms_uri' => 'string', + 'timezone' => 'string', + 'type' => 'Type', + 'updated_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventSourceGroupFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventSourceGroupFields.php new file mode 100644 index 00000000..577d0761 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventSourceGroupFields.php @@ -0,0 +1,53 @@ + 'Business', + 'event_sources' => 'list', + 'id' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventTourFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventTourFields.php new file mode 100644 index 00000000..354c5f7c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/EventTourFields.php @@ -0,0 +1,73 @@ + 'string', + 'dominant_color' => 'string', + 'end_time' => 'string', + 'id' => 'string', + 'is_past' => 'bool', + 'last_event_timestamp' => 'int', + 'name' => 'string', + 'num_events' => 'int', + 'photo' => 'Photo', + 'publishing_state' => 'string', + 'scheduled_publish_timestamp' => 'int', + 'start_time' => 'string', + 'ticketing_uri' => 'string', + 'video' => 'AdVideo', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExperienceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExperienceFields.php new file mode 100644 index 00000000..4afd763e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExperienceFields.php @@ -0,0 +1,55 @@ + 'string', + 'from' => 'User', + 'id' => 'string', + 'name' => 'string', + 'with' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditAllocationConfigFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditAllocationConfigFields.php new file mode 100644 index 00000000..01f415c9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditAllocationConfigFields.php @@ -0,0 +1,65 @@ + 'CurrencyAmount', + 'id' => 'string', + 'liability_type' => 'string', + 'owning_business' => 'Business', + 'owning_credential' => 'ExtendedCredit', + 'partition_type' => 'string', + 'receiving_business' => 'Business', + 'receiving_credential' => 'ExtendedCredit', + 'request_status' => 'string', + 'send_bill_to' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditFields.php new file mode 100644 index 00000000..d7016c99 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditFields.php @@ -0,0 +1,77 @@ + 'CurrencyAmount', + 'balance' => 'CurrencyAmount', + 'credit_available' => 'CurrencyAmount', + 'credit_type' => 'string', + 'id' => 'string', + 'is_access_revoked' => 'bool', + 'is_automated_experience' => 'bool', + 'legal_entity_name' => 'string', + 'liable_biz_name' => 'string', + 'max_balance' => 'CurrencyAmount', + 'online_max_balance' => 'CurrencyAmount', + 'owner_business' => 'Business', + 'owner_business_name' => 'string', + 'partition_from' => 'string', + 'receiving_credit_allocation_config' => 'ExtendedCreditAllocationConfig', + 'send_bill_to_biz_name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditInvoiceGroupFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditInvoiceGroupFields.php new file mode 100644 index 00000000..01b34e7b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExtendedCreditInvoiceGroupFields.php @@ -0,0 +1,57 @@ + 'bool', + 'customer_po_number' => 'string', + 'email' => 'Object', + 'emails' => 'list', + 'id' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExternalEventSourceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExternalEventSourceFields.php new file mode 100644 index 00000000..0ac02870 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ExternalEventSourceFields.php @@ -0,0 +1,51 @@ + 'string', + 'name' => 'string', + 'source_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FAMEExportConfigFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FAMEExportConfigFields.php new file mode 100644 index 00000000..bd3df147 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FAMEExportConfigFields.php @@ -0,0 +1,53 @@ + 'bool', + 'column_id' => 'string', + 'display_name' => 'string', + 'format' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlexibleTargetingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlexibleTargetingFields.php new file mode 100644 index 00000000..0dab2fe4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlexibleTargetingFields.php @@ -0,0 +1,101 @@ + 'list', + 'college_years' => 'list', + 'connections' => 'list', + 'custom_audiences' => 'list', + 'education_majors' => 'list', + 'education_schools' => 'list', + 'education_statuses' => 'list', + 'ethnic_affinity' => 'list', + 'family_statuses' => 'list', + 'friends_of_connections' => 'list', + 'generation' => 'list', + 'home_ownership' => 'list', + 'home_type' => 'list', + 'home_value' => 'list', + 'household_composition' => 'list', + 'income' => 'list', + 'industries' => 'list', + 'interested_in' => 'list', + 'interests' => 'list', + 'life_events' => 'list', + 'moms' => 'list', + 'net_worth' => 'list', + 'office_type' => 'list', + 'politics' => 'list', + 'relationship_statuses' => 'list', + 'user_adclusters' => 'list', + 'work_employers' => 'list', + 'work_positions' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlightFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlightFields.php new file mode 100644 index 00000000..ab8cc7a7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FlightFields.php @@ -0,0 +1,77 @@ + 'CatalogItemAppLinks', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'currency' => 'string', + 'description' => 'string', + 'destination_airport' => 'string', + 'destination_city' => 'string', + 'flight_id' => 'string', + 'id' => 'string', + 'images' => 'list', + 'oneway_currency' => 'string', + 'oneway_price' => 'string', + 'origin_airport' => 'string', + 'origin_city' => 'string', + 'price' => 'string', + 'sanitized_images' => 'list', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FriendListFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FriendListFields.php new file mode 100644 index 00000000..094ca5ac --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FriendListFields.php @@ -0,0 +1,53 @@ + 'string', + 'list_type' => 'string', + 'name' => 'string', + 'owner' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsCouponFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsCouponFields.php new file mode 100644 index 00000000..713ce0e1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsCouponFields.php @@ -0,0 +1,53 @@ + 'int', + 'currency' => 'string', + 'display_amount' => 'string', + 'expiration' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsFields.php new file mode 100644 index 00000000..c5078f90 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/FundingSourceDetailsFields.php @@ -0,0 +1,53 @@ + 'FundingSourceDetailsCoupon', + 'display_string' => 'string', + 'id' => 'string', + 'type' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/GroupFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/GroupFields.php new file mode 100644 index 00000000..e7f36679 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/GroupFields.php @@ -0,0 +1,83 @@ + 'bool', + 'cover' => 'CoverPhoto', + 'created_time' => 'datetime', + 'description' => 'string', + 'email' => 'string', + 'icon' => 'string', + 'id' => 'string', + 'link' => 'string', + 'member_count' => 'unsigned int', + 'member_request_count' => 'unsigned int', + 'name' => 'string', + 'owner' => 'Object', + 'parent' => 'Object', + 'permissions' => 'list', + 'privacy' => 'string', + 'purpose' => 'string', + 'subdomain' => 'string', + 'updated_time' => 'datetime', + 'venue' => 'Location', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HomeListingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HomeListingFields.php new file mode 100644 index 00000000..1a7d6274 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HomeListingFields.php @@ -0,0 +1,131 @@ + 'string', + 'additional_fees_description' => 'string', + 'address' => 'Object', + 'agent_company' => 'string', + 'agent_email' => 'string', + 'agent_fb_page_id' => 'Page', + 'agent_name' => 'string', + 'agent_phone' => 'string', + 'applinks' => 'CatalogItemAppLinks', + 'area_size' => 'unsigned int', + 'area_unit' => 'string', + 'availability' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'co_2_emission_rating_eu' => 'Object', + 'currency' => 'string', + 'days_on_market' => 'unsigned int', + 'description' => 'string', + 'energy_rating_eu' => 'Object', + 'furnish_type' => 'string', + 'group_id' => 'string', + 'heating_type' => 'string', + 'home_listing_id' => 'string', + 'id' => 'string', + 'images' => 'list', + 'laundry_type' => 'string', + 'listing_type' => 'string', + 'max_currency' => 'string', + 'max_price' => 'string', + 'min_currency' => 'string', + 'min_price' => 'string', + 'name' => 'string', + 'num_baths' => 'float', + 'num_beds' => 'float', + 'num_rooms' => 'float', + 'num_units' => 'unsigned int', + 'parking_type' => 'string', + 'partner_verification' => 'string', + 'pet_policy' => 'string', + 'price' => 'string', + 'property_type' => 'string', + 'sanitized_images' => 'list', + 'url' => 'string', + 'year_built' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelFields.php new file mode 100644 index 00000000..fb30aa27 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelFields.php @@ -0,0 +1,87 @@ + 'string', + 'applinks' => 'CatalogItemAppLinks', + 'brand' => 'string', + 'category' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'currency' => 'string', + 'description' => 'string', + 'guest_ratings' => 'string', + 'hotel_id' => 'string', + 'id' => 'string', + 'images' => 'list', + 'lowest_base_price' => 'string', + 'loyalty_program' => 'string', + 'margin_level' => 'unsigned int', + 'name' => 'string', + 'phone' => 'string', + 'sale_price' => 'string', + 'sanitized_images' => 'list', + 'star_rating' => 'float', + 'url' => 'string', + 'base_price' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelRoomFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelRoomFields.php new file mode 100644 index 00000000..8b78d91d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/HotelRoomFields.php @@ -0,0 +1,67 @@ + 'CatalogItemAppLinks', + 'base_price' => 'string', + 'currency' => 'string', + 'description' => 'string', + 'id' => 'string', + 'images' => 'list', + 'margin_level' => 'string', + 'name' => 'string', + 'room_id' => 'string', + 'sale_price' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IDNameFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IDNameFields.php new file mode 100644 index 00000000..fedcf5b4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IDNameFields.php @@ -0,0 +1,49 @@ + 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGCommentFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGCommentFields.php new file mode 100644 index 00000000..fe7600ec --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGCommentFields.php @@ -0,0 +1,61 @@ + 'bool', + 'id' => 'string', + 'like_count' => 'int', + 'media' => 'IGMedia', + 'text' => 'string', + 'timestamp' => 'datetime', + 'user' => 'IGUser', + 'username' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGMediaFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGMediaFields.php new file mode 100644 index 00000000..228486d9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGMediaFields.php @@ -0,0 +1,75 @@ + 'string', + 'caption' => 'string', + 'comments_count' => 'int', + 'id' => 'string', + 'ig_id' => 'string', + 'is_comment_enabled' => 'bool', + 'like_count' => 'int', + 'media_type' => 'string', + 'media_url' => 'string', + 'owner' => 'IGUser', + 'permalink' => 'string', + 'shortcode' => 'string', + 'thumbnail_url' => 'string', + 'timestamp' => 'datetime', + 'username' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGUserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGUserFields.php new file mode 100644 index 00000000..e8a64f96 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IGUserFields.php @@ -0,0 +1,75 @@ + 'string', + 'business_discovery' => 'IGUser', + 'followers_count' => 'int', + 'follows_count' => 'int', + 'id' => 'string', + 'ig_id' => 'int', + 'is_ig_shopping_seller_policy_enabled' => 'bool', + 'media_count' => 'int', + 'mentioned_comment' => 'IGComment', + 'mentioned_media' => 'IGMedia', + 'name' => 'string', + 'profile_picture_url' => 'string', + 'shopping_review_status' => 'string', + 'username' => 'string', + 'website' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InsightsResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InsightsResultFields.php new file mode 100644 index 00000000..4949687d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InsightsResultFields.php @@ -0,0 +1,59 @@ + 'string', + 'description_from_api_doc' => 'string', + 'id' => 'string', + 'name' => 'string', + 'period' => 'string', + 'title' => 'string', + 'values' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsResultFields.php new file mode 100644 index 00000000..1e0d2ca1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsResultFields.php @@ -0,0 +1,57 @@ + 'string', + 'id' => 'string', + 'name' => 'string', + 'period' => 'string', + 'title' => 'string', + 'values' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsValueFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsValueFields.php new file mode 100644 index 00000000..8154a45f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramInsightsValueFields.php @@ -0,0 +1,49 @@ + 'datetime', + 'value' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramUserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramUserFields.php new file mode 100644 index 00000000..bc8d2d94 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstagramUserFields.php @@ -0,0 +1,63 @@ + 'int', + 'followed_by_count' => 'int', + 'has_profile_picture' => 'bool', + 'id' => 'string', + 'is_private' => 'bool', + 'is_published' => 'bool', + 'media_count' => 'int', + 'profile_pic' => 'string', + 'username' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleFields.php new file mode 100644 index 00000000..02126a26 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleFields.php @@ -0,0 +1,63 @@ + 'string', + 'development_mode' => 'bool', + 'html_source' => 'string', + 'id' => 'string', + 'most_recent_import_status' => 'Object', + 'photos' => 'list', + 'publish_status' => 'string', + 'published' => 'bool', + 'videos' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleInsightsQueryResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleInsightsQueryResultFields.php new file mode 100644 index 00000000..950682ea --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InstantArticleInsightsQueryResultFields.php @@ -0,0 +1,53 @@ + 'map', + 'name' => 'string', + 'time' => 'datetime', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InvoiceCampaignFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InvoiceCampaignFields.php new file mode 100644 index 00000000..40f65c73 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/InvoiceCampaignFields.php @@ -0,0 +1,61 @@ + 'string', + 'billed_amount_details' => 'BilledAmountDetails', + 'campaign_id' => 'string', + 'campaign_name' => 'string', + 'clicks' => 'unsigned int', + 'conversions' => 'unsigned int', + 'impressions' => 'unsigned int', + 'tags' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IosAppLinkFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IosAppLinkFields.php new file mode 100644 index 00000000..e603e597 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/IosAppLinkFields.php @@ -0,0 +1,51 @@ + 'string', + 'app_store_id' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/KeyValueFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/KeyValueFields.php new file mode 100644 index 00000000..3281c727 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/KeyValueFields.php @@ -0,0 +1,49 @@ + 'string', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadFields.php new file mode 100644 index 00000000..7f82cc79 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadFields.php @@ -0,0 +1,79 @@ + 'string', + 'ad_name' => 'string', + 'adset_id' => 'string', + 'adset_name' => 'string', + 'campaign_id' => 'string', + 'campaign_name' => 'string', + 'created_time' => 'datetime', + 'custom_disclaimer_responses' => 'list', + 'field_data' => 'list', + 'form_id' => 'string', + 'home_listing' => 'HomeListing', + 'id' => 'string', + 'is_organic' => 'bool', + 'partner_name' => 'string', + 'platform' => 'string', + 'retailer_item_id' => 'string', + 'vehicle' => 'Vehicle', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenAppointmentBookingInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenAppointmentBookingInfoFields.php new file mode 100644 index 00000000..b1de6670 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenAppointmentBookingInfoFields.php @@ -0,0 +1,51 @@ + 'string', + 'appointment_durations' => 'list', + 'appointment_slots_by_day' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupChoicesFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupChoicesFields.php new file mode 100644 index 00000000..32266b93 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupChoicesFields.php @@ -0,0 +1,51 @@ + 'string', + 'next_question_choices' => 'list', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupQuestionsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupQuestionsFields.php new file mode 100644 index 00000000..c23726a5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenConditionalQuestionsGroupQuestionsFields.php @@ -0,0 +1,51 @@ + 'string', + 'input_type' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenDraftQuestionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenDraftQuestionFields.php new file mode 100644 index 00000000..e243bd6c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenDraftQuestionFields.php @@ -0,0 +1,61 @@ + 'list', + 'conditional_questions_group_id' => 'string', + 'dependent_conditional_questions' => 'list', + 'inline_context' => 'string', + 'key' => 'string', + 'label' => 'string', + 'options' => 'list', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenPostSubmissionCheckResultFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenPostSubmissionCheckResultFields.php new file mode 100644 index 00000000..87e65371 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenPostSubmissionCheckResultFields.php @@ -0,0 +1,51 @@ + 'string', + 'api_error_message' => 'string', + 'shown_thank_you_page' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionFields.php new file mode 100644 index 00000000..bb001dc1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionFields.php @@ -0,0 +1,63 @@ + 'list', + 'conditional_questions_group_id' => 'string', + 'dependent_conditional_questions' => 'list', + 'id' => 'string', + 'inline_context' => 'string', + 'key' => 'string', + 'label' => 'string', + 'options' => 'list', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionOptionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionOptionFields.php new file mode 100644 index 00000000..ea14a102 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadGenQuestionOptionFields.php @@ -0,0 +1,49 @@ + 'string', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadgenFormFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadgenFormFields.php new file mode 100644 index 00000000..28850a58 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LeadgenFormFields.php @@ -0,0 +1,89 @@ + 'bool', + 'block_display_for_non_targeted_viewer' => 'bool', + 'context_card' => 'Object', + 'created_time' => 'datetime', + 'expired_leads_count' => 'unsigned int', + 'follow_up_action_text' => 'string', + 'follow_up_action_url' => 'string', + 'id' => 'string', + 'is_optimized_for_quality' => 'bool', + 'leads_count' => 'unsigned int', + 'legal_content' => 'Object', + 'locale' => 'string', + 'name' => 'string', + 'organic_leads_count' => 'unsigned int', + 'page' => 'Page', + 'page_id' => 'string', + 'privacy_policy_url' => 'string', + 'question_page_custom_headline' => 'string', + 'questions' => 'list', + 'status' => 'string', + 'thank_you_page' => 'Object', + 'tracking_parameters' => 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LifeEventFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LifeEventFields.php new file mode 100644 index 00000000..b8d17b95 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LifeEventFields.php @@ -0,0 +1,61 @@ + 'string', + 'end_time' => 'datetime', + 'from' => 'Page', + 'id' => 'string', + 'is_hidden' => 'bool', + 'start_time' => 'datetime', + 'title' => 'string', + 'updated_time' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LinkFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LinkFields.php new file mode 100644 index 00000000..200342b3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LinkFields.php @@ -0,0 +1,69 @@ + 'string', + 'created_time' => 'datetime', + 'description' => 'string', + 'from' => 'Object', + 'icon' => 'string', + 'id' => 'string', + 'link' => 'string', + 'message' => 'string', + 'multi_share_optimized' => 'bool', + 'name' => 'string', + 'privacy' => 'Privacy', + 'via' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveEncoderFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveEncoderFields.php new file mode 100644 index 00000000..06e64f7a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveEncoderFields.php @@ -0,0 +1,67 @@ + 'string', + 'creation_time' => 'datetime', + 'current_broadcast' => 'LiveVideo', + 'current_input_stream' => 'LiveVideoInputStream', + 'device_id' => 'string', + 'id' => 'string', + 'last_heartbeat_time' => 'datetime', + 'model' => 'string', + 'name' => 'string', + 'status' => 'string', + 'version' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoAdBreakConfigFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoAdBreakConfigFields.php new file mode 100644 index 00000000..bc7ad4f5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoAdBreakConfigFields.php @@ -0,0 +1,65 @@ + 'unsigned int', + 'failure_reason_polling_interval' => 'unsigned int', + 'first_break_eligible_secs' => 'unsigned int', + 'guide_url' => 'string', + 'is_eligible_to_onboard' => 'bool', + 'is_enabled' => 'bool', + 'onboarding_url' => 'string', + 'preparing_duration' => 'unsigned int', + 'time_between_ad_breaks_secs' => 'unsigned int', + 'viewer_count_threshold' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoErrorFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoErrorFields.php new file mode 100644 index 00000000..a02bc739 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoErrorFields.php @@ -0,0 +1,55 @@ + 'datetime', + 'error_code' => 'int', + 'error_message' => 'string', + 'error_type' => 'string', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoFields.php new file mode 100644 index 00000000..65b8be63 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoFields.php @@ -0,0 +1,99 @@ + 'LiveVideoAdBreakConfig', + 'ad_break_failure_reason' => 'string', + 'broadcast_start_time' => 'datetime', + 'copyright' => 'VideoCopyright', + 'creation_time' => 'datetime', + 'dash_ingest_url' => 'string', + 'dash_preview_url' => 'string', + 'description' => 'string', + 'embed_html' => 'string', + 'from' => 'Object', + 'id' => 'string', + 'ingest_streams' => 'list', + 'is_manual_mode' => 'bool', + 'is_reference_only' => 'bool', + 'live_encoders' => 'list', + 'live_views' => 'unsigned int', + 'overlay_url' => 'string', + 'permalink_url' => 'string', + 'planned_start_time' => 'datetime', + 'seconds_left' => 'int', + 'secure_stream_url' => 'string', + 'status' => 'string', + 'stream_url' => 'string', + 'targeting' => 'LiveVideoTargeting', + 'title' => 'string', + 'total_views' => 'string', + 'video' => 'AdVideo', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoInputStreamFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoInputStreamFields.php new file mode 100644 index 00000000..c2cbc1a5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoInputStreamFields.php @@ -0,0 +1,63 @@ + 'string', + 'dash_preview_url' => 'string', + 'id' => 'string', + 'is_master' => 'bool', + 'live_encoder' => 'LiveEncoder', + 'secure_stream_url' => 'string', + 'stream_health' => 'Object', + 'stream_id' => 'string', + 'stream_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoTargetingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoTargetingFields.php new file mode 100644 index 00000000..5fc49cc4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LiveVideoTargetingFields.php @@ -0,0 +1,53 @@ + 'unsigned int', + 'age_min' => 'unsigned int', + 'excluded_countries' => 'list', + 'geo_locations' => 'TargetingGeoLocation', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LocationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LocationFields.php new file mode 100644 index 00000000..d1a1a555 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LocationFields.php @@ -0,0 +1,71 @@ + 'string', + 'city_id' => 'unsigned int', + 'country' => 'string', + 'country_code' => 'string', + 'latitude' => 'float', + 'located_in' => 'string', + 'longitude' => 'float', + 'name' => 'string', + 'region' => 'string', + 'region_id' => 'unsigned int', + 'state' => 'string', + 'street' => 'string', + 'zip' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LookalikeSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LookalikeSpecFields.php new file mode 100644 index 00000000..97efd6a9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/LookalikeSpecFields.php @@ -0,0 +1,69 @@ + 'string', + 'is_financial_service' => 'bool', + 'origin' => 'list', + 'origin_event_name' => 'string', + 'origin_event_source_name' => 'string', + 'origin_event_source_type' => 'string', + 'product_set_name' => 'string', + 'ratio' => 'float', + 'starting_ratio' => 'float', + 'target_countries' => 'list', + 'target_country_names' => 'list', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MailingAddressFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MailingAddressFields.php new file mode 100644 index 00000000..06e5cf1b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MailingAddressFields.php @@ -0,0 +1,61 @@ + 'string', + 'city_page' => 'Page', + 'country' => 'string', + 'id' => 'string', + 'postal_code' => 'string', + 'region' => 'string', + 'street1' => 'string', + 'street2' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MeasurementUploadEventFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MeasurementUploadEventFields.php new file mode 100644 index 00000000..ef799865 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MeasurementUploadEventFields.php @@ -0,0 +1,65 @@ + 'string', + 'conversion_end_date' => 'string', + 'conversion_start_date' => 'string', + 'event_status' => 'string', + 'id' => 'string', + 'lookback_window' => 'string', + 'match_universe' => 'string', + 'partner' => 'Business', + 'timezone' => 'string', + 'upload_tag' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MediaFingerprintFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MediaFingerprintFields.php new file mode 100644 index 00000000..c8b59248 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MediaFingerprintFields.php @@ -0,0 +1,59 @@ + 'float', + 'fingerprint_content_type' => 'string', + 'fingerprint_type' => 'string', + 'id' => 'string', + 'metadata' => 'Object', + 'title' => 'string', + 'universal_content_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessagingFeatureReviewFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessagingFeatureReviewFields.php new file mode 100644 index 00000000..7624266d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessagingFeatureReviewFields.php @@ -0,0 +1,49 @@ + 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerDestinationPageWelcomeMessageFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerDestinationPageWelcomeMessageFields.php new file mode 100644 index 00000000..f53b7d1a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerDestinationPageWelcomeMessageFields.php @@ -0,0 +1,57 @@ + 'string', + 'page_welcome_message_body' => 'string', + 'page_welcome_message_type' => 'string', + 'template_name' => 'string', + 'time_created' => 'datetime', + 'time_last_used' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerProfileFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerProfileFields.php new file mode 100644 index 00000000..feb8d061 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MessengerProfileFields.php @@ -0,0 +1,61 @@ + 'string', + 'get_started' => 'Object', + 'greeting' => 'list', + 'ice_breakers' => 'list', + 'payment_settings' => 'Object', + 'persistent_menu' => 'list', + 'target_audience' => 'Object', + 'whitelisted_domains' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MinimumBudgetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MinimumBudgetFields.php new file mode 100644 index 00000000..e9752faa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MinimumBudgetFields.php @@ -0,0 +1,55 @@ + 'string', + 'min_daily_budget_high_freq' => 'int', + 'min_daily_budget_imp' => 'int', + 'min_daily_budget_low_freq' => 'int', + 'min_daily_budget_video_views' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MusicVideoCopyrightFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MusicVideoCopyrightFields.php new file mode 100644 index 00000000..6002ddc7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/MusicVideoCopyrightFields.php @@ -0,0 +1,73 @@ + 'datetime', + 'displayed_matches_count' => 'int', + 'id' => 'string', + 'in_conflict' => 'bool', + 'isrc' => 'string', + 'match_rule' => 'VideoCopyrightRule', + 'ownership_countries' => 'list', + 'reference_file_status' => 'string', + 'ridge_monitoring_status' => 'string', + 'tags' => 'list', + 'update_time' => 'datetime', + 'video_asset' => 'CopyrightReferenceContainer', + 'whitelisted_fb_users' => 'list', + 'whitelisted_ig_users' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferDiscountFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferDiscountFields.php new file mode 100644 index 00000000..7df47998 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferDiscountFields.php @@ -0,0 +1,57 @@ + 'string', + 'override' => 'string', + 'text' => 'string', + 'type' => 'string', + 'value1' => 'float', + 'value2' => 'float', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferFields.php new file mode 100644 index 00000000..c0fc03f7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferFields.php @@ -0,0 +1,97 @@ + 'string', + 'barcode_photo_uri' => 'string', + 'barcode_type' => 'string', + 'barcode_value' => 'string', + 'block_reshares' => 'bool', + 'details' => 'string', + 'disable_location' => 'bool', + 'discounts' => 'list', + 'expiration_time' => 'datetime', + 'id' => 'string', + 'instore_code' => 'string', + 'location_type' => 'string', + 'max_save_count' => 'int', + 'online_code' => 'string', + 'page' => 'Page', + 'page_set_id' => 'string', + 'redemption_code' => 'string', + 'redemption_link' => 'string', + 'save_count' => 'int', + 'terms' => 'string', + 'title' => 'string', + 'total_unique_codes' => 'string', + 'unique_codes' => 'string', + 'unique_codes_file_code_type' => 'string', + 'unique_codes_file_name' => 'string', + 'unique_codes_file_upload_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferViewFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferViewFields.php new file mode 100644 index 00000000..4da740dd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NativeOfferViewFields.php @@ -0,0 +1,51 @@ + 'string', + 'offer' => 'NativeOffer', + 'save_count' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NullNodeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NullNodeFields.php new file mode 100644 index 00000000..f368c60b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/NullNodeFields.php @@ -0,0 +1,45 @@ + 'Business', + 'config' => 'string', + 'creation_time' => 'datetime', + 'description' => 'string', + 'duplicate_entries' => 'int', + 'enable_auto_assign_to_accounts' => 'bool', + 'event_stats' => 'string', + 'event_time_max' => 'int', + 'event_time_min' => 'int', + 'id' => 'string', + 'is_mta_use' => 'bool', + 'is_restricted_use' => 'bool', + 'is_unavailable' => 'bool', + 'last_upload_app' => 'string', + 'last_upload_app_changed_time' => 'int', + 'match_rate_approx' => 'int', + 'matched_entries' => 'int', + 'name' => 'string', + 'usage' => 'Object', + 'valid_entries' => 'int', + 'auto_assign_to_new_accounts_only' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OfflineTermsOfServiceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OfflineTermsOfServiceFields.php new file mode 100644 index 00000000..3c2792b4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OfflineTermsOfServiceFields.php @@ -0,0 +1,51 @@ + 'int', + 'id' => 'string', + 'signed_by_user' => 'User', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OffsitePixelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OffsitePixelFields.php new file mode 100644 index 00000000..a8f76663 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OffsitePixelFields.php @@ -0,0 +1,57 @@ + 'string', + 'id' => 'string', + 'js_pixel' => 'string', + 'last_firing_time' => 'datetime', + 'name' => 'string', + 'tag' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OpenGraphContextFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OpenGraphContextFields.php new file mode 100644 index 00000000..e5c3180d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OpenGraphContextFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OracleTransactionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OracleTransactionFields.php new file mode 100644 index 00000000..596246d0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OracleTransactionFields.php @@ -0,0 +1,81 @@ + 'list', + 'amount' => 'string', + 'amount_due' => 'CurrencyAmount', + 'billed_amount_details' => 'BilledAmountDetails', + 'billing_period' => 'string', + 'cdn_download_uri' => 'string', + 'currency' => 'string', + 'download_uri' => 'string', + 'due_date' => 'datetime', + 'entity' => 'string', + 'id' => 'string', + 'invoice_date' => 'datetime', + 'invoice_id' => 'string', + 'invoice_type' => 'string', + 'liability_type' => 'string', + 'payment_status' => 'string', + 'payment_term' => 'string', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OutcomePredictionPointFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OutcomePredictionPointFields.php new file mode 100644 index 00000000..f8f082f1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/OutcomePredictionPointFields.php @@ -0,0 +1,53 @@ + 'float', + 'impressions' => 'float', + 'reach' => 'float', + 'spend' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageAdminNoteFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageAdminNoteFields.php new file mode 100644 index 00000000..fdf4aeb4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageAdminNoteFields.php @@ -0,0 +1,55 @@ + 'string', + 'from' => 'Page', + 'id' => 'string', + 'note_label' => 'string', + 'user' => 'User', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCallToActionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCallToActionFields.php new file mode 100644 index 00000000..6af8e0ec --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCallToActionFields.php @@ -0,0 +1,83 @@ + 'Application', + 'android_deeplink' => 'string', + 'android_destination_type' => 'string', + 'android_package_name' => 'string', + 'android_url' => 'string', + 'created_time' => 'datetime', + 'email_address' => 'string', + 'from' => 'Page', + 'id' => 'string', + 'intl_number_with_plus' => 'string', + 'iphone_app' => 'Application', + 'iphone_deeplink' => 'string', + 'iphone_destination_type' => 'string', + 'iphone_url' => 'string', + 'status' => 'string', + 'type' => 'string', + 'updated_time' => 'datetime', + 'web_destination_type' => 'string', + 'web_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCategoryFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCategoryFields.php new file mode 100644 index 00000000..e0d77a12 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageCategoryFields.php @@ -0,0 +1,53 @@ + 'string', + 'fb_page_categories' => 'list', + 'id' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageChangeProposalFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageChangeProposalFields.php new file mode 100644 index 00000000..554ee40b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageChangeProposalFields.php @@ -0,0 +1,57 @@ + 'string', + 'category' => 'string', + 'current_value' => 'string', + 'id' => 'string', + 'proposed_value' => 'string', + 'upcoming_change_info' => 'PageUpcomingChange', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageFields.php new file mode 100644 index 00000000..8d431878 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageFields.php @@ -0,0 +1,329 @@ + 'string', + 'access_token' => 'string', + 'ad_campaign' => 'AdSet', + 'affiliation' => 'string', + 'app_id' => 'string', + 'artists_we_like' => 'string', + 'attire' => 'string', + 'awards' => 'string', + 'band_interests' => 'string', + 'band_members' => 'string', + 'best_page' => 'Page', + 'bio' => 'string', + 'birthday' => 'string', + 'booking_agent' => 'string', + 'built' => 'string', + 'business' => 'Object', + 'can_checkin' => 'bool', + 'can_post' => 'bool', + 'category' => 'string', + 'category_list' => 'list', + 'checkins' => 'unsigned int', + 'company_overview' => 'string', + 'connected_instagram_account' => 'IGUser', + 'connected_page_backed_instagram_account' => 'IGUser', + 'contact_address' => 'MailingAddress', + 'copyright_whitelisted_ig_partners' => 'list', + 'country_page_likes' => 'unsigned int', + 'cover' => 'CoverPhoto', + 'culinary_team' => 'string', + 'current_location' => 'string', + 'delivery_and_pickup_option_info' => 'list', + 'description' => 'string', + 'description_html' => 'string', + 'differently_open_offerings' => 'map', + 'directed_by' => 'string', + 'display_subtext' => 'string', + 'displayed_message_response_time' => 'string', + 'emails' => 'list', + 'engagement' => 'Engagement', + 'fan_count' => 'unsigned int', + 'featured_video' => 'AdVideo', + 'features' => 'string', + 'food_styles' => 'list', + 'founded' => 'string', + 'general_info' => 'string', + 'general_manager' => 'string', + 'genre' => 'string', + 'global_brand_page_name' => 'string', + 'global_brand_root_id' => 'string', + 'has_added_app' => 'bool', + 'has_whatsapp_business_number' => 'bool', + 'has_whatsapp_number' => 'bool', + 'hometown' => 'string', + 'hours' => 'map', + 'id' => 'string', + 'impressum' => 'string', + 'influences' => 'string', + 'instagram_business_account' => 'IGUser', + 'instant_articles_review_status' => 'string', + 'is_always_open' => 'bool', + 'is_chain' => 'bool', + 'is_community_page' => 'bool', + 'is_eligible_for_branded_content' => 'bool', + 'is_messenger_bot_get_started_enabled' => 'bool', + 'is_messenger_platform_bot' => 'bool', + 'is_owned' => 'bool', + 'is_permanently_closed' => 'bool', + 'is_published' => 'bool', + 'is_unclaimed' => 'bool', + 'is_verified' => 'bool', + 'is_webhooks_subscribed' => 'bool', + 'keywords' => 'Object', + 'leadgen_tos_acceptance_time' => 'datetime', + 'leadgen_tos_accepted' => 'bool', + 'leadgen_tos_accepting_user' => 'User', + 'link' => 'string', + 'location' => 'Location', + 'members' => 'string', + 'merchant_id' => 'string', + 'merchant_review_status' => 'string', + 'messenger_ads_default_icebreakers' => 'list', + 'messenger_ads_default_page_welcome_message' => 'MessengerDestinationPageWelcomeMessage', + 'messenger_ads_default_quick_replies' => 'list', + 'messenger_ads_quick_replies_type' => 'string', + 'mission' => 'string', + 'mpg' => 'string', + 'name' => 'string', + 'name_with_location_descriptor' => 'string', + 'network' => 'string', + 'new_like_count' => 'unsigned int', + 'offer_eligible' => 'bool', + 'overall_star_rating' => 'float', + 'page_token' => 'string', + 'parent_page' => 'Page', + 'parking' => 'PageParking', + 'payment_options' => 'PagePaymentOptions', + 'personal_info' => 'string', + 'personal_interests' => 'string', + 'pharma_safety_info' => 'string', + 'phone' => 'string', + 'pickup_options' => 'list', + 'place_type' => 'string', + 'plot_outline' => 'string', + 'preferred_audience' => 'Targeting', + 'press_contact' => 'string', + 'price_range' => 'string', + 'privacy_info_url' => 'string', + 'produced_by' => 'string', + 'products' => 'string', + 'promotion_eligible' => 'bool', + 'promotion_ineligible_reason' => 'string', + 'public_transit' => 'string', + 'rating_count' => 'unsigned int', + 'recipient' => 'string', + 'record_label' => 'string', + 'release_date' => 'string', + 'restaurant_services' => 'PageRestaurantServices', + 'restaurant_specialties' => 'PageRestaurantSpecialties', + 'schedule' => 'string', + 'screenplay_by' => 'string', + 'season' => 'string', + 'single_line_address' => 'string', + 'starring' => 'string', + 'start_info' => 'PageStartInfo', + 'store_code' => 'string', + 'store_location_descriptor' => 'string', + 'store_number' => 'unsigned int', + 'studio' => 'string', + 'supports_donate_button_in_live_video' => 'bool', + 'supports_instant_articles' => 'bool', + 'talking_about_count' => 'unsigned int', + 'temporary_status' => 'string', + 'unread_message_count' => 'unsigned int', + 'unread_notif_count' => 'unsigned int', + 'unseen_message_count' => 'unsigned int', + 'username' => 'string', + 'verification_status' => 'string', + 'voip_info' => 'VoipInfo', + 'website' => 'string', + 'were_here_count' => 'unsigned int', + 'whatsapp_number' => 'string', + 'written_by' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageParkingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageParkingFields.php new file mode 100644 index 00000000..58c777c3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageParkingFields.php @@ -0,0 +1,51 @@ + 'unsigned int', + 'street' => 'unsigned int', + 'valet' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePaymentOptionsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePaymentOptionsFields.php new file mode 100644 index 00000000..6d31ea4e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePaymentOptionsFields.php @@ -0,0 +1,55 @@ + 'unsigned int', + 'cash_only' => 'unsigned int', + 'discover' => 'unsigned int', + 'mastercard' => 'unsigned int', + 'visa' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePostFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePostFields.php new file mode 100644 index 00000000..9ccec88a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PagePostFields.php @@ -0,0 +1,175 @@ + 'list', + 'admin_creator' => 'Object', + 'allowed_advertising_objectives' => 'list', + 'application' => 'Application', + 'backdated_time' => 'datetime', + 'call_to_action' => 'Object', + 'can_reply_privately' => 'bool', + 'child_attachments' => 'list', + 'comments_mirroring_domain' => 'string', + 'coordinates' => 'Object', + 'created_time' => 'datetime', + 'delivery_growth_optimizations' => 'list', + 'entities' => 'Object', + 'event' => 'Event', + 'expanded_height' => 'unsigned int', + 'expanded_width' => 'unsigned int', + 'feed_targeting' => 'Object', + 'formatting' => 'string', + 'from' => 'Object', + 'full_picture' => 'string', + 'height' => 'unsigned int', + 'icon' => 'string', + 'id' => 'string', + 'implicit_place' => 'Place', + 'instagram_eligibility' => 'string', + 'instream_eligibility' => 'string', + 'is_app_share' => 'bool', + 'is_eligible_for_promotion' => 'bool', + 'is_expired' => 'bool', + 'is_hidden' => 'bool', + 'is_inline_created' => 'bool', + 'is_instagram_eligible' => 'bool', + 'is_popular' => 'bool', + 'is_published' => 'bool', + 'is_spherical' => 'bool', + 'live_video_eligibility' => 'list', + 'message' => 'string', + 'message_tags' => 'list', + 'multi_share_end_card' => 'bool', + 'multi_share_optimized' => 'bool', + 'parent_id' => 'string', + 'permalink_url' => 'Object', + 'picture' => 'string', + 'place' => 'Place', + 'poll' => 'Object', + 'privacy' => 'Privacy', + 'promotable_id' => 'string', + 'promotion_status' => 'string', + 'properties' => 'list', + 'publishing_stats' => 'unsigned int', + 'scheduled_publish_time' => 'float', + 'shares' => 'Object', + 'status_type' => 'string', + 'story' => 'string', + 'story_tags' => 'list', + 'subscribed' => 'bool', + 'target' => 'Profile', + 'targeting' => 'Object', + 'timeline_visibility' => 'string', + 'translations' => 'map', + 'updated_time' => 'datetime', + 'via' => 'Object', + 'video_buying_eligibility' => 'list', + 'width' => 'unsigned int', + 'will_be_autocropped_when_deliver_to_instagram' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantServicesFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantServicesFields.php new file mode 100644 index 00000000..ee4759c9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantServicesFields.php @@ -0,0 +1,65 @@ + 'bool', + 'delivery' => 'bool', + 'groups' => 'bool', + 'kids' => 'bool', + 'outdoor' => 'bool', + 'pickup' => 'bool', + 'reserve' => 'bool', + 'takeout' => 'bool', + 'waiter' => 'bool', + 'walkins' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantSpecialtiesFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantSpecialtiesFields.php new file mode 100644 index 00000000..b8df67b4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageRestaurantSpecialtiesFields.php @@ -0,0 +1,55 @@ + 'unsigned int', + 'coffee' => 'unsigned int', + 'dinner' => 'unsigned int', + 'drinks' => 'unsigned int', + 'lunch' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSavedFilterFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSavedFilterFields.php new file mode 100644 index 00000000..79768892 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSavedFilterFields.php @@ -0,0 +1,59 @@ + 'string', + 'filters' => 'list', + 'id' => 'string', + 'page_id' => 'string', + 'section' => 'string', + 'time_created' => 'int', + 'time_updated' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSettingsFields.php new file mode 100644 index 00000000..83364762 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageSettingsFields.php @@ -0,0 +1,49 @@ + 'string', + 'value' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageStartInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageStartInfoFields.php new file mode 100644 index 00000000..e367afe4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageStartInfoFields.php @@ -0,0 +1,49 @@ + 'Object', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageThreadOwnerFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageThreadOwnerFields.php new file mode 100644 index 00000000..d10bc51a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageThreadOwnerFields.php @@ -0,0 +1,47 @@ + 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUpcomingChangeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUpcomingChangeFields.php new file mode 100644 index 00000000..c9ec933d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUpcomingChangeFields.php @@ -0,0 +1,57 @@ + 'string', + 'effective_time' => 'datetime', + 'id' => 'string', + 'page' => 'Page', + 'proposal' => 'PageChangeProposal', + 'timer_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUserMessageThreadLabelFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUserMessageThreadLabelFields.php new file mode 100644 index 00000000..aa6a1d67 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PageUserMessageThreadLabelFields.php @@ -0,0 +1,49 @@ + 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PartnerStudyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PartnerStudyFields.php new file mode 100644 index 00000000..dc4dbb1f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PartnerStudyFields.php @@ -0,0 +1,81 @@ + 'string', + 'brand' => 'string', + 'client_name' => 'string', + 'emails' => 'string', + 'id' => 'string', + 'input_ids' => 'list', + 'is_export' => 'bool', + 'lift_study' => 'AdStudy', + 'location' => 'string', + 'match_file_ds' => 'string', + 'name' => 'string', + 'partner_defined_id' => 'string', + 'partner_household_graph_dataset_id' => 'string', + 'status' => 'string', + 'study_end_date' => 'datetime', + 'study_start_date' => 'datetime', + 'study_type' => 'string', + 'submit_date' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentPricepointsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentPricepointsFields.php new file mode 100644 index 00000000..cc273e63 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentPricepointsFields.php @@ -0,0 +1,47 @@ + 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentSubscriptionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentSubscriptionFields.php new file mode 100644 index 00000000..5c224b5d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PaymentSubscriptionFields.php @@ -0,0 +1,93 @@ + 'string', + 'app_param_data' => 'string', + 'application' => 'Profile', + 'billing_period' => 'string', + 'canceled_reason' => 'string', + 'created_time' => 'datetime', + 'currency' => 'string', + 'id' => 'string', + 'last_payment' => 'string', + 'next_bill_time' => 'datetime', + 'next_period_amount' => 'string', + 'next_period_currency' => 'string', + 'next_period_product' => 'string', + 'payment_status' => 'string', + 'pending_cancel' => 'bool', + 'period_start_time' => 'datetime', + 'product' => 'string', + 'status' => 'string', + 'test' => 'unsigned int', + 'trial_amount' => 'string', + 'trial_currency' => 'string', + 'trial_expiry_time' => 'datetime', + 'updated_time' => 'datetime', + 'user' => 'Profile', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PermissionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PermissionFields.php new file mode 100644 index 00000000..f79377e5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PermissionFields.php @@ -0,0 +1,49 @@ + 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PersonaFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PersonaFields.php new file mode 100644 index 00000000..225e3e9c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PersonaFields.php @@ -0,0 +1,51 @@ + 'string', + 'name' => 'string', + 'profile_picture_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PhotoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PhotoFields.php new file mode 100644 index 00000000..bab558a5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PhotoFields.php @@ -0,0 +1,99 @@ + 'Album', + 'alt_text' => 'string', + 'alt_text_custom' => 'string', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'string', + 'can_backdate' => 'bool', + 'can_delete' => 'bool', + 'can_tag' => 'bool', + 'created_time' => 'datetime', + 'event' => 'Event', + 'from' => 'Object', + 'height' => 'unsigned int', + 'icon' => 'string', + 'id' => 'string', + 'images' => 'list', + 'link' => 'string', + 'name' => 'string', + 'name_tags' => 'list', + 'page_story_id' => 'string', + 'picture' => 'string', + 'place' => 'Place', + 'position' => 'unsigned int', + 'source' => 'string', + 'target' => 'Profile', + 'updated_time' => 'datetime', + 'webp_images' => 'list', + 'width' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceFields.php new file mode 100644 index 00000000..23830e3c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceFields.php @@ -0,0 +1,53 @@ + 'string', + 'location' => 'Location', + 'name' => 'string', + 'overall_rating' => 'float', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceTopicFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceTopicFields.php new file mode 100644 index 00000000..a13cc8bf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlaceTopicFields.php @@ -0,0 +1,61 @@ + 'unsigned int', + 'has_children' => 'bool', + 'icon_url' => 'string', + 'id' => 'string', + 'name' => 'string', + 'parent_ids' => 'list', + 'plural_name' => 'string', + 'top_subtopic_names' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlatformImageSourceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlatformImageSourceFields.php new file mode 100644 index 00000000..d33105ae --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlatformImageSourceFields.php @@ -0,0 +1,51 @@ + 'unsigned int', + 'source' => 'string', + 'width' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlayableContentFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlayableContentFields.php new file mode 100644 index 00000000..eaf5ef62 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PlayableContentFields.php @@ -0,0 +1,61 @@ + 'string', + 'name' => 'string', + 'owner' => 'Profile', + 'app_id' => 'string', + 'session_id' => 'string', + 'source' => 'file', + 'source_url' => 'string', + 'source_zip' => 'file', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PostFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PostFields.php new file mode 100644 index 00000000..3529e428 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PostFields.php @@ -0,0 +1,189 @@ + 'list', + 'admin_creator' => 'Object', + 'allowed_advertising_objectives' => 'list', + 'application' => 'Application', + 'backdated_time' => 'datetime', + 'call_to_action' => 'Object', + 'can_reply_privately' => 'bool', + 'caption' => 'string', + 'child_attachments' => 'list', + 'comments_mirroring_domain' => 'string', + 'coordinates' => 'Object', + 'created_time' => 'datetime', + 'delivery_growth_optimizations' => 'list', + 'description' => 'string', + 'entities' => 'Object', + 'event' => 'Event', + 'expanded_height' => 'unsigned int', + 'expanded_width' => 'unsigned int', + 'feed_targeting' => 'Object', + 'formatting' => 'string', + 'from' => 'Object', + 'full_picture' => 'string', + 'height' => 'unsigned int', + 'icon' => 'string', + 'id' => 'string', + 'implicit_place' => 'Place', + 'instagram_eligibility' => 'string', + 'instream_eligibility' => 'string', + 'is_app_share' => 'bool', + 'is_eligible_for_promotion' => 'bool', + 'is_expired' => 'bool', + 'is_hidden' => 'bool', + 'is_inline_created' => 'bool', + 'is_instagram_eligible' => 'bool', + 'is_popular' => 'bool', + 'is_published' => 'bool', + 'is_spherical' => 'bool', + 'link' => 'string', + 'live_video_eligibility' => 'list', + 'message' => 'string', + 'message_tags' => 'list', + 'multi_share_end_card' => 'bool', + 'multi_share_optimized' => 'bool', + 'name' => 'string', + 'object_id' => 'string', + 'parent_id' => 'string', + 'permalink_url' => 'Object', + 'picture' => 'string', + 'place' => 'Place', + 'poll' => 'Object', + 'privacy' => 'Privacy', + 'promotable_id' => 'string', + 'promotion_status' => 'string', + 'properties' => 'list', + 'publishing_stats' => 'unsigned int', + 'scheduled_publish_time' => 'float', + 'shares' => 'Object', + 'source' => 'string', + 'status_type' => 'string', + 'story' => 'string', + 'story_tags' => 'list', + 'subscribed' => 'bool', + 'target' => 'Profile', + 'targeting' => 'Object', + 'timeline_visibility' => 'string', + 'translations' => 'map', + 'type' => 'string', + 'updated_time' => 'datetime', + 'via' => 'Object', + 'video_buying_eligibility' => 'list', + 'width' => 'unsigned int', + 'will_be_autocropped_when_deliver_to_instagram' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PrivacyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PrivacyFields.php new file mode 100644 index 00000000..5f78e771 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PrivacyFields.php @@ -0,0 +1,57 @@ + 'string', + 'deny' => 'string', + 'description' => 'string', + 'friends' => 'string', + 'networks' => 'string', + 'value' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductAudienceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductAudienceFields.php new file mode 100644 index 00000000..3e63e05e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductAudienceFields.php @@ -0,0 +1,41 @@ + 'string', + 'description' => 'string', + 'destination_uri' => 'string', + 'image_url' => 'string', + 'name' => 'string', + 'num_items' => 'int', + 'tokens' => 'map', + 'data' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogFields.php new file mode 100644 index 00000000..e78f555a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogFields.php @@ -0,0 +1,79 @@ + 'Business', + 'commerce_merchant_settings' => 'CommerceMerchantSettings', + 'da_display_settings' => 'ProductCatalogImageSettings', + 'default_image_url' => 'string', + 'fallback_image_url' => 'list', + 'feed_count' => 'int', + 'id' => 'string', + 'is_catalog_segment' => 'bool', + 'name' => 'string', + 'product_count' => 'int', + 'store_catalog_settings' => 'StoreCatalogSettings', + 'vertical' => 'string', + 'catalog_segment_filter' => 'Object', + 'catalog_segment_product_set_id' => 'string', + 'destination_catalog_settings' => 'map', + 'flight_catalog_settings' => 'map', + 'parent_catalog_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogHotelRoomsBatchFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogHotelRoomsBatchFields.php new file mode 100644 index 00000000..7a14efb1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogHotelRoomsBatchFields.php @@ -0,0 +1,53 @@ + 'list', + 'errors_total_count' => 'int', + 'handle' => 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsFields.php new file mode 100644 index 00000000..a231db3d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsFields.php @@ -0,0 +1,49 @@ + 'ProductCatalogImageSettingsOperation', + 'single_ad' => 'ProductCatalogImageSettingsOperation', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsOperationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsOperationFields.php new file mode 100644 index 00000000..7f8e2ed1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogImageSettingsOperationFields.php @@ -0,0 +1,47 @@ + 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogPricingVariablesBatchFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogPricingVariablesBatchFields.php new file mode 100644 index 00000000..422019a7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogPricingVariablesBatchFields.php @@ -0,0 +1,53 @@ + 'list', + 'errors_total_count' => 'int', + 'handle' => 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogProductSetsBatchFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogProductSetsBatchFields.php new file mode 100644 index 00000000..3a0b5a3e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductCatalogProductSetsBatchFields.php @@ -0,0 +1,53 @@ + 'list', + 'errors_total_count' => 'int', + 'handle' => 'string', + 'status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductEventStatFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductEventStatFields.php new file mode 100644 index 00000000..2475aebb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductEventStatFields.php @@ -0,0 +1,67 @@ + 'string', + 'date_stop' => 'string', + 'device_type' => 'DeviceType', + 'event' => 'Event', + 'event_source' => 'ExternalEventSource', + 'total_content_ids_matched_other_catalogs' => 'int', + 'total_matched_content_ids' => 'int', + 'total_unmatched_content_ids' => 'int', + 'unique_content_ids_matched_other_catalogs' => 'int', + 'unique_matched_content_ids' => 'int', + 'unique_unmatched_content_ids' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedFields.php new file mode 100644 index 00000000..d22dd973 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedFields.php @@ -0,0 +1,87 @@ + 'string', + 'created_time' => 'datetime', + 'default_currency' => 'string', + 'deletion_enabled' => 'bool', + 'delimiter' => 'Delimiter', + 'encoding' => 'string', + 'file_name' => 'string', + 'id' => 'string', + 'item_sub_type' => 'string', + 'latest_upload' => 'ProductFeedUpload', + 'migrated_from_feed_id' => 'string', + 'name' => 'string', + 'override_type' => 'string', + 'product_count' => 'int', + 'quoted_fields_mode' => 'QuotedFieldsMode', + 'schedule' => 'ProductFeedSchedule', + 'update_schedule' => 'ProductFeedSchedule', + 'feed_type' => 'FeedType', + 'override_value' => 'string', + 'rules' => 'list', + 'whitelisted_properties' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedMissingFeedItemReplacementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedMissingFeedItemReplacementFields.php new file mode 100644 index 00000000..d133c0a2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedMissingFeedItemReplacementFields.php @@ -0,0 +1,53 @@ + 'Object', + 'product_item' => 'Object', + 'store_product_item' => 'Object', + 'vehicle' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleFields.php new file mode 100644 index 00000000..6db83708 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleFields.php @@ -0,0 +1,53 @@ + 'string', + 'id' => 'string', + 'params' => 'map', + 'rule_type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleSuggestionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleSuggestionFields.php new file mode 100644 index 00000000..990ae256 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedRuleSuggestionFields.php @@ -0,0 +1,51 @@ + 'string', + 'params' => 'map', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedScheduleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedScheduleFields.php new file mode 100644 index 00000000..afb6a167 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedScheduleFields.php @@ -0,0 +1,65 @@ + 'unsigned int', + 'day_of_week' => 'DayOfWeek', + 'hour' => 'unsigned int', + 'id' => 'string', + 'interval' => 'Interval', + 'interval_count' => 'unsigned int', + 'minute' => 'unsigned int', + 'timezone' => 'string', + 'url' => 'string', + 'username' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadDiagnosticsReportFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadDiagnosticsReportFields.php new file mode 100644 index 00000000..d9eb455e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadDiagnosticsReportFields.php @@ -0,0 +1,49 @@ + 'string', + 'report_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorFields.php new file mode 100644 index 00000000..3a387b21 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorFields.php @@ -0,0 +1,59 @@ + 'list', + 'description' => 'string', + 'error_type' => 'string', + 'id' => 'string', + 'severity' => 'Severity', + 'summary' => 'string', + 'total_count' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorReportFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorReportFields.php new file mode 100644 index 00000000..748fcb58 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorReportFields.php @@ -0,0 +1,49 @@ + 'string', + 'report_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorSampleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorSampleFields.php new file mode 100644 index 00000000..7668e18a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadErrorSampleFields.php @@ -0,0 +1,51 @@ + 'string', + 'retailer_id' => 'string', + 'row_number' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadFields.php new file mode 100644 index 00000000..d755cab6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductFeedUploadFields.php @@ -0,0 +1,71 @@ + 'datetime', + 'error_count' => 'int', + 'error_report' => 'ProductFeedUploadErrorReport', + 'filename' => 'string', + 'id' => 'string', + 'input_method' => 'InputMethod', + 'num_deleted_items' => 'int', + 'num_detected_items' => 'int', + 'num_invalid_items' => 'int', + 'num_persisted_items' => 'int', + 'start_time' => 'datetime', + 'url' => 'string', + 'warning_count' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductGroupFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductGroupFields.php new file mode 100644 index 00000000..8de0dd85 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductGroupFields.php @@ -0,0 +1,53 @@ + 'string', + 'product_catalog' => 'ProductCatalog', + 'retailer_id' => 'string', + 'variants' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemCommerceInsightsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemCommerceInsightsFields.php new file mode 100644 index 00000000..9beb559d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemCommerceInsightsFields.php @@ -0,0 +1,51 @@ + 'unsigned int', + 'organic_impressions' => 'unsigned int', + 'paid_impressions' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemFields.php new file mode 100644 index 00000000..7e487be1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductItemFields.php @@ -0,0 +1,205 @@ + 'list>', + 'additional_image_urls' => 'list', + 'additional_variant_attributes' => 'map', + 'age_group' => 'AgeGroup', + 'applinks' => 'CatalogItemAppLinks', + 'availability' => 'Availability', + 'brand' => 'string', + 'capability_to_review_status' => 'map', + 'category' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'color' => 'string', + 'commerce_insights' => 'ProductItemCommerceInsights', + 'condition' => 'Condition', + 'currency' => 'string', + 'custom_data' => 'map', + 'custom_label_0' => 'string', + 'custom_label_1' => 'string', + 'custom_label_2' => 'string', + 'custom_label_3' => 'string', + 'custom_label_4' => 'string', + 'description' => 'string', + 'expiration_date' => 'string', + 'fb_product_category' => 'string', + 'gender' => 'Gender', + 'gtin' => 'string', + 'id' => 'string', + 'image_cdn_urls' => 'map', + 'image_url' => 'string', + 'images' => 'list', + 'inventory' => 'int', + 'manufacturer_part_number' => 'string', + 'material' => 'string', + 'mobile_link' => 'string', + 'name' => 'string', + 'ordering_index' => 'int', + 'pattern' => 'string', + 'price' => 'string', + 'product_catalog' => 'ProductCatalog', + 'product_feed' => 'ProductFeed', + 'product_group' => 'ProductGroup', + 'product_type' => 'string', + 'retailer_id' => 'string', + 'retailer_product_group_id' => 'string', + 'review_rejection_reasons' => 'list', + 'review_status' => 'ReviewStatus', + 'sale_price' => 'string', + 'sale_price_end_date' => 'string', + 'sale_price_start_date' => 'string', + 'shipping_weight_unit' => 'ShippingWeightUnit', + 'shipping_weight_value' => 'float', + 'short_description' => 'string', + 'size' => 'string', + 'start_date' => 'string', + 'url' => 'string', + 'visibility' => 'Visibility', + 'additional_image_files' => 'list', + 'additional_uploaded_image_ids' => 'list', + 'android_app_name' => 'string', + 'android_class' => 'string', + 'android_package' => 'string', + 'android_url' => 'string', + 'checkout_url' => 'string', + 'commerce_tax_category' => 'CommerceTaxCategory', + 'ios_app_name' => 'string', + 'ios_app_store_id' => 'unsigned int', + 'ios_url' => 'string', + 'ipad_app_name' => 'string', + 'ipad_app_store_id' => 'unsigned int', + 'ipad_url' => 'string', + 'iphone_app_name' => 'string', + 'iphone_app_store_id' => 'unsigned int', + 'iphone_url' => 'string', + 'launch_date' => 'string', + 'offer_price_amount' => 'unsigned int', + 'offer_price_end_date' => 'datetime', + 'offer_price_start_date' => 'datetime', + 'return_policy_days' => 'unsigned int', + 'windows_phone_app_id' => 'string', + 'windows_phone_app_name' => 'string', + 'windows_phone_url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetFields.php new file mode 100644 index 00000000..17fabed2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetFields.php @@ -0,0 +1,65 @@ + 'string', + 'filter' => 'string', + 'id' => 'string', + 'latest_metadata' => 'ProductSetMetadata', + 'live_metadata' => 'ProductSetMetadata', + 'name' => 'string', + 'product_catalog' => 'ProductCatalog', + 'product_count' => 'unsigned int', + 'retailer_id' => 'string', + 'metadata' => 'map', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetMetadataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetMetadataFields.php new file mode 100644 index 00000000..baf05c7e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductSetMetadataFields.php @@ -0,0 +1,53 @@ + 'string', + 'description' => 'string', + 'external_url' => 'string', + 'integrity_review_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductVariantFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductVariantFields.php new file mode 100644 index 00000000..bdc9985c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProductVariantFields.php @@ -0,0 +1,51 @@ + 'string', + 'options' => 'list', + 'product_field' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfileFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfileFields.php new file mode 100644 index 00000000..398b7d04 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfileFields.php @@ -0,0 +1,67 @@ + 'bool', + 'id' => 'string', + 'link' => 'string', + 'name' => 'string', + 'pic' => 'string', + 'pic_crop' => 'ProfilePictureSource', + 'pic_large' => 'string', + 'pic_small' => 'string', + 'pic_square' => 'string', + 'profile_type' => 'ProfileType', + 'username' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfilePictureSourceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfilePictureSourceFields.php new file mode 100644 index 00000000..5e70265e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ProfilePictureSourceFields.php @@ -0,0 +1,63 @@ + 'unsigned int', + 'cache_key' => 'string', + 'height' => 'unsigned int', + 'is_silhouette' => 'bool', + 'left' => 'unsigned int', + 'right' => 'unsigned int', + 'top' => 'unsigned int', + 'url' => 'string', + 'width' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PublisherBlockListFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PublisherBlockListFields.php new file mode 100644 index 00000000..10102adc --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/PublisherBlockListFields.php @@ -0,0 +1,65 @@ + 'list', + 'business_owner_id' => 'string', + 'id' => 'string', + 'is_auto_blocking_on' => 'bool', + 'is_eligible_at_campaign_level' => 'bool', + 'last_update_time' => 'datetime', + 'last_update_user' => 'string', + 'name' => 'string', + 'owner_ad_account_id' => 'string', + 'web_publishers' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RTBDynamicPostFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RTBDynamicPostFields.php new file mode 100644 index 00000000..d35e0568 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RTBDynamicPostFields.php @@ -0,0 +1,67 @@ + 'list', + 'created' => 'datetime', + 'description' => 'string', + 'id' => 'string', + 'image_url' => 'string', + 'link' => 'string', + 'message' => 'string', + 'owner_id' => 'string', + 'place_id' => 'string', + 'product_id' => 'string', + 'title' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RawCustomAudienceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RawCustomAudienceFields.php new file mode 100644 index 00000000..30113667 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RawCustomAudienceFields.php @@ -0,0 +1,49 @@ + 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyActivityFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyActivityFields.php new file mode 100644 index 00000000..8d8fadd7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyActivityFields.php @@ -0,0 +1,57 @@ + 'string', + 'campaign_active' => 'bool', + 'campaign_started' => 'bool', + 'creative_uploaded' => 'bool', + 'io_approved' => 'bool', + 'sf_link' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyAdFormatFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyAdFormatFields.php new file mode 100644 index 00000000..65502da5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyAdFormatFields.php @@ -0,0 +1,49 @@ + 'Object', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveLowerConfidenceRangeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveLowerConfidenceRangeFields.php new file mode 100644 index 00000000..817a7630 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveLowerConfidenceRangeFields.php @@ -0,0 +1,57 @@ + 'list', + 'num_points' => 'unsigned int', + 'reach' => 'list', + 'reach_lower' => 'list', + 'uniq_video_views_2s_lower' => 'list', + 'video_views_2s_lower' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveUpperConfidenceRangeFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveUpperConfidenceRangeFields.php new file mode 100644 index 00000000..82ba2e5e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyCurveUpperConfidenceRangeFields.php @@ -0,0 +1,57 @@ + 'list', + 'num_points' => 'unsigned int', + 'reach' => 'list', + 'reach_upper' => 'list', + 'uniq_video_views_2s_upper' => 'list', + 'video_views_2s_upper' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyDayPartFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyDayPartFields.php new file mode 100644 index 00000000..bf545bab --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyDayPartFields.php @@ -0,0 +1,51 @@ + 'list', + 'end_minute' => 'int', + 'start_minute' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesCurveFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesCurveFields.php new file mode 100644 index 00000000..4578195e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesCurveFields.php @@ -0,0 +1,61 @@ + 'list', + 'conversion' => 'list', + 'impression' => 'list', + 'interpolated_reach' => 'float', + 'num_points' => 'unsigned int', + 'raw_impression' => 'list', + 'raw_reach' => 'list', + 'reach' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesPlacementBreakdownFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesPlacementBreakdownFields.php new file mode 100644 index 00000000..01173fd2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyEstimatesPlacementBreakdownFields.php @@ -0,0 +1,69 @@ + 'list', + 'audience_network' => 'list', + 'desktop' => 'list', + 'ig_android' => 'list', + 'ig_ios' => 'list', + 'ig_other' => 'list', + 'ig_story' => 'list', + 'instant_articles' => 'list', + 'instream_videos' => 'list', + 'ios' => 'list', + 'msite' => 'list', + 'suggested_videos' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyPredictionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyPredictionFields.php new file mode 100644 index 00000000..5055803f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencyPredictionFields.php @@ -0,0 +1,239 @@ + 'int', + 'activity_status' => 'ReachFrequencyActivity', + 'ad_formats' => 'list', + 'auction_entry_option_index' => 'int', + 'business_id' => 'int', + 'buying_type' => 'string', + 'campaign_group_id' => 'int', + 'campaign_id' => 'string', + 'campaign_time_start' => 'datetime', + 'campaign_time_stop' => 'datetime', + 'currency' => 'string', + 'curve_budget_reach' => 'ReachFrequencyEstimatesCurve', + 'curve_reach' => 'list', + 'daily_grp_curve' => 'list', + 'daily_impression_curve' => 'list', + 'daily_impression_curve_map' => 'map>', + 'day_parting_schedule' => 'list', + 'destination_id' => 'string', + 'end_time' => 'datetime', + 'expiration_time' => 'datetime', + 'external_budget' => 'int', + 'external_impression' => 'unsigned int', + 'external_maximum_budget' => 'int', + 'external_maximum_impression' => 'string', + 'external_maximum_reach' => 'unsigned int', + 'external_minimum_budget' => 'int', + 'external_minimum_impression' => 'unsigned int', + 'external_minimum_reach' => 'unsigned int', + 'external_reach' => 'unsigned int', + 'feed_ratio_0000' => 'unsigned int', + 'frequency_cap' => 'unsigned int', + 'frequency_distribution_map' => 'map>', + 'frequency_distribution_map_agg' => 'map>', + 'grp_audience_size' => 'float', + 'grp_avg_probability_map' => 'string', + 'grp_country_audience_size' => 'float', + 'grp_curve' => 'list', + 'grp_dmas_audience_size' => 'float', + 'grp_filtering_threshold_00' => 'unsigned int', + 'grp_points' => 'float', + 'grp_ratio' => 'float', + 'grp_reach_ratio' => 'float', + 'grp_status' => 'string', + 'holdout_percentage' => 'unsigned int', + 'id' => 'string', + 'impression_curve' => 'list', + 'instagram_destination_id' => 'string', + 'instream_packages' => 'list', + 'interval_frequency_cap' => 'unsigned int', + 'interval_frequency_cap_reset_period' => 'unsigned int', + 'is_bonus_media' => 'unsigned int', + 'is_conversion_goal' => 'unsigned int', + 'is_higher_average_frequency' => 'bool', + 'is_io' => 'bool', + 'is_reserved_buying' => 'unsigned int', + 'is_trp' => 'bool', + 'name' => 'string', + 'objective' => 'unsigned int', + 'objective_name' => 'string', + 'pause_periods' => 'list', + 'placement_breakdown' => 'ReachFrequencyEstimatesPlacementBreakdown', + 'placement_breakdown_map' => 'map', + 'plan_name' => 'string', + 'plan_type' => 'string', + 'prediction_mode' => 'unsigned int', + 'prediction_progress' => 'unsigned int', + 'reference_id' => 'string', + 'reservation_status' => 'unsigned int', + 'start_time' => 'datetime', + 'status' => 'unsigned int', + 'story_event_type' => 'unsigned int', + 'target_audience_size' => 'unsigned int', + 'target_cpm' => 'unsigned int', + 'target_spec' => 'Targeting', + 'time_created' => 'datetime', + 'time_updated' => 'datetime', + 'timezone_id' => 'unsigned int', + 'timezone_name' => 'string', + 'topline_id' => 'unsigned int', + 'video_view_length_constraint' => 'unsigned int', + 'viewtag' => 'string', + 'action' => 'Action', + 'budget' => 'unsigned int', + 'deal_id' => 'string', + 'destination_ids' => 'list', + 'exceptions' => 'bool', + 'existing_campaign_id' => 'string', + 'grp_buying' => 'bool', + 'impression' => 'unsigned int', + 'is_full_view' => 'bool', + 'is_reach_and_frequency_io_buying' => 'bool', + 'num_curve_points' => 'unsigned int', + 'reach' => 'unsigned int', + 'rf_prediction_id' => 'string', + 'rf_prediction_id_to_release' => 'string', + 'rf_prediction_id_to_share' => 'string', + 'stop_time' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencySpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencySpecFields.php new file mode 100644 index 00000000..0f9a3dfe --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReachFrequencySpecFields.php @@ -0,0 +1,61 @@ + 'list', + 'default_creation_data' => 'Object', + 'global_io_max_campaign_duration' => 'unsigned int', + 'max_campaign_duration' => 'Object', + 'max_days_to_finish' => 'Object', + 'max_pause_without_prediction_rerun' => 'Object', + 'min_campaign_duration' => 'Object', + 'min_reach_limits' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReadOnlyAnalyticsUserPropertyConfigFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReadOnlyAnalyticsUserPropertyConfigFields.php new file mode 100644 index 00000000..ec02d4b4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReadOnlyAnalyticsUserPropertyConfigFields.php @@ -0,0 +1,49 @@ + 'list', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RecommendationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RecommendationFields.php new file mode 100644 index 00000000..33e18fa5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RecommendationFields.php @@ -0,0 +1,61 @@ + 'datetime', + 'has_rating' => 'bool', + 'has_review' => 'bool', + 'open_graph_story' => 'Object', + 'rating' => 'int', + 'recommendation_type' => 'string', + 'review_text' => 'string', + 'reviewer' => 'User', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReferralFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReferralFields.php new file mode 100644 index 00000000..b6f960c0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ReferralFields.php @@ -0,0 +1,71 @@ + 'string', + 'invite_limit' => 'int', + 'messenger_cta' => 'string', + 'messenger_promotion_text' => 'string', + 'namespace' => 'string', + 'need_promo_code' => 'bool', + 'offer_origin' => 'string', + 'privacy_policy_link' => 'string', + 'promotion_text' => 'string', + 'receiver_benefits_text' => 'string', + 'referral_link_uri' => 'string', + 'sender_benefits_text' => 'string', + 'terms_and_condition_link' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RevSharePolicyFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RevSharePolicyFields.php new file mode 100644 index 00000000..39ae4070 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RevSharePolicyFields.php @@ -0,0 +1,49 @@ + 'string', + 'policy_name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RichMediaElementFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RichMediaElementFields.php new file mode 100644 index 00000000..34faad4e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/RichMediaElementFields.php @@ -0,0 +1,51 @@ + 'Object', + 'element_type' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedAudienceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedAudienceFields.php new file mode 100644 index 00000000..40f275df --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedAudienceFields.php @@ -0,0 +1,69 @@ + 'AdAccount', + 'approximate_count' => 'int', + 'description' => 'string', + 'extra_info' => 'string', + 'id' => 'string', + 'name' => 'string', + 'permission_for_actions' => 'AudiencePermissionForActions', + 'run_status' => 'string', + 'sentence_lines' => 'list', + 'targeting' => 'Targeting', + 'time_created' => 'datetime', + 'time_updated' => 'datetime', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedMessageResponseFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedMessageResponseFields.php new file mode 100644 index 00000000..03c773cd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SavedMessageResponseFields.php @@ -0,0 +1,57 @@ + 'string', + 'id' => 'string', + 'image' => 'string', + 'is_enabled' => 'bool', + 'message' => 'string', + 'title' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SecuritySettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SecuritySettingsFields.php new file mode 100644 index 00000000..9b6d1453 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SecuritySettingsFields.php @@ -0,0 +1,45 @@ + 'string', + 'confidences' => 'map', + 'winner_ad_object_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/StoreCatalogSettingsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/StoreCatalogSettingsFields.php new file mode 100644 index 00000000..2ef82623 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/StoreCatalogSettingsFields.php @@ -0,0 +1,49 @@ + 'string', + 'page' => 'Page', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SystemUserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SystemUserFields.php new file mode 100644 index 00000000..011322a0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/SystemUserFields.php @@ -0,0 +1,38 @@ + 'Application', + 'custom_image_url' => 'string', + 'custom_name' => 'string', + 'id' => 'string', + 'image_url' => 'string', + 'is_non_connection_landing_tab' => 'bool', + 'is_permanent' => 'bool', + 'link' => 'string', + 'name' => 'string', + 'position' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingDynamicRuleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingDynamicRuleFields.php new file mode 100644 index 00000000..e3b41ad1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingDynamicRuleFields.php @@ -0,0 +1,61 @@ + 'string', + 'ad_group_id' => 'string', + 'campaign_group_id' => 'string', + 'campaign_id' => 'string', + 'impression_count' => 'string', + 'page_id' => 'string', + 'post' => 'string', + 'retention_seconds' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingFields.php new file mode 100644 index 00000000..a9712cc2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingFields.php @@ -0,0 +1,221 @@ + 'string', + 'age_max' => 'unsigned int', + 'age_min' => 'unsigned int', + 'app_install_state' => 'string', + 'audience_network_positions' => 'list', + 'behaviors' => 'list', + 'brand_safety_content_filter_levels' => 'list', + 'catalog_based_targeting' => 'CatalogBasedTargeting', + 'cities' => 'list', + 'college_years' => 'list', + 'connections' => 'list', + 'contextual_targeting_categories' => 'list', + 'countries' => 'list', + 'country' => 'list', + 'country_groups' => 'list', + 'custom_audiences' => 'list', + 'device_platforms' => 'list', + 'direct_install_devices' => 'bool', + 'dynamic_audience_ids' => 'list', + 'education_majors' => 'list', + 'education_schools' => 'list', + 'education_statuses' => 'list', + 'effective_audience_network_positions' => 'list', + 'effective_device_platforms' => 'list', + 'effective_facebook_positions' => 'list', + 'effective_instagram_positions' => 'list', + 'effective_messenger_positions' => 'list', + 'effective_publisher_platforms' => 'list', + 'engagement_specs' => 'list', + 'ethnic_affinity' => 'list', + 'exclude_reached_since' => 'list', + 'excluded_brand_safety_content_types' => 'list', + 'excluded_connections' => 'list', + 'excluded_custom_audiences' => 'list', + 'excluded_dynamic_audience_ids' => 'list', + 'excluded_engagement_specs' => 'list', + 'excluded_geo_locations' => 'TargetingGeoLocation', + 'excluded_mobile_device_model' => 'list', + 'excluded_product_audience_specs' => 'list', + 'excluded_publisher_categories' => 'list', + 'excluded_publisher_list_ids' => 'list', + 'excluded_user_device' => 'list', + 'exclusions' => 'FlexibleTargeting', + 'facebook_positions' => 'list', + 'family_statuses' => 'list', + 'fb_deal_id' => 'string', + 'flexible_spec' => 'list', + 'friends_of_connections' => 'list', + 'genders' => 'list', + 'generation' => 'list', + 'geo_locations' => 'TargetingGeoLocation', + 'home_ownership' => 'list', + 'home_type' => 'list', + 'home_value' => 'list', + 'household_composition' => 'list', + 'income' => 'list', + 'industries' => 'list', + 'instagram_positions' => 'list', + 'instream_video_skippable_excluded' => 'bool', + 'interested_in' => 'list', + 'interests' => 'list', + 'is_whatsapp_destination_ad' => 'bool', + 'keywords' => 'list', + 'life_events' => 'list', + 'locales' => 'list', + 'messenger_positions' => 'list', + 'moms' => 'list', + 'net_worth' => 'list', + 'office_type' => 'list', + 'place_page_set_ids' => 'list', + 'political_views' => 'list', + 'politics' => 'list', + 'product_audience_specs' => 'list', + 'prospecting_audience' => 'TargetingProspectingAudience', + 'publisher_platforms' => 'list', + 'radius' => 'string', + 'regions' => 'list', + 'relationship_statuses' => 'list', + 'site_category' => 'list', + 'targeting_optimization' => 'string', + 'user_adclusters' => 'list', + 'user_device' => 'list', + 'user_event' => 'list', + 'user_os' => 'list', + 'wireless_carrier' => 'list', + 'work_employers' => 'list', + 'work_positions' => 'list', + 'zips' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCityFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCityFields.php new file mode 100644 index 00000000..66c2ab7e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCityFields.php @@ -0,0 +1,59 @@ + 'string', + 'distance_unit' => 'string', + 'key' => 'string', + 'name' => 'string', + 'radius' => 'unsigned int', + 'region' => 'string', + 'region_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCustomLocationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCustomLocationFields.php new file mode 100644 index 00000000..1ddcf149 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationCustomLocationFields.php @@ -0,0 +1,73 @@ + 'string', + 'country' => 'string', + 'country_group' => 'string', + 'custom_type' => 'string', + 'distance_unit' => 'string', + 'key' => 'string', + 'latitude' => 'float', + 'longitude' => 'float', + 'max_population' => 'int', + 'min_population' => 'int', + 'name' => 'string', + 'primary_city_id' => 'int', + 'radius' => 'float', + 'region_id' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationElectoralDistrictFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationElectoralDistrictFields.php new file mode 100644 index 00000000..9c5e269f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationElectoralDistrictFields.php @@ -0,0 +1,53 @@ + 'string', + 'electoral_district' => 'string', + 'key' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationFields.php new file mode 100644 index 00000000..8d60b5e0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationFields.php @@ -0,0 +1,85 @@ + 'list', + 'countries' => 'list', + 'country_groups' => 'list', + 'custom_locations' => 'list', + 'electoral_districts' => 'list', + 'geo_markets' => 'list', + 'large_geo_areas' => 'list', + 'location_cluster_ids' => 'list', + 'location_expansion' => 'TargetingGeoLocationLocationExpansion', + 'location_types' => 'list', + 'medium_geo_areas' => 'list', + 'metro_areas' => 'list', + 'neighborhoods' => 'list', + 'places' => 'list', + 'political_districts' => 'list', + 'regions' => 'list', + 'small_geo_areas' => 'list', + 'subcities' => 'list', + 'subneighborhoods' => 'list', + 'zips' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationGeoEntitiesFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationGeoEntitiesFields.php new file mode 100644 index 00000000..2f9c1493 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationGeoEntitiesFields.php @@ -0,0 +1,55 @@ + 'string', + 'key' => 'string', + 'name' => 'string', + 'region' => 'string', + 'region_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationClusterFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationClusterFields.php new file mode 100644 index 00000000..f89d2b9a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationClusterFields.php @@ -0,0 +1,47 @@ + 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationExpansionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationExpansionFields.php new file mode 100644 index 00000000..2444f0d7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationLocationExpansionFields.php @@ -0,0 +1,47 @@ + 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationMarketFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationMarketFields.php new file mode 100644 index 00000000..aae48908 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationMarketFields.php @@ -0,0 +1,53 @@ + 'string', + 'key' => 'string', + 'market_type' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPlaceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPlaceFields.php new file mode 100644 index 00000000..535677ce --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPlaceFields.php @@ -0,0 +1,63 @@ + 'string', + 'distance_unit' => 'string', + 'key' => 'string', + 'latitude' => 'float', + 'longitude' => 'float', + 'name' => 'string', + 'primary_city_id' => 'int', + 'radius' => 'float', + 'region_id' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPoliticalDistrictFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPoliticalDistrictFields.php new file mode 100644 index 00000000..e22bb034 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationPoliticalDistrictFields.php @@ -0,0 +1,53 @@ + 'string', + 'key' => 'string', + 'name' => 'string', + 'political_district' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationRegionFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationRegionFields.php new file mode 100644 index 00000000..15cb6e4c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationRegionFields.php @@ -0,0 +1,51 @@ + 'string', + 'key' => 'string', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationZipFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationZipFields.php new file mode 100644 index 00000000..f8cc28de --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingGeoLocationZipFields.php @@ -0,0 +1,55 @@ + 'string', + 'key' => 'string', + 'name' => 'string', + 'primary_city_id' => 'int', + 'region_id' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSpecFields.php new file mode 100644 index 00000000..69b494dc --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSpecFields.php @@ -0,0 +1,51 @@ + 'list', + 'inclusions' => 'list', + 'product_set_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSubSpecFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSubSpecFields.php new file mode 100644 index 00000000..6f2ba1d2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProductAudienceSubSpecFields.php @@ -0,0 +1,49 @@ + 'string', + 'rule' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProspectingAudienceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProspectingAudienceFields.php new file mode 100644 index 00000000..3f5ccacd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingProspectingAudienceFields.php @@ -0,0 +1,47 @@ + 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingRelaxationFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingRelaxationFields.php new file mode 100644 index 00000000..8881a40e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingRelaxationFields.php @@ -0,0 +1,47 @@ + 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingSentenceLineFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingSentenceLineFields.php new file mode 100644 index 00000000..d6502e93 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TargetingSentenceLineFields.php @@ -0,0 +1,51 @@ + 'string', + 'params' => 'Targeting', + 'targetingsentencelines' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ThirdPartyMeasurementReportDatasetFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ThirdPartyMeasurementReportDatasetFields.php new file mode 100644 index 00000000..845c8488 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ThirdPartyMeasurementReportDatasetFields.php @@ -0,0 +1,55 @@ + 'string', + 'id' => 'string', + 'partner' => 'Business', + 'product' => 'string', + 'schema' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TrackingAndConversionWithDefaultsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TrackingAndConversionWithDefaultsFields.php new file mode 100644 index 00000000..59741347 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/TrackingAndConversionWithDefaultsFields.php @@ -0,0 +1,53 @@ + 'list', + 'custom_tracking' => 'list', + 'default_conversion' => 'list', + 'default_tracking' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/URLFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/URLFields.php new file mode 100644 index 00000000..de017113 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/URLFields.php @@ -0,0 +1,59 @@ + 'InstantArticle', + 'engagement' => 'Object', + 'id' => 'string', + 'instant_article' => 'InstantArticle', + 'og_object' => 'Object', + 'ownership_permissions' => 'Object', + 'scopes' => 'Object', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UnifiedThreadFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UnifiedThreadFields.php new file mode 100644 index 00000000..00d35f8c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UnifiedThreadFields.php @@ -0,0 +1,77 @@ + 'bool', + 'former_participants' => 'Object', + 'id' => 'string', + 'is_subscribed' => 'bool', + 'link' => 'string', + 'linked_group' => 'Group', + 'message_count' => 'int', + 'name' => 'string', + 'participants' => 'Object', + 'scoped_thread_key' => 'string', + 'senders' => 'Object', + 'snippet' => 'string', + 'subject' => 'string', + 'unread_count' => 'int', + 'updated_time' => 'datetime', + 'wallpaper' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserCoverPhotoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserCoverPhotoFields.php new file mode 100644 index 00000000..de0c38f1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserCoverPhotoFields.php @@ -0,0 +1,51 @@ + 'float', + 'offset_y' => 'float', + 'source' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserDeviceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserDeviceFields.php new file mode 100644 index 00000000..d35f9458 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserDeviceFields.php @@ -0,0 +1,49 @@ + 'string', + 'os' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserFields.php new file mode 100644 index 00000000..f3fac309 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserFields.php @@ -0,0 +1,161 @@ + 'string', + 'address' => 'Location', + 'admin_notes' => 'list', + 'age_range' => 'AgeRange', + 'auth_method' => 'string', + 'birthday' => 'string', + 'cover' => 'UserCoverPhoto', + 'currency' => 'Currency', + 'devices' => 'list', + 'education' => 'list', + 'email' => 'string', + 'favorite_athletes' => 'list', + 'favorite_teams' => 'list', + 'first_name' => 'string', + 'gender' => 'string', + 'hometown' => 'Page', + 'id' => 'string', + 'inspirational_people' => 'list', + 'install_type' => 'string', + 'installed' => 'bool', + 'interested_in' => 'list', + 'is_guest_user' => 'bool', + 'is_verified' => 'bool', + 'languages' => 'list', + 'last_name' => 'string', + 'link' => 'string', + 'local_news_megaphone_dismiss_status' => 'bool', + 'local_news_subscription_status' => 'bool', + 'locale' => 'string', + 'location' => 'Page', + 'meeting_for' => 'list', + 'messenger_join_notifications_enabled' => 'bool', + 'middle_name' => 'string', + 'name' => 'string', + 'name_format' => 'string', + 'payment_pricepoints' => 'PaymentPricepoints', + 'political' => 'string', + 'profile_pic' => 'string', + 'public_key' => 'string', + 'published_timeline' => 'bool', + 'quotes' => 'string', + 'relationship_status' => 'string', + 'religion' => 'string', + 'shared_login_upgrade_required_by' => 'datetime', + 'short_name' => 'string', + 'significant_other' => 'User', + 'sports' => 'list', + 'supports_donate_button_in_live_video' => 'bool', + 'third_party_id' => 'string', + 'timezone' => 'float', + 'token_for_business' => 'string', + 'updated_time' => 'datetime', + 'user_storage_key' => 'string', + 'username' => 'string', + 'verified' => 'bool', + 'video_upload_limits' => 'VideoUploadLimits', + 'website' => 'string', + 'work' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForAppFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForAppFields.php new file mode 100644 index 00000000..eefb2a12 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForAppFields.php @@ -0,0 +1,49 @@ + 'Application', + 'id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForPageFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForPageFields.php new file mode 100644 index 00000000..8197afdd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserIDForPageFields.php @@ -0,0 +1,49 @@ + 'string', + 'page' => 'Page', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenDisclaimerResponseFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenDisclaimerResponseFields.php new file mode 100644 index 00000000..fb5abdaa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenDisclaimerResponseFields.php @@ -0,0 +1,49 @@ + 'string', + 'is_checked' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenFieldDataFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenFieldDataFields.php new file mode 100644 index 00000000..f4c05175 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserLeadGenFieldDataFields.php @@ -0,0 +1,49 @@ + 'string', + 'values' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMethodsInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMethodsInfoFields.php new file mode 100644 index 00000000..fd3f072f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMethodsInfoFields.php @@ -0,0 +1,59 @@ + 'string', + 'available_card_types' => 'list', + 'available_payment_methods' => 'list', + 'available_payment_methods_details' => 'list', + 'country' => 'string', + 'currency' => 'string', + 'existing_payment_methods' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMobilePricepointsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMobilePricepointsFields.php new file mode 100644 index 00000000..937bb8dd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentMobilePricepointsFields.php @@ -0,0 +1,53 @@ + 'string', + 'phone_number_last4' => 'string', + 'pricepoints' => 'list', + 'user_currency' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentModulesOptionsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentModulesOptionsFields.php new file mode 100644 index 00000000..95131c0c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/UserPaymentModulesOptionsFields.php @@ -0,0 +1,53 @@ + 'string', + 'available_payment_options' => 'list', + 'country' => 'string', + 'currency' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ValueBasedEligibleSourceFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ValueBasedEligibleSourceFields.php new file mode 100644 index 00000000..aac0ba76 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/ValueBasedEligibleSourceFields.php @@ -0,0 +1,51 @@ + 'string', + 'title' => 'string', + 'type' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleFields.php new file mode 100644 index 00000000..a2e12a78 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleFields.php @@ -0,0 +1,135 @@ + 'Object', + 'applinks' => 'CatalogItemAppLinks', + 'availability' => 'string', + 'body_style' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'condition' => 'string', + 'currency' => 'string', + 'custom_label_0' => 'string', + 'date_first_on_lot' => 'string', + 'dealer_communication_channel' => 'string', + 'dealer_email' => 'string', + 'dealer_id' => 'string', + 'dealer_name' => 'string', + 'dealer_phone' => 'string', + 'dealer_privacy_policy_url' => 'string', + 'description' => 'string', + 'drivetrain' => 'string', + 'exterior_color' => 'string', + 'fb_page_id' => 'Page', + 'features' => 'list', + 'fuel_type' => 'string', + 'id' => 'string', + 'images' => 'list', + 'interior_color' => 'string', + 'legal_disclosure_impressum_url' => 'string', + 'make' => 'string', + 'mileage' => 'Object', + 'model' => 'string', + 'previous_currency' => 'string', + 'previous_price' => 'string', + 'price' => 'string', + 'sale_currency' => 'string', + 'sale_price' => 'string', + 'sanitized_images' => 'list', + 'state_of_vehicle' => 'string', + 'title' => 'string', + 'transmission' => 'string', + 'trim' => 'string', + 'url' => 'string', + 'vehicle_id' => 'string', + 'vehicle_registration_plate' => 'string', + 'vehicle_specifications' => 'list', + 'vehicle_type' => 'string', + 'vin' => 'string', + 'year' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleOfferFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleOfferFields.php new file mode 100644 index 00000000..7ebda0ea --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VehicleOfferFields.php @@ -0,0 +1,113 @@ + 'string', + 'amount_percentage' => 'float', + 'amount_price' => 'string', + 'amount_qualifier' => 'string', + 'applinks' => 'CatalogItemAppLinks', + 'body_style' => 'string', + 'cashback_currency' => 'string', + 'cashback_price' => 'string', + 'category_specific_fields' => 'CatalogSubVerticalList', + 'currency' => 'string', + 'dma_codes' => 'list', + 'downpayment_currency' => 'string', + 'downpayment_price' => 'string', + 'downpayment_qualifier' => 'string', + 'end_date' => 'string', + 'end_time' => 'int', + 'id' => 'string', + 'images' => 'list', + 'make' => 'string', + 'model' => 'string', + 'offer_description' => 'string', + 'offer_disclaimer' => 'string', + 'offer_type' => 'string', + 'price' => 'string', + 'sanitized_images' => 'list', + 'start_date' => 'string', + 'start_time' => 'int', + 'term_length' => 'unsigned int', + 'term_qualifier' => 'string', + 'title' => 'string', + 'trim' => 'string', + 'url' => 'string', + 'vehicle_offer_id' => 'string', + 'year' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightConditionGroupFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightConditionGroupFields.php new file mode 100644 index 00000000..2ab2a482 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightConditionGroupFields.php @@ -0,0 +1,51 @@ + 'string', + 'conditions' => 'list', + 'validity_status' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightFields.php new file mode 100644 index 00000000..26b99dc1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightFields.php @@ -0,0 +1,77 @@ + 'string', + 'copyright_content_id' => 'string', + 'creator' => 'User', + 'excluded_ownership_segments' => 'list', + 'id' => 'string', + 'in_conflict' => 'bool', + 'monitoring_status' => 'string', + 'monitoring_type' => 'string', + 'ownership_countries' => 'VideoCopyrightGeoGate', + 'reference_file' => 'CopyrightReferenceContainer', + 'reference_file_disabled' => 'bool', + 'reference_file_disabled_by_ops' => 'bool', + 'reference_owner_id' => 'string', + 'rule_ids' => 'list', + 'tags' => 'list', + 'whitelisted_ids' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightGeoGateFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightGeoGateFields.php new file mode 100644 index 00000000..b19e5dcc --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightGeoGateFields.php @@ -0,0 +1,49 @@ + 'list', + 'included_countries' => 'list', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightRuleFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightRuleFields.php new file mode 100644 index 00000000..0c4f28af --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightRuleFields.php @@ -0,0 +1,59 @@ + 'list', + 'copyrights' => 'list', + 'created_date' => 'datetime', + 'creator' => 'User', + 'id' => 'string', + 'is_in_migration' => 'bool', + 'name' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightSegmentFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightSegmentFields.php new file mode 100644 index 00000000..1a416ffb --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoCopyrightSegmentFields.php @@ -0,0 +1,51 @@ + 'float', + 'media_type' => 'string', + 'start_time_in_sec' => 'float', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoListFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoListFields.php new file mode 100644 index 00000000..d0856497 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoListFields.php @@ -0,0 +1,63 @@ + 'datetime', + 'description' => 'string', + 'id' => 'string', + 'last_modified' => 'datetime', + 'owner' => 'Object', + 'season_number' => 'int', + 'thumbnail' => 'string', + 'title' => 'string', + 'videos_count' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoPollFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoPollFields.php new file mode 100644 index 00000000..191f5bb5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoPollFields.php @@ -0,0 +1,59 @@ + 'bool', + 'default_open' => 'bool', + 'id' => 'string', + 'question' => 'string', + 'show_gradient' => 'bool', + 'show_results' => 'bool', + 'status' => 'Status', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoThumbnailFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoThumbnailFields.php new file mode 100644 index 00000000..925d562e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoThumbnailFields.php @@ -0,0 +1,59 @@ + 'unsigned int', + 'id' => 'string', + 'is_preferred' => 'bool', + 'name' => 'string', + 'scale' => 'float', + 'uri' => 'string', + 'width' => 'unsigned int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoUploadLimitsFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoUploadLimitsFields.php new file mode 100644 index 00000000..64190fc0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VideoUploadLimitsFields.php @@ -0,0 +1,49 @@ + 'unsigned int', + 'size' => 'int', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VoipInfoFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VoipInfoFields.php new file mode 100644 index 00000000..b05580df --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/VoipInfoFields.php @@ -0,0 +1,59 @@ + 'bool', + 'has_permission' => 'bool', + 'is_callable' => 'bool', + 'is_callable_webrtc' => 'bool', + 'is_pushable' => 'bool', + 'reason_code' => 'unsigned int', + 'reason_description' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WebAppLinkFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WebAppLinkFields.php new file mode 100644 index 00000000..b7762a89 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WebAppLinkFields.php @@ -0,0 +1,49 @@ + 'bool', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WhatsAppBusinessAccountFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WhatsAppBusinessAccountFields.php new file mode 100644 index 00000000..b8c80d88 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WhatsAppBusinessAccountFields.php @@ -0,0 +1,67 @@ + 'Object', + 'currency' => 'string', + 'id' => 'string', + 'message_template_namespace' => 'string', + 'name' => 'string', + 'on_behalf_of_business_info' => 'Object', + 'owner_business_info' => 'Object', + 'primary_funding_id' => 'string', + 'purchase_order_number' => 'string', + 'status' => 'string', + 'timezone_id' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsAppLinkFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsAppLinkFields.php new file mode 100644 index 00000000..caf8385d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsAppLinkFields.php @@ -0,0 +1,53 @@ + 'string', + 'app_name' => 'string', + 'package_family_name' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsPhoneAppLinkFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsPhoneAppLinkFields.php new file mode 100644 index 00000000..b79216cf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WindowsPhoneAppLinkFields.php @@ -0,0 +1,51 @@ + 'string', + 'app_name' => 'string', + 'url' => 'string', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WorkUserFrontlineFields.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WorkUserFrontlineFields.php new file mode 100644 index 00000000..2f03db6d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Fields/WorkUserFrontlineFields.php @@ -0,0 +1,49 @@ + 'bool', + 'is_frontline' => 'bool', + ); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FlexibleTargeting.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FlexibleTargeting.php new file mode 100644 index 00000000..9ae7d5b8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FlexibleTargeting.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Flight(), + 'NODE', + Flight::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'currency' => 'string', + 'description' => 'string', + 'destination_airport' => 'string', + 'destination_city' => 'string', + 'images' => 'list', + 'origin_airport' => 'string', + 'origin_city' => 'string', + 'price' => 'unsigned int', + 'url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Flight(), + 'NODE', + Flight::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FriendList.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FriendList.php new file mode 100644 index 00000000..006b1a62 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FriendList.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new FriendList(), + 'NODE', + FriendList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FundingSourceDetails.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FundingSourceDetails.php new file mode 100644 index 00000000..2b8bf799 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/FundingSourceDetails.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['PostPermissions'] = GroupPostPermissionsValues::getInstance()->getValues(); + $ref_enums['Purpose'] = GroupPurposeValues::getInstance()->getValues(); + $ref_enums['GroupType'] = GroupGroupTypeValues::getInstance()->getValues(); + $ref_enums['SuggestionCategory'] = GroupSuggestionCategoryValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAdmins(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'uid' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/admins', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdmin(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'uid' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/admins', + new Group(), + 'EDGE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAlbums(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/albums', + new Album(), + 'EDGE', + Album::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAlbum(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'contributors' => 'list', + 'description' => 'string', + 'is_default' => 'bool', + 'location' => 'string', + 'make_shared_album' => 'bool', + 'message' => 'string', + 'name' => 'string', + 'place' => 'Object', + 'privacy' => 'string', + 'tags' => 'list', + 'visible' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/albums', + new Album(), + 'EDGE', + Album::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDocs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/docs', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getEvents(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/events', + new Event(), + 'EDGE', + Event::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'actions' => 'Object', + 'adaptive_type' => 'string', + 'album_id' => 'string', + 'android_key_hash' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'asset3d_id' => 'unsigned int', + 'associated_id' => 'string', + 'attach_place_suggestion' => 'bool', + 'attached_media' => 'list', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'call_to_action' => 'Object', + 'caption' => 'string', + 'checkin_entry_point' => 'checkin_entry_point_enum', + 'child_attachments' => 'list', + 'client_mutation_id' => 'string', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'connection_class' => 'string', + 'content_attachment' => 'string', + 'coordinates' => 'Object', + 'cta_link' => 'string', + 'cta_type' => 'string', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'expanded_height' => 'unsigned int', + 'expanded_width' => 'unsigned int', + 'feed_targeting' => 'Object', + 'formatting' => 'formatting_enum', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'has_nickname' => 'bool', + 'height' => 'unsigned int', + 'holiday_card' => 'string', + 'home_checkin_city_id' => 'Object', + 'image_crops' => 'map', + 'implicit_with_tags' => 'list', + 'instant_game_entry_point_data' => 'string', + 'ios_bundle_id' => 'string', + 'is_backout_draft' => 'bool', + 'is_boost_intended' => 'bool', + 'is_explicit_location' => 'bool', + 'is_explicit_share' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_photo_container' => 'bool', + 'link' => 'string', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'multi_share_end_card' => 'bool', + 'multi_share_optimized' => 'bool', + 'name' => 'string', + 'nectar_module' => 'string', + 'object_attachment' => 'string', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_hide_object_attachment' => 'bool', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'page_recommendation' => 'string', + 'picture' => 'string', + 'place' => 'Object', + 'place_attachment_setting' => 'place_attachment_setting_enum', + 'place_list' => 'string', + 'place_list_data' => 'list', + 'post_surfaces_blacklist' => 'list', + 'posting_to_redspace' => 'posting_to_redspace_enum', + 'privacy' => 'string', + 'prompt_id' => 'string', + 'prompt_tracking_string' => 'string', + 'properties' => 'Object', + 'proxied_app_id' => 'string', + 'publish_event_id' => 'unsigned int', + 'published' => 'bool', + 'quote' => 'string', + 'react_mode_metadata' => 'string', + 'ref' => 'list', + 'referenceable_image_ids' => 'list', + 'referral_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'scheduled_publish_time' => 'datetime', + 'source' => 'string', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'suggested_place_id' => 'Object', + 'tags' => 'list', + 'target_surface' => 'target_surface_enum', + 'targeting' => 'Object', + 'text_format_metadata' => 'string', + 'text_format_preset_id' => 'string', + 'text_only_place' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumbnail' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'tracking_info' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'user_selected_tags' => 'bool', + 'video_start_time_ms' => 'unsigned int', + 'viewer_coordinates' => 'Object', + 'width' => 'unsigned int', + ); + $enums = array( + 'backdated_time_granularity_enum' => array( + 'day', + 'hour', + 'min', + 'month', + 'none', + 'year', + ), + 'checkin_entry_point_enum' => array( + 'BRANDING_CHECKIN', + 'BRANDING_OTHER', + 'BRANDING_PHOTO', + 'BRANDING_STATUS', + ), + 'formatting_enum' => array( + 'MARKDOWN', + 'PLAINTEXT', + ), + 'place_attachment_setting_enum' => array( + '1', + '2', + ), + 'post_surfaces_blacklist_enum' => array( + '1', + '2', + '3', + '4', + '5', + ), + 'posting_to_redspace_enum' => array( + 'disabled', + 'enabled', + ), + 'target_surface_enum' => array( + 'STORY', + 'TIMELINE', + ), + 'unpublished_content_type_enum' => array( + 'ADS_POST', + 'DRAFT', + 'INLINE_CREATED', + 'PUBLISHED', + 'REVIEWABLE_BRANDED_CONTENT', + 'SCHEDULED', + 'SCHEDULED_RECURRING', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/feed', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/groups', + new Group(), + 'EDGE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createGroup(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'admin' => 'int', + 'description' => 'string', + 'group_icon_id' => 'Object', + 'group_type' => 'group_type_enum', + 'join_setting' => 'join_setting_enum', + 'name' => 'string', + 'parent_id' => 'Object', + 'post_permissions' => 'post_permissions_enum', + 'post_requires_admin_approval' => 'bool', + 'privacy' => 'string', + 'ref' => 'string', + 'suggestion_category' => 'suggestion_category_enum', + 'suggestion_identifier' => 'string', + ); + $enums = array( + 'group_type_enum' => GroupGroupTypeValues::getInstance()->getValues(), + 'join_setting_enum' => GroupJoinSettingValues::getInstance()->getValues(), + 'post_permissions_enum' => GroupPostPermissionsValues::getInstance()->getValues(), + 'suggestion_category_enum' => GroupSuggestionCategoryValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/groups', + new Group(), + 'EDGE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'broadcast_status' => 'list', + 'source' => 'source_enum', + ); + $enums = array( + 'broadcast_status_enum' => LiveVideoBroadcastStatusValues::getInstance()->getValues(), + 'source_enum' => LiveVideoSourceValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLiveVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'content_tags' => 'list', + 'description' => 'string', + 'enable_backup_ingest' => 'bool', + 'encoding_settings' => 'string', + 'fisheye_video_cropped' => 'bool', + 'front_z_rotation' => 'float', + 'is_audio_only' => 'bool', + 'is_spherical' => 'bool', + 'live_encoders' => 'list', + 'original_fov' => 'unsigned int', + 'planned_start_time' => 'int', + 'privacy' => 'string', + 'projection' => 'projection_enum', + 'published' => 'bool', + 'schedule_custom_profile_image' => 'file', + 'spatial_audio_format' => 'spatial_audio_format_enum', + 'status' => 'status_enum', + 'stereoscopic_mode' => 'stereoscopic_mode_enum', + 'stop_on_delete_stream' => 'bool', + 'stream_type' => 'stream_type_enum', + 'title' => 'string', + ); + $enums = array( + 'projection_enum' => LiveVideoProjectionValues::getInstance()->getValues(), + 'spatial_audio_format_enum' => LiveVideoSpatialAudioFormatValues::getInstance()->getValues(), + 'status_enum' => LiveVideoStatusValues::getInstance()->getValues(), + 'stereoscopic_mode_enum' => LiveVideoStereoscopicModeValues::getInstance()->getValues(), + 'stream_type_enum' => LiveVideoStreamTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteMembers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'email' => 'string', + 'member' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/members', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMember(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'email' => 'string', + 'from' => 'int', + 'member' => 'int', + 'rate' => 'unsigned int', + 'source' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/members', + new Group(), + 'EDGE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOptedInMembers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/opted_in_members', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPhoto(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aid' => 'string', + 'allow_spherical_photo' => 'bool', + 'alt_text_custom' => 'string', + 'android_key_hash' => 'string', + 'application_id' => 'string', + 'attempt' => 'unsigned int', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'caption' => 'string', + 'composer_session_id' => 'string', + 'direct_share_status' => 'unsigned int', + 'feed_targeting' => 'Object', + 'filter_type' => 'unsigned int', + 'full_res_is_coming_later' => 'bool', + 'initial_view_heading_override_degrees' => 'unsigned int', + 'initial_view_pitch_override_degrees' => 'unsigned int', + 'initial_view_vertical_fov_override_degrees' => 'unsigned int', + 'ios_bundle_id' => 'string', + 'is_explicit_location' => 'bool', + 'is_explicit_place' => 'bool', + 'is_visual_search' => 'bool', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'name' => 'string', + 'no_story' => 'bool', + 'offline_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'place' => 'Object', + 'privacy' => 'string', + 'profile_id' => 'int', + 'proxied_app_id' => 'string', + 'published' => 'bool', + 'qn' => 'string', + 'scheduled_publish_time' => 'unsigned int', + 'spherical_metadata' => 'map', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'target_id' => 'int', + 'targeting' => 'Object', + 'time_since_original_post' => 'unsigned int', + 'uid' => 'int', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'url' => 'string', + 'user_selected_tags' => 'bool', + 'vault_image_id' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => PhotoBackdatedTimeGranularityValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => PhotoUnpublishedContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breaking_change' => 'breaking_change_enum', + 'height' => 'int', + 'redirect' => 'bool', + 'type' => 'type_enum', + 'width' => 'int', + ); + $enums = array( + 'breaking_change_enum' => ProfilePictureSourceBreakingChangeValues::getInstance()->getValues(), + 'type_enum' => ProfilePictureSourceTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => AdVideoTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaptive_type' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'attribution_app_id' => 'string', + 'audio_story_wave_animation_handle' => 'string', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'container_type' => 'container_type_enum', + 'content_category' => 'content_category_enum', + 'creative_tools' => 'string', + 'description' => 'string', + 'embeddable' => 'bool', + 'end_offset' => 'unsigned int', + 'fbuploader_video_file_chunk' => 'string', + 'file_size' => 'unsigned int', + 'file_url' => 'string', + 'fisheye_video_cropped' => 'bool', + 'formatting' => 'formatting_enum', + 'fov' => 'unsigned int', + 'front_z_rotation' => 'float', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'guide' => 'list>', + 'guide_enabled' => 'bool', + 'has_nickname' => 'bool', + 'holiday_card' => 'string', + 'initial_heading' => 'unsigned int', + 'initial_pitch' => 'unsigned int', + 'instant_game_entry_point_data' => 'string', + 'is_boost_intended' => 'bool', + 'is_explicit_share' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_voice_clip' => 'bool', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_suggestion_mechanism' => 'string', + 'original_fov' => 'unsigned int', + 'original_projection_type' => 'original_projection_type_enum', + 'publish_event_id' => 'unsigned int', + 'react_mode_metadata' => 'string', + 'referenced_sticker_id' => 'string', + 'replace_video_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'scheduled_publish_time' => 'unsigned int', + 'slideshow_spec' => 'map', + 'source' => 'string', + 'source_instagram_media_id' => 'string', + 'spherical' => 'bool', + 'start_offset' => 'unsigned int', + 'swap_mode' => 'swap_mode_enum', + 'text_format_metadata' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumb' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'transcode_setting_properties' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'upload_phase' => 'upload_phase_enum', + 'upload_session_id' => 'string', + 'upload_setting_properties' => 'string', + 'video_file_chunk' => 'string', + 'video_id_original' => 'string', + 'video_start_time_ms' => 'unsigned int', + 'waterfall_id' => 'string', + ); + $enums = array( + 'container_type_enum' => AdVideoContainerTypeValues::getInstance()->getValues(), + 'content_category_enum' => AdVideoContentCategoryValues::getInstance()->getValues(), + 'formatting_enum' => AdVideoFormattingValues::getInstance()->getValues(), + 'original_projection_type_enum' => AdVideoOriginalProjectionTypeValues::getInstance()->getValues(), + 'swap_mode_enum' => AdVideoSwapModeValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => AdVideoUnpublishedContentTypeValues::getInstance()->getValues(), + 'upload_phase_enum' => AdVideoUploadPhaseValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'icon_size' => 'icon_size_enum', + ); + $enums = array( + 'icon_size_enum' => array( + '16', + '34', + '50', + '68', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Group(), + 'NODE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'archive' => 'bool', + 'cover' => 'string', + 'cover_url' => 'string', + 'description' => 'string', + 'focus_x' => 'float', + 'focus_y' => 'float', + 'group_icon' => 'string', + 'join_setting' => 'join_setting_enum', + 'name' => 'string', + 'no_feed_story' => 'bool', + 'offset_y' => 'int', + 'post_permissions' => 'post_permissions_enum', + 'post_requires_admin_approval' => 'bool', + 'privacy' => 'string', + 'purpose' => 'purpose_enum', + 'update_view_time' => 'bool', + ); + $enums = array( + 'join_setting_enum' => GroupJoinSettingValues::getInstance()->getValues(), + 'post_permissions_enum' => GroupPostPermissionsValues::getInstance()->getValues(), + 'purpose_enum' => GroupPurposeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Group(), + 'NODE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/HomeListing.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/HomeListing.php new file mode 100644 index 00000000..1836fead --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/HomeListing.php @@ -0,0 +1,147 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new HomeListing(), + 'NODE', + HomeListing::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'address' => 'Object', + 'availability' => 'string', + 'currency' => 'string', + 'description' => 'string', + 'images' => 'list', + 'listing_type' => 'string', + 'name' => 'string', + 'num_baths' => 'float', + 'num_beds' => 'float', + 'num_units' => 'float', + 'price' => 'float', + 'property_type' => 'string', + 'url' => 'string', + 'year_built' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new HomeListing(), + 'NODE', + HomeListing::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Hotel.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Hotel.php new file mode 100644 index 00000000..a0ba9699 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Hotel.php @@ -0,0 +1,168 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/hotel_rooms', + new HotelRoom(), + 'EDGE', + HotelRoom::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Hotel(), + 'NODE', + Hotel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'address' => 'Object', + 'applinks' => 'Object', + 'base_price' => 'unsigned int', + 'brand' => 'string', + 'currency' => 'string', + 'description' => 'string', + 'guest_ratings' => 'list', + 'images' => 'list', + 'name' => 'string', + 'phone' => 'string', + 'star_rating' => 'float', + 'url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Hotel(), + 'NODE', + Hotel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/HotelRoom.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/HotelRoom.php new file mode 100644 index 00000000..8c6a9c07 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/HotelRoom.php @@ -0,0 +1,136 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pricing_variables', + new DynamicPriceConfigByDate(), + 'EDGE', + DynamicPriceConfigByDate::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new HotelRoom(), + 'NODE', + HotelRoom::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'applinks' => 'Object', + 'base_price' => 'float', + 'currency' => 'string', + 'description' => 'string', + 'images' => 'list', + 'margin_level' => 'unsigned int', + 'name' => 'string', + 'pricing_variables' => 'list', + 'sale_price' => 'float', + 'url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new HotelRoom(), + 'NODE', + HotelRoom::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IDName.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IDName.php new file mode 100644 index 00000000..ce40f590 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IDName.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/replies', + new IGComment(), + 'EDGE', + IGComment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createReply(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'message' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/replies', + new IGComment(), + 'EDGE', + IGComment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new IGComment(), + 'NODE', + IGComment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'hide' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new IGComment(), + 'NODE', + IGComment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGMedia.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGMedia.php new file mode 100644 index 00000000..0f250c17 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGMedia.php @@ -0,0 +1,203 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/children', + new IGMedia(), + 'EDGE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new IGComment(), + 'EDGE', + IGComment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'message' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new IGComment(), + 'EDGE', + IGComment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metric' => 'list', + 'period' => 'list', + ); + $enums = array( + 'metric_enum' => InstagramInsightsResultMetricValues::getInstance()->getValues(), + 'period_enum' => InstagramInsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InstagramInsightsResult(), + 'EDGE', + InstagramInsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new IGMedia(), + 'NODE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'comment_enabled' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new IGMedia(), + 'NODE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGUser.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGUser.php new file mode 100644 index 00000000..030f76dd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/IGUser.php @@ -0,0 +1,284 @@ +assureId(); + + $param_types = array( + 'metric' => 'list', + 'period' => 'list', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'metric_enum' => InstagramInsightsResultMetricValues::getInstance()->getValues(), + 'period_enum' => InstagramInsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InstagramInsightsResult(), + 'EDGE', + InstagramInsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMedia(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/media', + new IGMedia(), + 'EDGE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMedia(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'caption' => 'string', + 'image_url' => 'string', + 'location_id' => 'string', + 'media_type' => 'string', + 'thumb_offset' => 'string', + 'user_tags' => 'list', + 'video_url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/media', + new IGMedia(), + 'EDGE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMediaPublish(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'creation_id' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/media_publish', + new IGMedia(), + 'EDGE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMention(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'comment_id' => 'string', + 'media_id' => 'string', + 'message' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/mentions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRecentlySearchedHashtags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/recently_searched_hashtags', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getStories(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/stories', + new IGMedia(), + 'EDGE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tags', + new IGMedia(), + 'EDGE', + IGMedia::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adgroup_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new IGUser(), + 'NODE', + IGUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InsightsResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InsightsResult.php new file mode 100644 index 00000000..481b75a3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InsightsResult.php @@ -0,0 +1,61 @@ +getValues(); + $ref_enums['Period'] = InsightsResultPeriodValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsResult.php new file mode 100644 index 00000000..d75c9b1a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsResult.php @@ -0,0 +1,61 @@ +getValues(); + $ref_enums['Period'] = InstagramInsightsResultPeriodValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsValue.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsValue.php new file mode 100644 index 00000000..dbb813d7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstagramInsightsValue.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/agencies', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAuthorizedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/authorized_adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAuthorizedAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/authorized_adaccounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adgroup_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new InstagramUser(), + 'NODE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticle.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticle.php new file mode 100644 index 00000000..0c6ce56f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticle.php @@ -0,0 +1,135 @@ +assureId(); + + $param_types = array( + 'breakdown' => 'breakdown_enum', + 'metric' => 'list', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'breakdown_enum' => InstantArticleInsightsQueryResultBreakdownValues::getInstance()->getValues(), + 'period_enum' => InstantArticleInsightsQueryResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InstantArticleInsightsQueryResult(), + 'EDGE', + InstantArticleInsightsQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new InstantArticle(), + 'NODE', + InstantArticle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticleInsightsQueryResult.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticleInsightsQueryResult.php new file mode 100644 index 00000000..d53fa313 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InstantArticleInsightsQueryResult.php @@ -0,0 +1,61 @@ +getValues(); + $ref_enums['Period'] = InstantArticleInsightsQueryResultPeriodValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InvoiceCampaign.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InvoiceCampaign.php new file mode 100644 index 00000000..3c550bbf --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/InvoiceCampaign.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Lead(), + 'NODE', + Lead::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenAppointmentBookingInfo.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenAppointmentBookingInfo.php new file mode 100644 index 00000000..175a378f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LeadGenAppointmentBookingInfo.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Locale'] = LeadgenFormLocaleValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getLeads(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/leads', + new Lead(), + 'EDGE', + Lead::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTestLeads(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/test_leads', + new Lead(), + 'EDGE', + Lead::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createTestLead(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'custom_disclaimer_responses' => 'list', + 'field_data' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/test_leads', + new Lead(), + 'EDGE', + Lead::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new LeadgenForm(), + 'NODE', + LeadgenForm::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => LeadgenFormStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new LeadgenForm(), + 'NODE', + LeadgenForm::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LifeEvent.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LifeEvent.php new file mode 100644 index 00000000..a2387625 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LifeEvent.php @@ -0,0 +1,136 @@ +assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new LifeEvent(), + 'NODE', + LifeEvent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Link.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Link.php new file mode 100644 index 00000000..c057b2ba --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Link.php @@ -0,0 +1,197 @@ +assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'facepile_mentioned_ids' => 'list', + 'feedback_source' => 'string', + 'is_offline' => 'bool', + 'message' => 'string', + 'nectar_module' => 'string', + 'object_id' => 'string', + 'parent_comment_id' => 'Object', + 'text' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sharedposts', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Link(), + 'NODE', + Link::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveEncoder.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveEncoder.php new file mode 100644 index 00000000..ac9d38bd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveEncoder.php @@ -0,0 +1,211 @@ +getValues(); + $ref_enums['CapStreamingProtocols'] = LiveEncoderCapStreamingProtocolsValues::getInstance()->getValues(); + $ref_enums['CapVideoCodecs'] = LiveEncoderCapVideoCodecsValues::getInstance()->getValues(); + $ref_enums['Status'] = LiveEncoderStatusValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function createTelemetry(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bitrate' => 'unsigned int', + 'broadcast_id' => 'string', + 'cpu_load_15m' => 'float', + 'cpu_load_1m' => 'float', + 'cpu_load_5m' => 'float', + 'cpu_temperature' => 'unsigned int', + 'cpu_usage' => 'float', + 'framerate' => 'float', + 'frames_dropped' => 'float', + 'gpu_temperature' => 'unsigned int', + 'gpu_usage' => 'float', + 'last_audio_timecode' => 'unsigned int', + 'last_video_keyframe_timecode' => 'unsigned int', + 'last_video_timecode' => 'unsigned int', + 'memory_usage' => 'float', + 'network_latency' => 'float', + 'network_rx_bandwidth' => 'unsigned int', + 'network_rx_packets_dropped' => 'float', + 'network_rx_packets_errors' => 'float', + 'network_tx_bandwidth' => 'unsigned int', + 'network_tx_packets_dropped' => 'float', + 'network_tx_packets_errors' => 'float', + 'process_uptime' => 'unsigned int', + 'status' => 'status_enum', + 'timestamp' => 'unsigned int', + 'total_audio_frames_sent' => 'unsigned int', + 'total_video_frames_sent' => 'unsigned int', + 'total_video_keyframes_sent' => 'unsigned int', + 'uptime' => 'unsigned int', + ); + $enums = array( + 'status_enum' => LiveEncoderStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/telemetry', + new LiveEncoder(), + 'EDGE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new LiveEncoder(), + 'NODE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'broadcast_id' => 'string', + 'cap_audio_codecs' => 'list', + 'cap_streaming_protocols' => 'list', + 'cap_video_codecs' => 'list', + 'error_code' => 'unsigned int', + 'error_msg' => 'string', + 'input_audio_channels' => 'unsigned int', + 'input_audio_samplerate' => 'unsigned int', + 'input_video_framerate' => 'string', + 'input_video_gop_num_b_frames' => 'unsigned int', + 'input_video_gop_size' => 'unsigned int', + 'input_video_height' => 'unsigned int', + 'input_video_interlace_mode' => 'string', + 'input_video_width' => 'unsigned int', + 'name' => 'string', + 'needs_transcoder_restart' => 'bool', + 'needs_transcoder_restart_reason' => 'list', + 'status' => 'status_enum', + 'target_token' => 'string', + 'version' => 'string', + ); + $enums = array( + 'cap_audio_codecs_enum' => LiveEncoderCapAudioCodecsValues::getInstance()->getValues(), + 'cap_streaming_protocols_enum' => LiveEncoderCapStreamingProtocolsValues::getInstance()->getValues(), + 'cap_video_codecs_enum' => LiveEncoderCapVideoCodecsValues::getInstance()->getValues(), + 'status_enum' => LiveEncoderStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new LiveEncoder(), + 'NODE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideo.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideo.php new file mode 100644 index 00000000..c3b77645 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideo.php @@ -0,0 +1,402 @@ +getValues(); + $ref_enums['Projection'] = LiveVideoProjectionValues::getInstance()->getValues(); + $ref_enums['SpatialAudioFormat'] = LiveVideoSpatialAudioFormatValues::getInstance()->getValues(); + $ref_enums['Status'] = LiveVideoStatusValues::getInstance()->getValues(); + $ref_enums['StereoscopicMode'] = LiveVideoStereoscopicModeValues::getInstance()->getValues(); + $ref_enums['StreamType'] = LiveVideoStreamTypeValues::getInstance()->getValues(); + $ref_enums['Source'] = LiveVideoSourceValues::getInstance()->getValues(); + $ref_enums['LiveCommentModerationSetting'] = LiveVideoLiveCommentModerationSettingValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getBlockedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'uid' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/blocked_users', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCrosspostSharedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/crosspost_shared_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCrosspostedBroadcasts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/crossposted_broadcasts', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getErrors(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/errors', + new LiveVideoError(), + 'EDGE', + LiveVideoError::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createInputStream(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/input_streams', + new LiveVideoInputStream(), + 'EDGE', + LiveVideoInputStream::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPolls(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/polls', + new VideoPoll(), + 'EDGE', + VideoPoll::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPoll(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'close_after_voting' => 'bool', + 'correct_option' => 'unsigned int', + 'default_open' => 'bool', + 'options' => 'list', + 'question' => 'string', + 'show_gradient' => 'bool', + 'show_results' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/polls', + new VideoPoll(), + 'EDGE', + VideoPoll::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'target_token' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new LiveVideo(), + 'NODE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_bm_crossposting' => 'bool', + 'content_tags' => 'list', + 'crossposting_actions' => 'list', + 'custom_labels' => 'list', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'embeddable' => 'bool', + 'end_live_video' => 'bool', + 'is_audio_only' => 'bool', + 'is_manual_mode' => 'bool', + 'live_comment_moderation_setting' => 'list', + 'live_encoders' => 'list', + 'master_ingest_stream_id' => 'string', + 'og_icon_id' => 'string', + 'og_phrase' => 'string', + 'place' => 'Object', + 'planned_start_time' => 'int', + 'privacy' => 'string', + 'published' => 'bool', + 'schedule_custom_profile_image' => 'file', + 'schedule_feed_background_image' => 'file', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'status' => 'status_enum', + 'stream_type' => 'stream_type_enum', + 'tags' => 'list', + 'targeting' => 'Object', + 'title' => 'string', + ); + $enums = array( + 'live_comment_moderation_setting_enum' => LiveVideoLiveCommentModerationSettingValues::getInstance()->getValues(), + 'status_enum' => LiveVideoStatusValues::getInstance()->getValues(), + 'stream_type_enum' => LiveVideoStreamTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new LiveVideo(), + 'NODE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoAdBreakConfig.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoAdBreakConfig.php new file mode 100644 index 00000000..034d0639 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoAdBreakConfig.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new LiveVideoError(), + 'NODE', + LiveVideoError::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoInputStream.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoInputStream.php new file mode 100644 index 00000000..4abf6d7d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoInputStream.php @@ -0,0 +1,81 @@ +assureId(); + + $param_types = array( + 'target_token' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new LiveVideoInputStream(), + 'NODE', + LiveVideoInputStream::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoTargeting.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoTargeting.php new file mode 100644 index 00000000..11ed4b89 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/LiveVideoTargeting.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new MailingAddress(), + 'NODE', + MailingAddress::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MeasurementUploadEvent.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MeasurementUploadEvent.php new file mode 100644 index 00000000..9d44c24a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MeasurementUploadEvent.php @@ -0,0 +1,134 @@ +getValues(); + $ref_enums['EventStatus'] = MeasurementUploadEventEventStatusValues::getInstance()->getValues(); + $ref_enums['LookbackWindow'] = MeasurementUploadEventLookbackWindowValues::getInstance()->getValues(); + $ref_enums['MatchUniverse'] = MeasurementUploadEventMatchUniverseValues::getInstance()->getValues(); + $ref_enums['Timezone'] = MeasurementUploadEventTimezoneValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new MeasurementUploadEvent(), + 'NODE', + MeasurementUploadEvent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggregation_level' => 'aggregation_level_enum', + 'conversion_end_date' => 'string', + 'conversion_start_date' => 'string', + 'event_status' => 'event_status_enum', + 'lookback_window' => 'lookback_window_enum', + 'match_universe' => 'match_universe_enum', + 'partner' => 'string', + 'timezone' => 'timezone_enum', + 'upload_tag' => 'string', + ); + $enums = array( + 'aggregation_level_enum' => MeasurementUploadEventAggregationLevelValues::getInstance()->getValues(), + 'event_status_enum' => MeasurementUploadEventEventStatusValues::getInstance()->getValues(), + 'lookback_window_enum' => MeasurementUploadEventLookbackWindowValues::getInstance()->getValues(), + 'match_universe_enum' => MeasurementUploadEventMatchUniverseValues::getInstance()->getValues(), + 'timezone_enum' => MeasurementUploadEventTimezoneValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new MeasurementUploadEvent(), + 'NODE', + MeasurementUploadEvent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MediaFingerprint.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MediaFingerprint.php new file mode 100644 index 00000000..da68cd91 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MediaFingerprint.php @@ -0,0 +1,132 @@ +getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new MediaFingerprint(), + 'NODE', + MediaFingerprint::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metadata' => 'list', + 'source' => 'file', + 'title' => 'string', + 'universal_content_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new MediaFingerprint(), + 'NODE', + MediaFingerprint::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessagingFeatureReview.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessagingFeatureReview.php new file mode 100644 index 00000000..71c779a4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessagingFeatureReview.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new MessengerDestinationPageWelcomeMessage(), + 'NODE', + MessengerDestinationPageWelcomeMessage::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessengerProfile.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessengerProfile.php new file mode 100644 index 00000000..9a0683d9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/MessengerProfile.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new MusicVideoCopyright(), + 'NODE', + MusicVideoCopyright::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOffer.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOffer.php new file mode 100644 index 00000000..f0134f06 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOffer.php @@ -0,0 +1,172 @@ +getValues(); + $ref_enums['BarcodeType'] = NativeOfferBarcodeTypeValues::getInstance()->getValues(); + $ref_enums['LocationType'] = NativeOfferLocationTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function createCode(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'file' => 'file', + 'unique_codes_file_code_type' => 'unique_codes_file_code_type_enum', + ); + $enums = array( + 'unique_codes_file_code_type_enum' => NativeOfferUniqueCodesFileCodeTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/codes', + new NativeOffer(), + 'EDGE', + NativeOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createNativeOfferView(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account' => 'string', + 'ad_image_hashes' => 'list', + 'carousel_captions' => 'list', + 'carousel_data' => 'list', + 'carousel_links' => 'list', + 'deeplinks' => 'list', + 'image_crops' => 'list', + 'message' => 'string', + 'photos' => 'list', + 'place_data' => 'Object', + 'published' => 'bool', + 'published_ads' => 'bool', + 'urls' => 'list', + 'videos' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/nativeofferviews', + new NativeOffer(), + 'EDGE', + NativeOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getViews(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/views', + new NativeOfferView(), + 'EDGE', + NativeOfferView::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new NativeOffer(), + 'NODE', + NativeOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOfferDiscount.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOfferDiscount.php new file mode 100644 index 00000000..9edfaef0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NativeOfferDiscount.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + 'ad_account' => 'string', + 'ad_image_hashes' => 'list', + 'file' => 'file', + 'image_crops' => 'list', + 'photos' => 'list', + 'urls' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/photos', + new NativeOfferView(), + 'EDGE', + NativeOfferView::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'videos' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/videos', + new NativeOfferView(), + 'EDGE', + NativeOfferView::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new NativeOfferView(), + 'NODE', + NativeOfferView::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'message' => 'string', + 'published' => 'bool', + 'published_ads' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new NativeOfferView(), + 'NODE', + NativeOfferView::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NullNode.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NullNode.php new file mode 100644 index 00000000..8af08a94 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/NullNode.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['RelationshipType'] = OfflineConversionDataSetRelationshipTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'string', + 'auto_track_for_ads' => 'bool', + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/adaccounts', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAgency(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + 'other_relationship' => 'string', + 'permitted_roles' => 'list', + 'relationship_type' => 'list', + ); + $enums = array( + 'permitted_roles_enum' => OfflineConversionDataSetPermittedRolesValues::getInstance()->getValues(), + 'relationship_type_enum' => OfflineConversionDataSetRelationshipTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/agencies', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAudiences(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/audiences', + new CustomAudience(), + 'EDGE', + CustomAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomConversions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/customconversions', + new CustomConversion(), + 'EDGE', + CustomConversion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createEvent(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + 'namespace_id' => 'string', + 'progress' => 'Object', + 'upload_id' => 'string', + 'upload_source' => 'string', + 'upload_tag' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/events', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getStats(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aggr_time' => 'aggr_time_enum', + 'end' => 'int', + 'granularity' => 'granularity_enum', + 'skip_empty_values' => 'bool', + 'start' => 'int', + 'user_timezone_id' => 'unsigned int', + ); + $enums = array( + 'aggr_time_enum' => array( + 'event_time', + 'upload_time', + ), + 'granularity_enum' => array( + 'daily', + 'hourly', + 'six_hourly', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/stats', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getUploads(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_time' => 'datetime', + 'order' => 'order_enum', + 'sort_by' => 'sort_by_enum', + 'start_time' => 'datetime', + 'upload_tag' => 'string', + ); + $enums = array( + 'order_enum' => array( + 'ASCENDING', + 'DESCENDING', + ), + 'sort_by_enum' => array( + 'API_CALLS', + 'CREATION_TIME', + 'EVENT_TIME_MAX', + 'EVENT_TIME_MIN', + 'FIRST_UPLOAD_TIME', + 'IS_EXCLUDED_FOR_LIFT', + 'LAST_UPLOAD_TIME', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/uploads', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUpload(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'upload_tag' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/uploads', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createValidate(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + 'namespace_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/validate', + new OfflineConversionDataSet(), + 'EDGE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new OfflineConversionDataSet(), + 'NODE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'auto_assign_to_new_accounts_only' => 'bool', + 'description' => 'string', + 'enable_auto_assign_to_accounts' => 'bool', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new OfflineConversionDataSet(), + 'NODE', + OfflineConversionDataSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OfflineTermsOfService.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OfflineTermsOfService.php new file mode 100644 index 00000000..8f60f998 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OfflineTermsOfService.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new OfflineTermsOfService(), + 'NODE', + OfflineTermsOfService::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OffsitePixel.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OffsitePixel.php new file mode 100644 index 00000000..6d4d080d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OffsitePixel.php @@ -0,0 +1,88 @@ +assureId(); + + $param_types = array( + 'value' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new OffsitePixel(), + 'NODE', + OffsitePixel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OpenGraphContext.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OpenGraphContext.php new file mode 100644 index 00000000..1b60067e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OpenGraphContext.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new OpenGraphContext(), + 'NODE', + OpenGraphContext::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OracleTransaction.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OracleTransaction.php new file mode 100644 index 00000000..c81fadb5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OracleTransaction.php @@ -0,0 +1,105 @@ +getValues(); + return $ref_enums; + } + + + public function getCampaigns(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/campaigns', + new InvoiceCampaign(), + 'EDGE', + InvoiceCampaign::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new OracleTransaction(), + 'NODE', + OracleTransaction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OutcomePredictionPoint.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OutcomePredictionPoint.php new file mode 100644 index 00000000..b4030a26 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/OutcomePredictionPoint.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['FoodStyles'] = PageFoodStylesValues::getInstance()->getValues(); + $ref_enums['PickupOptions'] = PagePickupOptionsValues::getInstance()->getValues(); + $ref_enums['TemporaryStatus'] = PageTemporaryStatusValues::getInstance()->getValues(); + $ref_enums['PermittedTasks'] = PagePermittedTasksValues::getInstance()->getValues(); + $ref_enums['Tasks'] = PageTasksValues::getInstance()->getValues(); + $ref_enums['BackdatedTimeGranularity'] = PageBackdatedTimeGranularityValues::getInstance()->getValues(); + $ref_enums['CheckinEntryPoint'] = PageCheckinEntryPointValues::getInstance()->getValues(); + $ref_enums['Formatting'] = PageFormattingValues::getInstance()->getValues(); + $ref_enums['PlaceAttachmentSetting'] = PagePlaceAttachmentSettingValues::getInstance()->getValues(); + $ref_enums['PostSurfacesBlacklist'] = PagePostSurfacesBlacklistValues::getInstance()->getValues(); + $ref_enums['PostingToRedspace'] = PagePostingToRedspaceValues::getInstance()->getValues(); + $ref_enums['TargetSurface'] = PageTargetSurfaceValues::getInstance()->getValues(); + $ref_enums['UnpublishedContentType'] = PageUnpublishedContentTypeValues::getInstance()->getValues(); + $ref_enums['PublishStatus'] = PagePublishStatusValues::getInstance()->getValues(); + $ref_enums['MessagingType'] = PageMessagingTypeValues::getInstance()->getValues(); + $ref_enums['NotificationType'] = PageNotificationTypeValues::getInstance()->getValues(); + $ref_enums['SenderAction'] = PageSenderActionValues::getInstance()->getValues(); + $ref_enums['Model'] = PageModelValues::getInstance()->getValues(); + $ref_enums['SubscribedFields'] = PageSubscribedFieldsValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function createAcknowledgeOrder(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'idempotency_key' => 'string', + 'orders' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/acknowledge_orders', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdsPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'exclude_dynamic_ads' => 'bool', + 'include_inline_create' => 'bool', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ads_posts', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/agencies', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAgency(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + 'permitted_tasks' => 'list', + ); + $enums = array( + 'permitted_tasks_enum' => PagePermittedTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/agencies', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAlbums(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/albums', + new Album(), + 'EDGE', + Album::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/assigned_users', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_users', + new AssignedUser(), + 'EDGE', + AssignedUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAssignedUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tasks' => 'list', + 'user' => 'int', + ); + $enums = array( + 'tasks_enum' => PageTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assigned_users', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteBlocked(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asid' => 'string', + 'psid' => 'int', + 'uid' => 'int', + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/blocked', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBlocked(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'uid' => 'int', + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/blocked', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBlocked(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'asid' => 'list', + 'psid' => 'list', + 'uid' => 'list', + 'user' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/blocked', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBusinessDatum(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + 'partner_agent' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/business_data', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCallToActions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/call_to_actions', + new PageCallToAction(), + 'EDGE', + PageCallToAction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCanvasElements(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/canvas_elements', + new CanvasBodyElement(), + 'EDGE', + CanvasBodyElement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCanvasElement(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'canvas_button' => 'Object', + 'canvas_carousel' => 'Object', + 'canvas_footer' => 'Object', + 'canvas_header' => 'Object', + 'canvas_lead_form' => 'Object', + 'canvas_photo' => 'Object', + 'canvas_product_list' => 'Object', + 'canvas_product_set' => 'Object', + 'canvas_store_locator' => 'Object', + 'canvas_text' => 'Object', + 'canvas_video' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/canvas_elements', + new CanvasBodyElement(), + 'EDGE', + CanvasBodyElement::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCanvases(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_hidden' => 'bool', + 'is_published' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/canvases', + new Canvas(), + 'EDGE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCanvase(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'background_color' => 'string', + 'body_element_ids' => 'list', + 'enable_swipe_to_open' => 'bool', + 'is_hidden' => 'bool', + 'is_published' => 'bool', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/canvases', + new Canvas(), + 'EDGE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteClaimedUrls(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/claimed_urls', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getClaimedUrls(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/claimed_urls', + new URL(), + 'EDGE', + URL::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCommerceMerchantSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/commerce_merchant_settings', + new CommerceMerchantSettings(), + 'EDGE', + CommerceMerchantSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCommerceOrders(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filters' => 'list', + 'state' => 'list', + 'updated_after' => 'datetime', + 'updated_before' => 'datetime', + ); + $enums = array( + 'filters_enum' => CommerceOrderFiltersValues::getInstance()->getValues(), + 'state_enum' => CommerceOrderStateValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/commerce_orders', + new CommerceOrder(), + 'EDGE', + CommerceOrder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCommercePayouts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_time' => 'datetime', + 'start_time' => 'datetime', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/commerce_payouts', + new CommercePayout(), + 'EDGE', + CommercePayout::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCommerceTransactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'end_time' => 'datetime', + 'payout_reference_id' => 'string', + 'start_time' => 'datetime', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/commerce_transactions', + new CommerceOrderTransactionDetail(), + 'EDGE', + CommerceOrderTransactionDetail::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getConversations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'folder' => 'string', + 'tags' => 'list', + 'user_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/conversations', + new UnifiedThread(), + 'EDGE', + UnifiedThread::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCopyrightManualClaim(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + 'action_reason' => 'action_reason_enum', + 'countries' => 'Object', + 'match_content_type' => 'match_content_type_enum', + 'matched_asset_id' => 'string', + 'reference_asset_id' => 'string', + ); + $enums = array( + 'action_enum' => array( + 'BLOCK', + 'CLAIM_AD_EARNINGS', + 'MANUAL_REVIEW', + 'MONITOR', + 'REQUEST_TAKEDOWN', + ), + 'action_reason_enum' => array( + 'ARTIST_OBJECTION', + 'OBJECTIONABLE_CONTENT', + 'PREMIUM_MUSIC_VIDEO', + 'PRERELEASE_CONTENT', + 'PRODUCT_PARAMETERS', + 'RESTRICTED_CONTENT', + 'UNAUTHORIZED_COMMERCIAL_USE', + ), + 'match_content_type_enum' => array( + 'AUDIO_ONLY', + 'VIDEO_AND_AUDIO', + 'VIDEO_ONLY', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/copyright_manual_claims', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCopyrightWhitelistedPartners(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/copyright_whitelisted_partners', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCrosspostWhitelistedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/crosspost_whitelisted_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/custom_labels', + new PageUserMessageThreadLabel(), + 'EDGE', + PageUserMessageThreadLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCustomLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/custom_labels', + new PageUserMessageThreadLabel(), + 'EDGE', + PageUserMessageThreadLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteCustomUserSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'params' => 'list', + 'psid' => 'string', + ); + $enums = array( + 'params_enum' => array( + 'PERSISTENT_MENU', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/custom_user_settings', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomUserSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'psid' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/custom_user_settings', + new CustomUserSettings(), + 'EDGE', + CustomUserSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCustomUserSetting(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'persistent_menu' => 'list', + 'psid' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/custom_user_settings', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getEvents(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'event_state_filter' => 'list', + 'include_canceled' => 'bool', + 'time_filter' => 'time_filter_enum', + 'type' => 'type_enum', + ); + $enums = array( + 'event_state_filter_enum' => EventEventStateFilterValues::getInstance()->getValues(), + 'time_filter_enum' => EventTimeFilterValues::getInstance()->getValues(), + 'type_enum' => EventTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/events', + new Event(), + 'EDGE', + Event::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createExtendThreadControl(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'duration' => 'unsigned int', + 'recipient' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/extend_thread_control', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_hidden' => 'bool', + 'limit' => 'unsigned int', + 'show_expired' => 'bool', + 'with' => 'with_enum', + ); + $enums = array( + 'with_enum' => PagePostWithValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/feed', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'actions' => 'Object', + 'adaptive_type' => 'string', + 'album_id' => 'string', + 'android_key_hash' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'asset3d_id' => 'unsigned int', + 'associated_id' => 'string', + 'attach_place_suggestion' => 'bool', + 'attached_media' => 'list', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'call_to_action' => 'Object', + 'caption' => 'string', + 'checkin_entry_point' => 'checkin_entry_point_enum', + 'child_attachments' => 'list', + 'client_mutation_id' => 'string', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'connection_class' => 'string', + 'content_attachment' => 'string', + 'coordinates' => 'Object', + 'cta_link' => 'string', + 'cta_type' => 'string', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'enforce_link_ownership' => 'bool', + 'expanded_height' => 'unsigned int', + 'expanded_width' => 'unsigned int', + 'feed_targeting' => 'Object', + 'formatting' => 'formatting_enum', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'has_nickname' => 'bool', + 'height' => 'unsigned int', + 'holiday_card' => 'string', + 'home_checkin_city_id' => 'Object', + 'image_crops' => 'map', + 'implicit_with_tags' => 'list', + 'instant_game_entry_point_data' => 'string', + 'ios_bundle_id' => 'string', + 'is_backout_draft' => 'bool', + 'is_boost_intended' => 'bool', + 'is_explicit_location' => 'bool', + 'is_explicit_share' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_photo_container' => 'bool', + 'link' => 'string', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'multi_share_end_card' => 'bool', + 'multi_share_optimized' => 'bool', + 'name' => 'string', + 'nectar_module' => 'string', + 'object_attachment' => 'string', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_hide_object_attachment' => 'bool', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'page_recommendation' => 'string', + 'picture' => 'string', + 'place' => 'Object', + 'place_attachment_setting' => 'place_attachment_setting_enum', + 'place_list' => 'string', + 'place_list_data' => 'list', + 'post_surfaces_blacklist' => 'list', + 'posting_to_redspace' => 'posting_to_redspace_enum', + 'privacy' => 'string', + 'prompt_id' => 'string', + 'prompt_tracking_string' => 'string', + 'properties' => 'Object', + 'proxied_app_id' => 'string', + 'publish_event_id' => 'unsigned int', + 'published' => 'bool', + 'quote' => 'string', + 'react_mode_metadata' => 'string', + 'ref' => 'list', + 'referenceable_image_ids' => 'list', + 'referral_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'scheduled_publish_time' => 'datetime', + 'source' => 'string', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'suggested_place_id' => 'Object', + 'tags' => 'list', + 'target_surface' => 'target_surface_enum', + 'targeting' => 'Object', + 'text_format_metadata' => 'string', + 'text_format_preset_id' => 'string', + 'text_only_place' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumbnail' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'tracking_info' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'user_selected_tags' => 'bool', + 'video_start_time_ms' => 'unsigned int', + 'viewer_coordinates' => 'Object', + 'width' => 'unsigned int', + ); + $enums = array( + 'backdated_time_granularity_enum' => PageBackdatedTimeGranularityValues::getInstance()->getValues(), + 'checkin_entry_point_enum' => PageCheckinEntryPointValues::getInstance()->getValues(), + 'formatting_enum' => PageFormattingValues::getInstance()->getValues(), + 'place_attachment_setting_enum' => PagePlaceAttachmentSettingValues::getInstance()->getValues(), + 'post_surfaces_blacklist_enum' => PagePostSurfacesBlacklistValues::getInstance()->getValues(), + 'posting_to_redspace_enum' => PagePostingToRedspaceValues::getInstance()->getValues(), + 'target_surface_enum' => PageTargetSurfaceValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => PageUnpublishedContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/feed', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getGlobalBrandChildren(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/global_brand_children', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getIndexedVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/indexed_videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'metric' => 'list', + 'period' => 'period_enum', + 'show_description_from_api_doc' => 'bool', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'date_preset_enum' => InsightsResultDatePresetValues::getInstance()->getValues(), + 'period_enum' => InsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InsightsResult(), + 'EDGE', + InsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInstantArticles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'development_mode' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/instant_articles', + new InstantArticle(), + 'EDGE', + InstantArticle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createInstantArticle(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'development_mode' => 'bool', + 'html_source' => 'string', + 'published' => 'bool', + 'take_live' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/instant_articles', + new InstantArticle(), + 'EDGE', + InstantArticle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInstantArticlesInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breakdown' => 'breakdown_enum', + 'metric' => 'list', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'breakdown_enum' => InstantArticleInsightsQueryResultBreakdownValues::getInstance()->getValues(), + 'period_enum' => InstantArticleInsightsQueryResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/instant_articles_insights', + new InstantArticleInsightsQueryResult(), + 'EDGE', + InstantArticleInsightsQueryResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createInstantArticlesPublish(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'canonical_url' => 'string', + 'publish_status' => 'publish_status_enum', + ); + $enums = array( + 'publish_status_enum' => PagePublishStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/instant_articles_publish', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLeadGenForms(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/leadgen_forms', + new LeadgenForm(), + 'EDGE', + LeadgenForm::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLeadGenForm(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_organic_lead_retrieval' => 'bool', + 'block_display_for_non_targeted_viewer' => 'bool', + 'context_card' => 'Object', + 'cover_photo' => 'file', + 'custom_disclaimer' => 'Object', + 'follow_up_action_url' => 'string', + 'is_for_canvas' => 'bool', + 'is_optimized_for_quality' => 'bool', + 'locale' => 'locale_enum', + 'name' => 'string', + 'privacy_policy' => 'Object', + 'question_page_custom_headline' => 'string', + 'questions' => 'list', + 'thank_you_page' => 'Object', + 'tracking_parameters' => 'map', + ); + $enums = array( + 'locale_enum' => LeadgenFormLocaleValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/leadgen_forms', + new LeadgenForm(), + 'EDGE', + LeadgenForm::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'target_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveEncoders(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_encoders', + new LiveEncoder(), + 'EDGE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLiveEncoder(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'brand' => 'string', + 'device_id' => 'string', + 'model' => 'string', + 'name' => 'string', + 'version' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/live_encoders', + new LiveEncoder(), + 'EDGE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'broadcast_status' => 'list', + 'source' => 'source_enum', + ); + $enums = array( + 'broadcast_status_enum' => LiveVideoBroadcastStatusValues::getInstance()->getValues(), + 'source_enum' => LiveVideoSourceValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLiveVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'content_tags' => 'list', + 'crossposting_actions' => 'list', + 'custom_labels' => 'list', + 'description' => 'string', + 'enable_backup_ingest' => 'bool', + 'encoding_settings' => 'string', + 'fisheye_video_cropped' => 'bool', + 'front_z_rotation' => 'float', + 'game_show' => 'map', + 'is_audio_only' => 'bool', + 'is_spherical' => 'bool', + 'live_encoders' => 'list', + 'original_fov' => 'unsigned int', + 'planned_start_time' => 'int', + 'privacy' => 'string', + 'projection' => 'projection_enum', + 'published' => 'bool', + 'schedule_custom_profile_image' => 'file', + 'spatial_audio_format' => 'spatial_audio_format_enum', + 'status' => 'status_enum', + 'stereoscopic_mode' => 'stereoscopic_mode_enum', + 'stop_on_delete_stream' => 'bool', + 'stream_type' => 'stream_type_enum', + 'targeting' => 'Object', + 'title' => 'string', + ); + $enums = array( + 'projection_enum' => LiveVideoProjectionValues::getInstance()->getValues(), + 'spatial_audio_format_enum' => LiveVideoSpatialAudioFormatValues::getInstance()->getValues(), + 'status_enum' => LiveVideoStatusValues::getInstance()->getValues(), + 'stereoscopic_mode_enum' => LiveVideoStereoscopicModeValues::getInstance()->getValues(), + 'stream_type_enum' => LiveVideoStreamTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteLocations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'location_page_id' => 'string', + 'store_number' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/locations', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLocations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/locations', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLocation(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'always_open' => 'bool', + 'delivery_and_pickup_option_info' => 'list', + 'differently_open_offerings' => 'map', + 'hours' => 'map', + 'ignore_warnings' => 'bool', + 'location' => 'Object', + 'location_page_id' => 'string', + 'old_store_number' => 'unsigned int', + 'page_username' => 'string', + 'permanently_closed' => 'bool', + 'phone' => 'string', + 'pickup_options' => 'list', + 'place_topics' => 'list', + 'price_range' => 'string', + 'store_code' => 'string', + 'store_location_descriptor' => 'string', + 'store_name' => 'string', + 'store_number' => 'unsigned int', + 'temporary_status' => 'temporary_status_enum', + 'website' => 'string', + ); + $enums = array( + 'pickup_options_enum' => PagePickupOptionsValues::getInstance()->getValues(), + 'temporary_status_enum' => PageTemporaryStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/locations', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMediaFingerprints(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'universal_content_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/media_fingerprints', + new MediaFingerprint(), + 'EDGE', + MediaFingerprint::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMediaFingerprint(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'fingerprint_content_type' => 'fingerprint_content_type_enum', + 'metadata' => 'list', + 'source' => 'string', + 'title' => 'string', + 'universal_content_id' => 'string', + ); + $enums = array( + 'fingerprint_content_type_enum' => MediaFingerprintFingerprintContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/media_fingerprints', + new MediaFingerprint(), + 'EDGE', + MediaFingerprint::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMessageAttachment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'message' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/message_attachments', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMessage(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'message' => 'Object', + 'messaging_type' => 'messaging_type_enum', + 'notification_type' => 'notification_type_enum', + 'persona_id' => 'string', + 'recipient' => 'Object', + 'sender_action' => 'sender_action_enum', + 'tag' => 'Object', + ); + $enums = array( + 'messaging_type_enum' => PageMessagingTypeValues::getInstance()->getValues(), + 'notification_type_enum' => PageNotificationTypeValues::getInstance()->getValues(), + 'sender_action_enum' => PageSenderActionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/messages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMessagingFeatureReview(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/messaging_feature_review', + new MessagingFeatureReview(), + 'EDGE', + MessagingFeatureReview::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteMessengerProfile(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'fields' => 'list', + ); + $enums = array( + 'fields_enum' => array( + 'ACCOUNT_LINKING_URL', + 'GET_STARTED', + 'GREETING', + 'HOME_URL', + 'ICE_BREAKERS', + 'PAYMENT_SETTINGS', + 'PERSISTENT_MENU', + 'PLATFORM', + 'TARGET_AUDIENCE', + 'WHITELISTED_DOMAINS', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/messenger_profile', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMessengerProfile(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/messenger_profile', + new MessengerProfile(), + 'EDGE', + MessengerProfile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMessengerProfile(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_linking_url' => 'string', + 'get_started' => 'Object', + 'greeting' => 'list', + 'ice_breakers' => 'list', + 'payment_settings' => 'Object', + 'persistent_menu' => 'list', + 'target_audience' => 'Object', + 'whitelisted_domains' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/messenger_profile', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getNativeOffers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/nativeoffers', + new NativeOffer(), + 'EDGE', + NativeOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createNativeOffer(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'barcode_photo' => 'unsigned int', + 'barcode_type' => 'barcode_type_enum', + 'barcode_value' => 'string', + 'block_reshares' => 'bool', + 'commerce_product_item' => 'string', + 'commerce_store' => 'string', + 'commerce_store_collection' => 'string', + 'details' => 'string', + 'disable_location' => 'bool', + 'discounts' => 'list', + 'expiration_time' => 'datetime', + 'instore_code' => 'string', + 'location_type' => 'location_type_enum', + 'max_save_count' => 'unsigned int', + 'online_code' => 'string', + 'page_set_id' => 'string', + 'redemption_code' => 'string', + 'redemption_link' => 'string', + 'terms' => 'string', + 'unique_barcodes' => 'unsigned int', + 'unique_codes' => 'unsigned int', + ); + $enums = array( + 'barcode_type_enum' => NativeOfferBarcodeTypeValues::getInstance()->getValues(), + 'location_type_enum' => NativeOfferLocationTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/nativeoffers', + new NativeOffer(), + 'EDGE', + NativeOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createNlpConfig(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'api_version' => 'Object', + 'custom_token' => 'string', + 'model' => 'model_enum', + 'n_best' => 'unsigned int', + 'nlp_enabled' => 'bool', + 'other_language_support' => 'map', + 'verbose' => 'bool', + ); + $enums = array( + 'model_enum' => PageModelValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/nlp_configs', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPageBackedInstagramAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/page_backed_instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPageBackedInstagramAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/page_backed_instagram_accounts', + new InstagramUser(), + 'EDGE', + InstagramUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPageWhatsappNumberVerification(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'verification_code' => 'string', + 'whatsapp_number' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/page_whatsapp_number_verification', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPassThreadControl(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metadata' => 'string', + 'recipient' => 'Object', + 'target_app_id' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/pass_thread_control', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPassThreadMetadatum(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metadata' => 'string', + 'recipient' => 'Object', + 'target_app_id' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/pass_thread_metadata', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPersonas(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/personas', + new Persona(), + 'EDGE', + Persona::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPersona(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + 'profile_picture_url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/personas', + new Persona(), + 'EDGE', + Persona::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPhotos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'biz_tag_id' => 'unsigned int', + 'business_id' => 'string', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => PhotoTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPhoto(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aid' => 'string', + 'allow_spherical_photo' => 'bool', + 'alt_text_custom' => 'string', + 'android_key_hash' => 'string', + 'application_id' => 'string', + 'attempt' => 'unsigned int', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'caption' => 'string', + 'composer_session_id' => 'string', + 'direct_share_status' => 'unsigned int', + 'feed_targeting' => 'Object', + 'filter_type' => 'unsigned int', + 'full_res_is_coming_later' => 'bool', + 'initial_view_heading_override_degrees' => 'unsigned int', + 'initial_view_pitch_override_degrees' => 'unsigned int', + 'initial_view_vertical_fov_override_degrees' => 'unsigned int', + 'ios_bundle_id' => 'string', + 'is_explicit_location' => 'bool', + 'is_explicit_place' => 'bool', + 'is_visual_search' => 'bool', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'name' => 'string', + 'nectar_module' => 'string', + 'no_story' => 'bool', + 'offline_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'parent_media_id' => 'unsigned int', + 'place' => 'Object', + 'privacy' => 'string', + 'profile_id' => 'int', + 'proxied_app_id' => 'string', + 'published' => 'bool', + 'qn' => 'string', + 'scheduled_publish_time' => 'unsigned int', + 'spherical_metadata' => 'map', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'target_id' => 'int', + 'targeting' => 'Object', + 'temporary' => 'bool', + 'time_since_original_post' => 'unsigned int', + 'uid' => 'int', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'url' => 'string', + 'user_selected_tags' => 'bool', + 'vault_image_id' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => PhotoBackdatedTimeGranularityValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => PhotoUnpublishedContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breaking_change' => 'breaking_change_enum', + 'height' => 'int', + 'redirect' => 'bool', + 'type' => 'type_enum', + 'width' => 'int', + ); + $enums = array( + 'breaking_change_enum' => ProfilePictureSourceBreakingChangeValues::getInstance()->getValues(), + 'type_enum' => ProfilePictureSourceTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'android_key_hash' => 'string', + 'burn_media_effect' => 'bool', + 'caption' => 'string', + 'composer_session_id' => 'string', + 'has_umg' => 'bool', + 'height' => 'unsigned int', + 'ios_bundle_id' => 'string', + 'media_effect_ids' => 'list', + 'media_effect_source_object_id' => 'int', + 'msqrd_mask_id' => 'string', + 'photo' => 'string', + 'picture' => 'string', + 'profile_pic_method' => 'string', + 'profile_pic_source' => 'string', + 'proxied_app_id' => 'int', + 'qn' => 'string', + 'reuse' => 'bool', + 'scaled_crop_rect' => 'Object', + 'set_profile_photo_shield' => 'string', + 'sticker_id' => 'int', + 'sticker_source_object_id' => 'int', + 'suppress_stories' => 'bool', + 'width' => 'unsigned int', + 'x' => 'unsigned int', + 'y' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_hidden' => 'bool', + 'limit' => 'unsigned int', + 'q' => 'string', + 'show_expired' => 'bool', + 'with' => 'with_enum', + ); + $enums = array( + 'with_enum' => PagePostWithValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/posts', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPublishedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/published_posts', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRatings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ratings', + new Recommendation(), + 'EDGE', + Recommendation::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createReleaseThreadControl(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'recipient' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/release_thread_control', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createRequestThreadControl(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metadata' => 'string', + 'recipient' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/request_thread_control', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRoles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_deactivated' => 'bool', + 'uid' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/roles', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRtbDynamicPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/rtb_dynamic_posts', + new RTBDynamicPost(), + 'EDGE', + RTBDynamicPost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getScheduledPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/scheduled_posts', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSecondaryReceivers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/secondary_receivers', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/settings', + new PageSettings(), + 'EDGE', + PageSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSetting(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'option' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/settings', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getShopSetupStatus(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/shop_setup_status', + new CommerceMerchantSettingsSetupStatus(), + 'EDGE', + CommerceMerchantSettingsSetupStatus::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSubscribedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/subscribed_apps', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSubscribedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/subscribed_apps', + new Application(), + 'EDGE', + Application::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSubscribedApp(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'subscribed_fields' => 'list', + ); + $enums = array( + 'subscribed_fields_enum' => PageSubscribedFieldsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/subscribed_apps', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTabs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tab' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tabs', + new Tab(), + 'EDGE', + Tab::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createTab(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app_id' => 'int', + 'custom_image_url' => 'string', + 'custom_name' => 'string', + 'is_non_connection_landing_tab' => 'bool', + 'position' => 'int', + 'tab' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/tabs', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTagged(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tagged', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createTakeThreadControl(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'metadata' => 'string', + 'recipient' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/take_thread_control', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getThreadOwner(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'recipient' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/thread_owner', + new PageThreadOwner(), + 'EDGE', + PageThreadOwner::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getThreads(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'folder' => 'string', + 'tags' => 'list', + 'user_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/threads', + new UnifiedThread(), + 'EDGE', + UnifiedThread::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTours(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/tours', + new EventTour(), + 'EDGE', + EventTour::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUnlinkAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'psid' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/unlink_accounts', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideoCopyrightRules(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'selected_rule_id' => 'string', + 'source' => 'source_enum', + ); + $enums = array( + 'source_enum' => VideoCopyrightRuleSourceValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/video_copyright_rules', + new VideoCopyrightRule(), + 'EDGE', + VideoCopyrightRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVideoCopyrightRule(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'condition_groups' => 'list', + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/video_copyright_rules', + new VideoCopyrightRule(), + 'EDGE', + VideoCopyrightRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVideoCopyright(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attribution_id' => 'string', + 'content_category' => 'content_category_enum', + 'copyright_content_id' => 'string', + 'excluded_ownership_countries' => 'list', + 'excluded_ownership_segments' => 'list', + 'is_reference_disabled' => 'bool', + 'is_reference_video' => 'bool', + 'monitoring_type' => 'monitoring_type_enum', + 'ownership_countries' => 'list', + 'rule_id' => 'string', + 'tags' => 'list', + 'whitelisted_ids' => 'list', + 'whitelisted_ig_user_ids' => 'list', + ); + $enums = array( + 'content_category_enum' => VideoCopyrightContentCategoryValues::getInstance()->getValues(), + 'monitoring_type_enum' => VideoCopyrightMonitoringTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/video_copyrights', + new VideoCopyright(), + 'EDGE', + VideoCopyright::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideoLists(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/video_lists', + new VideoList(), + 'EDGE', + VideoList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => AdVideoTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_breaks' => 'list', + 'adaptive_type' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'attribution_app_id' => 'string', + 'audio_story_wave_animation_handle' => 'string', + 'backdated_post' => 'list', + 'call_to_action' => 'Object', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'container_type' => 'container_type_enum', + 'content_category' => 'content_category_enum', + 'content_tags' => 'list', + 'creative_tools' => 'string', + 'crossposted_video_id' => 'string', + 'custom_labels' => 'list', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'embeddable' => 'bool', + 'end_offset' => 'unsigned int', + 'expiration' => 'Object', + 'fbuploader_video_file_chunk' => 'string', + 'feed_targeting' => 'Object', + 'file_size' => 'unsigned int', + 'file_url' => 'string', + 'fisheye_video_cropped' => 'bool', + 'formatting' => 'formatting_enum', + 'fov' => 'unsigned int', + 'front_z_rotation' => 'float', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'guide' => 'list>', + 'guide_enabled' => 'bool', + 'has_nickname' => 'bool', + 'holiday_card' => 'string', + 'initial_heading' => 'unsigned int', + 'initial_pitch' => 'unsigned int', + 'instant_game_entry_point_data' => 'string', + 'is_boost_intended' => 'bool', + 'is_explicit_share' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_voice_clip' => 'bool', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'multilingual_data' => 'list', + 'no_story' => 'bool', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_suggestion_mechanism' => 'string', + 'original_fov' => 'unsigned int', + 'original_projection_type' => 'original_projection_type_enum', + 'publish_event_id' => 'unsigned int', + 'published' => 'bool', + 'react_mode_metadata' => 'string', + 'reference_only' => 'bool', + 'referenced_sticker_id' => 'string', + 'replace_video_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'scheduled_publish_time' => 'unsigned int', + 'secret' => 'bool', + 'slideshow_spec' => 'map', + 'social_actions' => 'bool', + 'source' => 'string', + 'source_instagram_media_id' => 'string', + 'specified_dialect' => 'string', + 'spherical' => 'bool', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'start_offset' => 'unsigned int', + 'swap_mode' => 'swap_mode_enum', + 'targeting' => 'Object', + 'text_format_metadata' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumb' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'transcode_setting_properties' => 'string', + 'universal_video_id' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'upload_phase' => 'upload_phase_enum', + 'upload_session_id' => 'string', + 'upload_setting_properties' => 'string', + 'video_asset_id' => 'string', + 'video_file_chunk' => 'string', + 'video_id_original' => 'string', + 'video_start_time_ms' => 'unsigned int', + 'waterfall_id' => 'string', + ); + $enums = array( + 'container_type_enum' => AdVideoContainerTypeValues::getInstance()->getValues(), + 'content_category_enum' => AdVideoContentCategoryValues::getInstance()->getValues(), + 'formatting_enum' => AdVideoFormattingValues::getInstance()->getValues(), + 'original_projection_type_enum' => AdVideoOriginalProjectionTypeValues::getInstance()->getValues(), + 'swap_mode_enum' => AdVideoSwapModeValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => AdVideoUnpublishedContentTypeValues::getInstance()->getValues(), + 'upload_phase_enum' => AdVideoUploadPhaseValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVisitorPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_hidden' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/visitor_posts', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_linking_token' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Page(), + 'NODE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'about' => 'string', + 'accept_crossposting_handshake' => 'list', + 'allow_spherical_photo' => 'bool', + 'attire' => 'attire_enum', + 'begin_crossposting_handshake' => 'list', + 'bio' => 'string', + 'category_list' => 'list', + 'company_overview' => 'string', + 'contact_address' => 'Object', + 'cover' => 'string', + 'culinary_team' => 'string', + 'delivery_and_pickup_option_info' => 'list', + 'description' => 'string', + 'differently_open_offerings' => 'map', + 'directed_by' => 'string', + 'displayed_message_response_time' => 'string', + 'emails' => 'list', + 'focus_x' => 'float', + 'focus_y' => 'float', + 'food_styles' => 'list', + 'general_info' => 'string', + 'general_manager' => 'string', + 'genre' => 'string', + 'hours' => 'map', + 'ignore_coordinate_warnings' => 'bool', + 'impressum' => 'string', + 'instant_articles_submit_for_review' => 'bool', + 'is_always_open' => 'bool', + 'is_permanently_closed' => 'bool', + 'is_published' => 'bool', + 'is_webhooks_subscribed' => 'bool', + 'location' => 'Object', + 'menu' => 'string', + 'mission' => 'string', + 'no_feed_story' => 'bool', + 'no_notification' => 'bool', + 'offset_x' => 'int', + 'offset_y' => 'int', + 'parking' => 'map', + 'payment_options' => 'map', + 'phone' => 'string', + 'pickup_options' => 'list', + 'plot_outline' => 'string', + 'price_range' => 'string', + 'public_transit' => 'string', + 'restaurant_services' => 'map', + 'restaurant_specialties' => 'map', + 'scrape' => 'bool', + 'service_details' => 'string', + 'spherical_metadata' => 'map', + 'start_info' => 'Object', + 'store_location_descriptor' => 'string', + 'temporary_status' => 'temporary_status_enum', + 'website' => 'string', + 'zoom_scale_x' => 'float', + 'zoom_scale_y' => 'float', + ); + $enums = array( + 'attire_enum' => PageAttireValues::getInstance()->getValues(), + 'food_styles_enum' => PageFoodStylesValues::getInstance()->getValues(), + 'pickup_options_enum' => PagePickupOptionsValues::getInstance()->getValues(), + 'temporary_status_enum' => PageTemporaryStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Page(), + 'NODE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageAdminNote.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageAdminNote.php new file mode 100644 index 00000000..b70b00ab --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageAdminNote.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PageAdminNote(), + 'NODE', + PageAdminNote::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCallToAction.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCallToAction.php new file mode 100644 index 00000000..e17bba16 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCallToAction.php @@ -0,0 +1,152 @@ +getValues(); + $ref_enums['IphoneDestinationType'] = PageCallToActionIphoneDestinationTypeValues::getInstance()->getValues(); + $ref_enums['Type'] = PageCallToActionTypeValues::getInstance()->getValues(); + $ref_enums['WebDestinationType'] = PageCallToActionWebDestinationTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PageCallToAction(), + 'NODE', + PageCallToAction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'android_app_id' => 'int', + 'android_deeplink' => 'string', + 'android_destination_type' => 'android_destination_type_enum', + 'android_package_name' => 'string', + 'android_url' => 'string', + 'email_address' => 'string', + 'intl_number_with_plus' => 'string', + 'iphone_app_id' => 'int', + 'iphone_deeplink' => 'string', + 'iphone_destination_type' => 'iphone_destination_type_enum', + 'iphone_url' => 'string', + 'type' => 'type_enum', + 'web_destination_type' => 'web_destination_type_enum', + 'web_url' => 'string', + ); + $enums = array( + 'android_destination_type_enum' => PageCallToActionAndroidDestinationTypeValues::getInstance()->getValues(), + 'iphone_destination_type_enum' => PageCallToActionIphoneDestinationTypeValues::getInstance()->getValues(), + 'type_enum' => PageCallToActionTypeValues::getInstance()->getValues(), + 'web_destination_type_enum' => PageCallToActionWebDestinationTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new PageCallToAction(), + 'NODE', + PageCallToAction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCategory.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCategory.php new file mode 100644 index 00000000..f08deb7f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageCategory.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['BackdatedTimeGranularity'] = PagePostBackdatedTimeGranularityValues::getInstance()->getValues(); + $ref_enums['FeedStoryVisibility'] = PagePostFeedStoryVisibilityValues::getInstance()->getValues(); + $ref_enums['TimelineVisibility'] = PagePostTimelineVisibilityValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAttachments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/attachments', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'feedback_source' => 'string', + 'message' => 'string', + 'nectar_module' => 'string', + 'parent_comment_id' => 'Object', + 'post_id' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDynamicPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/dynamic_posts', + new RTBDynamicPost(), + 'EDGE', + RTBDynamicPost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'metric' => 'list', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'date_preset_enum' => InsightsResultDatePresetValues::getInstance()->getValues(), + 'period_enum' => InsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InsightsResult(), + 'EDGE', + InsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'nectar_module' => 'string', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/likes', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLike(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/likes', + new PagePost(), + 'EDGE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sharedposts', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSponsorTags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sponsor_tags', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/to', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PagePost(), + 'NODE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attached_media' => 'list', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'composer_session_id' => 'string', + 'direct_share_status' => 'unsigned int', + 'feed_story_visibility' => 'feed_story_visibility_enum', + 'is_explicit_location' => 'bool', + 'is_hidden' => 'bool', + 'is_pinned' => 'bool', + 'is_published' => 'bool', + 'message' => 'string', + 'og_action_type_id' => 'string', + 'og_hide_object_attachment' => 'bool', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'place' => 'Object', + 'privacy' => 'string', + 'product_item' => 'Object', + 'scheduled_publish_time' => 'unsigned int', + 'should_sync_product_edit' => 'bool', + 'source_type' => 'string', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'text_format_preset_id' => 'string', + 'timeline_visibility' => 'timeline_visibility_enum', + 'tracking' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => PagePostBackdatedTimeGranularityValues::getInstance()->getValues(), + 'feed_story_visibility_enum' => PagePostFeedStoryVisibilityValues::getInstance()->getValues(), + 'timeline_visibility_enum' => PagePostTimelineVisibilityValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new PagePost(), + 'NODE', + PagePost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageRestaurantServices.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageRestaurantServices.php new file mode 100644 index 00000000..610077e9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageRestaurantServices.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PageSavedFilter(), + 'NODE', + PageSavedFilter::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageSettings.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageSettings.php new file mode 100644 index 00000000..6c0648fa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageSettings.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PageUpcomingChange(), + 'NODE', + PageUpcomingChange::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'accept' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new PageUpcomingChange(), + 'NODE', + PageUpcomingChange::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageUserMessageThreadLabel.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageUserMessageThreadLabel.php new file mode 100644 index 00000000..6027b6b8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PageUserMessageThreadLabel.php @@ -0,0 +1,151 @@ +assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/label', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLabel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/label', + new PageUserMessageThreadLabel(), + 'EDGE', + PageUserMessageThreadLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PageUserMessageThreadLabel(), + 'NODE', + PageUserMessageThreadLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PartnerStudy.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PartnerStudy.php new file mode 100644 index 00000000..36c034e9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PartnerStudy.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PartnerStudy(), + 'NODE', + PartnerStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PaymentPricepoints.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PaymentPricepoints.php new file mode 100644 index 00000000..b4dcbf79 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PaymentPricepoints.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PaymentSubscription(), + 'NODE', + PaymentSubscription::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Permission.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Permission.php new file mode 100644 index 00000000..62a17ce1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Permission.php @@ -0,0 +1,59 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Persona.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Persona.php new file mode 100644 index 00000000..49cbc276 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Persona.php @@ -0,0 +1,103 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Persona(), + 'NODE', + Persona::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Photo.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Photo.php new file mode 100644 index 00000000..7cab5fd7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Photo.php @@ -0,0 +1,334 @@ +getValues(); + $ref_enums['UnpublishedContentType'] = PhotoUnpublishedContentTypeValues::getInstance()->getValues(); + $ref_enums['Type'] = PhotoTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'facepile_mentioned_ids' => 'list', + 'feedback_source' => 'string', + 'is_offline' => 'bool', + 'message' => 'string', + 'nectar_module' => 'string', + 'object_id' => 'string', + 'parent_comment_id' => 'Object', + 'text' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'metric' => 'list', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'date_preset_enum' => InsightsResultDatePresetValues::getInstance()->getValues(), + 'period_enum' => InsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InsightsResult(), + 'EDGE', + InsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLike(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'notify' => 'bool', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/likes', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sharedposts', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSponsorTags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sponsor_tags', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Photo(), + 'NODE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Place.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Place.php new file mode 100644 index 00000000..9de3854f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Place.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Place(), + 'NODE', + Place::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlaceTopic.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlaceTopic.php new file mode 100644 index 00000000..ae548085 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlaceTopic.php @@ -0,0 +1,87 @@ +assureId(); + + $param_types = array( + 'icon_size' => 'icon_size_enum', + ); + $enums = array( + 'icon_size_enum' => array( + '24', + '36', + '48', + '72', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PlaceTopic(), + 'NODE', + PlaceTopic::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlatformImageSource.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlatformImageSource.php new file mode 100644 index 00000000..00bc4d43 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PlatformImageSource.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PlayableContent(), + 'NODE', + PlayableContent::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Post.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Post.php new file mode 100644 index 00000000..cca2dd8a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Post.php @@ -0,0 +1,597 @@ +getValues(); + $ref_enums['FeedStoryVisibility'] = PostFeedStoryVisibilityValues::getInstance()->getValues(); + $ref_enums['TimelineVisibility'] = PostTimelineVisibilityValues::getInstance()->getValues(); + $ref_enums['CheckinEntryPoint'] = PostCheckinEntryPointValues::getInstance()->getValues(); + $ref_enums['Formatting'] = PostFormattingValues::getInstance()->getValues(); + $ref_enums['PlaceAttachmentSetting'] = PostPlaceAttachmentSettingValues::getInstance()->getValues(); + $ref_enums['PostSurfacesBlacklist'] = PostPostSurfacesBlacklistValues::getInstance()->getValues(); + $ref_enums['PostingToRedspace'] = PostPostingToRedspaceValues::getInstance()->getValues(); + $ref_enums['TargetSurface'] = PostTargetSurfaceValues::getInstance()->getValues(); + $ref_enums['UnpublishedContentType'] = PostUnpublishedContentTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAttachments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/attachments', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getComments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createComment(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attachment_id' => 'string', + 'attachment_share_url' => 'string', + 'attachment_url' => 'string', + 'comment' => 'string', + 'comment_privacy_value' => 'comment_privacy_value_enum', + 'feedback_source' => 'string', + 'message' => 'string', + 'nectar_module' => 'string', + 'parent_comment_id' => 'Object', + 'post_id' => 'string', + 'tracking' => 'string', + ); + $enums = array( + 'comment_privacy_value_enum' => CommentCommentPrivacyValueValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDynamicPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/dynamic_posts', + new RTBDynamicPost(), + 'EDGE', + RTBDynamicPost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getInsights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'date_preset' => 'date_preset_enum', + 'metric' => 'list', + 'period' => 'period_enum', + 'since' => 'datetime', + 'until' => 'datetime', + ); + $enums = array( + 'date_preset_enum' => InsightsResultDatePresetValues::getInstance()->getValues(), + 'period_enum' => InsightsResultPeriodValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/insights', + new InsightsResult(), + 'EDGE', + InsightsResult::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'nectar_module' => 'string', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/likes', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLike(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'feedback_source' => 'string', + 'nectar_module' => 'string', + 'tracking' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/likes', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPromotion(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ad_account_id' => 'string', + 'ad_conversion_pixel_id' => 'unsigned int', + 'audience' => 'audience_enum', + 'audience_id' => 'string', + 'bid_amount' => 'unsigned int', + 'budget' => 'unsigned int', + 'cta_type' => 'cta_type_enum', + 'currency' => 'string', + 'flow_id' => 'string', + 'placement' => 'string', + 'start_time' => 'unsigned int', + 'stop_time' => 'unsigned int', + 'targeting' => 'Targeting', + ); + $enums = array( + 'audience_enum' => array( + 'AUTO_LOOKALIKE', + 'AUTO_PAGE_LOOKALIKE', + 'AUTO_TARGETING', + 'COUNTRY_AND_INTEREST', + 'CREATE_NEW', + 'CUSTOM_AUDIENCE', + 'DISTRICT', + 'EVENT_CUSTOM_AUDIENCES', + 'EVENT_ENGAGEMENT', + 'FANS', + 'GROUPER', + 'HEC_AUDIENCE', + 'IG_PROMOTED_POST_AUTO', + 'LOCAL', + 'LOOKALIKE', + 'MARKETPLACE_DEFAULT', + 'MARKETPLACE_NATIONWIDE_AUDIENCE', + 'MARKETPLACE_SAVED_AUDIENCE', + 'MULT_CUSTOM_AUDIENCES', + 'NCPP', + 'SAVED_AUDIENCE', + 'SMART_AUDIENCE', + ), + 'cta_type_enum' => array( + 'ADD_TO_CART', + 'APPLY_NOW', + 'BOOK_TRAVEL', + 'BUY', + 'BUY_NOW', + 'BUY_TICKETS', + 'CALL', + 'CALL_ME', + 'CONTACT', + 'CONTACT_US', + 'DONATE', + 'DONATE_NOW', + 'DOWNLOAD', + 'EVENT_RSVP', + 'FIND_A_GROUP', + 'FIND_YOUR_GROUPS', + 'FOLLOW_NEWS_STORYLINE', + 'FOLLOW_PAGE', + 'FOLLOW_USER', + 'GET_DIRECTIONS', + 'GET_OFFER', + 'GET_OFFER_VIEW', + 'GET_QUOTE', + 'GET_SHOWTIMES', + 'INSTALL_APP', + 'INSTALL_MOBILE_APP', + 'LEARN_MORE', + 'LIKE_PAGE', + 'LISTEN_MUSIC', + 'LISTEN_NOW', + 'MESSAGE_PAGE', + 'MOBILE_DOWNLOAD', + 'MOMENTS', + 'NO_BUTTON', + 'OPEN_LINK', + 'ORDER_NOW', + 'PAY_TO_ACCESS', + 'PLAY_GAME', + 'PURCHASE_GIFT_CARDS', + 'RECORD_NOW', + 'REFER_FRIENDS', + 'REQUEST_TIME', + 'SAY_THANKS', + 'SEE_MORE', + 'SELL_NOW', + 'SEND_A_GIFT', + 'SHARE', + 'SHOP_NOW', + 'SIGN_UP', + 'SOTTO_SUBSCRIBE', + 'START_ORDER', + 'SUBSCRIBE', + 'SWIPE_UP_PRODUCT', + 'SWIPE_UP_SHOP', + 'UPDATE_APP', + 'USE_APP', + 'USE_MOBILE_APP', + 'VIDEO_ANNOTATION', + 'VISIT_PAGES_FEED', + 'WATCH_MORE', + 'WATCH_VIDEO', + 'WHATSAPP_MESSAGE', + 'WOODHENGE_SUPPORT', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/promotions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getReactions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => ProfileTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/reactions', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSharedPosts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sharedposts', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSponsorTags(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/sponsor_tags', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getTo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/to', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Post(), + 'NODE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attached_media' => 'list', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'composer_session_id' => 'string', + 'direct_share_status' => 'unsigned int', + 'feed_story_visibility' => 'feed_story_visibility_enum', + 'is_explicit_location' => 'bool', + 'is_hidden' => 'bool', + 'is_pinned' => 'bool', + 'is_published' => 'bool', + 'message' => 'string', + 'og_action_type_id' => 'string', + 'og_hide_object_attachment' => 'bool', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'place' => 'Object', + 'privacy' => 'string', + 'product_item' => 'Object', + 'scheduled_publish_time' => 'unsigned int', + 'should_sync_product_edit' => 'bool', + 'source_type' => 'string', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'text_format_preset_id' => 'string', + 'timeline_visibility' => 'timeline_visibility_enum', + 'tracking' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => PostBackdatedTimeGranularityValues::getInstance()->getValues(), + 'feed_story_visibility_enum' => PostFeedStoryVisibilityValues::getInstance()->getValues(), + 'timeline_visibility_enum' => PostTimelineVisibilityValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Post(), + 'NODE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Privacy.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Privacy.php new file mode 100644 index 00000000..4d6669df --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Privacy.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['PermittedRoles'] = ProductCatalogPermittedRolesValues::getInstance()->getValues(); + $ref_enums['PermittedTasks'] = ProductCatalogPermittedTasksValues::getInstance()->getValues(); + $ref_enums['Tasks'] = ProductCatalogTasksValues::getInstance()->getValues(); + $ref_enums['Standard'] = ProductCatalogStandardValues::getInstance()->getValues(); + $ref_enums['ItemSubType'] = ProductCatalogItemSubTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/agencies', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAgencies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/agencies', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAgency(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + 'permitted_roles' => 'list', + 'permitted_tasks' => 'list', + 'utm_settings' => 'map', + ); + $enums = array( + 'permitted_roles_enum' => ProductCatalogPermittedRolesValues::getInstance()->getValues(), + 'permitted_tasks_enum' => ProductCatalogPermittedTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/agencies', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/assigned_users', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_users', + new AssignedUser(), + 'EDGE', + AssignedUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAssignedUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tasks' => 'list', + 'user' => 'int', + ); + $enums = array( + 'tasks_enum' => ProductCatalogTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assigned_users', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAutomotiveModels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/automotive_models', + new AutomotiveModel(), + 'EDGE', + AutomotiveModel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_upsert' => 'bool', + 'fbe_external_business_id' => 'string', + 'requests' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/batch', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCategories(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'categorization_criteria' => 'categorization_criteria_enum', + 'filter' => 'Object', + ); + $enums = array( + 'categorization_criteria_enum' => ProductCatalogCategoryCategorizationCriteriaValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/categories', + new ProductCatalogCategory(), + 'EDGE', + ProductCatalogCategory::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createCategory(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/categories', + new ProductCatalogCategory(), + 'EDGE', + ProductCatalogCategory::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCheckBatchRequestStatus(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'handle' => 'string', + 'load_ids_of_invalid_requests' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/check_batch_request_status', + new CheckBatchRequestStatus(), + 'EDGE', + CheckBatchRequestStatus::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCollaborativeAdsShareSettings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/collaborative_ads_share_settings', + new CollaborativeAdsShareSettings(), + 'EDGE', + CollaborativeAdsShareSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDestinations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/destinations', + new Destination(), + 'EDGE', + Destination::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getEventStats(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breakdowns' => 'list', + ); + $enums = array( + 'breakdowns_enum' => ProductEventStatBreakdownsValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/event_stats', + new ProductEventStat(), + 'EDGE', + ProductEventStat::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteExternalEventSources(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'external_event_sources' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/external_event_sources', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getExternalEventSources(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/external_event_sources', + new ExternalEventSource(), + 'EDGE', + ExternalEventSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createExternalEventSource(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'external_event_sources' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/external_event_sources', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFlights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/flights', + new Flight(), + 'EDGE', + Flight::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHomeListings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/home_listings', + new HomeListing(), + 'EDGE', + HomeListing::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createHomeListing(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'address' => 'Object', + 'availability' => 'string', + 'currency' => 'string', + 'description' => 'string', + 'home_listing_id' => 'string', + 'images' => 'list', + 'listing_type' => 'string', + 'name' => 'string', + 'num_baths' => 'float', + 'num_beds' => 'float', + 'num_units' => 'float', + 'price' => 'float', + 'property_type' => 'string', + 'url' => 'string', + 'year_built' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/home_listings', + new HomeListing(), + 'EDGE', + HomeListing::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHotelRoomsBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'handle' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/hotel_rooms_batch', + new ProductCatalogHotelRoomsBatch(), + 'EDGE', + ProductCatalogHotelRoomsBatch::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createHotelRoomsBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'file' => 'file', + 'password' => 'string', + 'standard' => 'standard_enum', + 'update_only' => 'bool', + 'url' => 'string', + 'username' => 'string', + ); + $enums = array( + 'standard_enum' => ProductCatalogStandardValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/hotel_rooms_batch', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHotels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/hotels', + new Hotel(), + 'EDGE', + Hotel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createHotel(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'address' => 'Object', + 'applinks' => 'Object', + 'base_price' => 'unsigned int', + 'brand' => 'string', + 'currency' => 'string', + 'description' => 'string', + 'guest_ratings' => 'list', + 'hotel_id' => 'string', + 'images' => 'list', + 'name' => 'string', + 'phone' => 'string', + 'star_rating' => 'float', + 'url' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/hotels', + new Hotel(), + 'EDGE', + Hotel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createItemsBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_upsert' => 'bool', + 'item_sub_type' => 'item_sub_type_enum', + 'item_type' => 'string', + 'requests' => 'map', + ); + $enums = array( + 'item_sub_type_enum' => ProductCatalogItemSubTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/items_batch', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPricingVariablesBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'handle' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/pricing_variables_batch', + new ProductCatalogPricingVariablesBatch(), + 'EDGE', + ProductCatalogPricingVariablesBatch::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPricingVariablesBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'file' => 'file', + 'password' => 'string', + 'standard' => 'standard_enum', + 'update_only' => 'bool', + 'url' => 'string', + 'username' => 'string', + ); + $enums = array( + 'standard_enum' => ProductCatalogStandardValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/pricing_variables_batch', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProductFeeds(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_feeds', + new ProductFeed(), + 'EDGE', + ProductFeed::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createProductFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'country' => 'string', + 'default_currency' => 'string', + 'deletion_enabled' => 'bool', + 'delimiter' => 'delimiter_enum', + 'encoding' => 'encoding_enum', + 'feed_type' => 'feed_type_enum', + 'file_name' => 'string', + 'item_sub_type' => 'item_sub_type_enum', + 'migrated_from_feed_id' => 'string', + 'name' => 'string', + 'override_type' => 'override_type_enum', + 'override_value' => 'string', + 'quoted_fields_mode' => 'quoted_fields_mode_enum', + 'rules' => 'list', + 'schedule' => 'string', + 'update_schedule' => 'string', + 'whitelisted_properties' => 'list', + ); + $enums = array( + 'delimiter_enum' => ProductFeedDelimiterValues::getInstance()->getValues(), + 'encoding_enum' => ProductFeedEncodingValues::getInstance()->getValues(), + 'feed_type_enum' => ProductFeedFeedTypeValues::getInstance()->getValues(), + 'item_sub_type_enum' => ProductFeedItemSubTypeValues::getInstance()->getValues(), + 'override_type_enum' => ProductFeedOverrideTypeValues::getInstance()->getValues(), + 'quoted_fields_mode_enum' => ProductFeedQuotedFieldsModeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/product_feeds', + new ProductFeed(), + 'EDGE', + ProductFeed::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProductGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_groups', + new ProductGroup(), + 'EDGE', + ProductGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createProductGroup(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'retailer_id' => 'string', + 'variants' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/product_groups', + new ProductGroup(), + 'EDGE', + ProductGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProductSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'ancestor_id' => 'string', + 'has_children' => 'bool', + 'parent_id' => 'string', + 'retailer_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_sets', + new ProductSet(), + 'EDGE', + ProductSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createProductSet(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'Object', + 'metadata' => 'map', + 'name' => 'string', + 'retailer_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/product_sets', + new ProductSet(), + 'EDGE', + ProductSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProductSetsBatch(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'handle' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_sets_batch', + new ProductCatalogProductSetsBatch(), + 'EDGE', + ProductCatalogProductSetsBatch::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProducts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + 'return_only_approved_products' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/products', + new ProductItem(), + 'EDGE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createProduct(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'additional_image_files' => 'list', + 'additional_image_urls' => 'list', + 'additional_uploaded_image_ids' => 'list', + 'additional_variant_attributes' => 'map', + 'android_app_name' => 'string', + 'android_class' => 'string', + 'android_package' => 'string', + 'android_url' => 'string', + 'availability' => 'availability_enum', + 'brand' => 'string', + 'category' => 'string', + 'category_specific_fields' => 'map', + 'checkout_url' => 'string', + 'color' => 'string', + 'commerce_tax_category' => 'commerce_tax_category_enum', + 'condition' => 'condition_enum', + 'currency' => 'string', + 'custom_data' => 'map', + 'custom_label_0' => 'string', + 'custom_label_1' => 'string', + 'custom_label_2' => 'string', + 'custom_label_3' => 'string', + 'custom_label_4' => 'string', + 'description' => 'string', + 'expiration_date' => 'string', + 'fb_product_category' => 'string', + 'gender' => 'gender_enum', + 'gtin' => 'string', + 'image_url' => 'string', + 'inventory' => 'unsigned int', + 'ios_app_name' => 'string', + 'ios_app_store_id' => 'unsigned int', + 'ios_url' => 'string', + 'ipad_app_name' => 'string', + 'ipad_app_store_id' => 'unsigned int', + 'ipad_url' => 'string', + 'iphone_app_name' => 'string', + 'iphone_app_store_id' => 'unsigned int', + 'iphone_url' => 'string', + 'launch_date' => 'string', + 'manufacturer_part_number' => 'string', + 'material' => 'string', + 'mobile_link' => 'string', + 'name' => 'string', + 'offer_price_amount' => 'unsigned int', + 'offer_price_end_date' => 'datetime', + 'offer_price_start_date' => 'datetime', + 'ordering_index' => 'unsigned int', + 'pattern' => 'string', + 'price' => 'unsigned int', + 'product_type' => 'string', + 'retailer_id' => 'string', + 'retailer_product_group_id' => 'string', + 'return_policy_days' => 'unsigned int', + 'sale_price' => 'unsigned int', + 'sale_price_end_date' => 'datetime', + 'sale_price_start_date' => 'datetime', + 'short_description' => 'string', + 'size' => 'string', + 'start_date' => 'string', + 'url' => 'string', + 'visibility' => 'visibility_enum', + 'windows_phone_app_id' => 'string', + 'windows_phone_app_name' => 'string', + 'windows_phone_url' => 'string', + ); + $enums = array( + 'availability_enum' => ProductItemAvailabilityValues::getInstance()->getValues(), + 'commerce_tax_category_enum' => ProductItemCommerceTaxCategoryValues::getInstance()->getValues(), + 'condition_enum' => ProductItemConditionValues::getInstance()->getValues(), + 'gender_enum' => ProductItemGenderValues::getInstance()->getValues(), + 'visibility_enum' => ProductItemVisibilityValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/products', + new ProductItem(), + 'EDGE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVehicleOffers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/vehicle_offers', + new VehicleOffer(), + 'EDGE', + VehicleOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVehicles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/vehicles', + new Vehicle(), + 'EDGE', + Vehicle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVehicle(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'address' => 'map', + 'applinks' => 'Object', + 'availability' => 'availability_enum', + 'body_style' => 'body_style_enum', + 'condition' => 'condition_enum', + 'currency' => 'string', + 'date_first_on_lot' => 'string', + 'dealer_id' => 'string', + 'dealer_name' => 'string', + 'dealer_phone' => 'string', + 'description' => 'string', + 'drivetrain' => 'drivetrain_enum', + 'exterior_color' => 'string', + 'fb_page_id' => 'string', + 'fuel_type' => 'fuel_type_enum', + 'images' => 'list', + 'interior_color' => 'string', + 'make' => 'string', + 'mileage' => 'map', + 'model' => 'string', + 'price' => 'unsigned int', + 'state_of_vehicle' => 'state_of_vehicle_enum', + 'title' => 'string', + 'transmission' => 'transmission_enum', + 'trim' => 'string', + 'url' => 'string', + 'vehicle_id' => 'string', + 'vehicle_type' => 'vehicle_type_enum', + 'vin' => 'string', + 'year' => 'unsigned int', + ); + $enums = array( + 'availability_enum' => VehicleAvailabilityValues::getInstance()->getValues(), + 'body_style_enum' => VehicleBodyStyleValues::getInstance()->getValues(), + 'condition_enum' => VehicleConditionValues::getInstance()->getValues(), + 'drivetrain_enum' => VehicleDrivetrainValues::getInstance()->getValues(), + 'fuel_type_enum' => VehicleFuelTypeValues::getInstance()->getValues(), + 'state_of_vehicle_enum' => VehicleStateOfVehicleValues::getInstance()->getValues(), + 'transmission_enum' => VehicleTransmissionValues::getInstance()->getValues(), + 'vehicle_type_enum' => VehicleVehicleTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/vehicles', + new Vehicle(), + 'EDGE', + Vehicle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'segment_use_cases' => 'list', + ); + $enums = array( + 'segment_use_cases_enum' => array( + 'COLLAB_ADS', + 'COLLAB_ADS_FOR_MARKETPLACE_PARTNER', + 'COLLAB_ADS_SEGMENT_WITHOUT_SEGMENT_SYNCING', + 'IG_SHOPPING', + 'IG_SHOPPING_SUGGESTED_PRODUCTS', + 'MARKETPLACE_SHOPS', + 'TEST', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductCatalog(), + 'NODE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'da_display_settings' => 'Object', + 'default_image_url' => 'string', + 'destination_catalog_settings' => 'map', + 'fallback_image_url' => 'string', + 'flight_catalog_settings' => 'map', + 'name' => 'string', + 'store_catalog_settings' => 'map', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductCatalog(), + 'NODE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + /** + * @param int $user_id + * @param string $role + */ + public function addUserPermission($user_id, $role) { + $params = array( + 'user' => $user_id, + 'role' => $role, + ); + $this->getApi()->call( + '/'.$this->assureId().'/userpermissions', + RequestInterface::METHOD_POST, + $params); + } + + /** + * @param int $user_id + */ + public function deleteUserPermission($user_id) { + $params = array( + 'user' => $user_id, + ); + $this->getApi()->call( + '/'.$this->assureId().'/userpermissions', + RequestInterface::METHOD_DELETE, + $params); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogCategory.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogCategory.php new file mode 100644 index 00000000..2a5d6798 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogCategory.php @@ -0,0 +1,66 @@ +getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogHotelRoomsBatch.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogHotelRoomsBatch.php new file mode 100644 index 00000000..33b47287 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductCatalogHotelRoomsBatch.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Event'] = ProductEventStatEventValues::getInstance()->getValues(); + $ref_enums['Breakdowns'] = ProductEventStatBreakdownsValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeed.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeed.php new file mode 100644 index 00000000..96f57245 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeed.php @@ -0,0 +1,507 @@ +getValues(); + $ref_enums['QuotedFieldsMode'] = ProductFeedQuotedFieldsModeValues::getInstance()->getValues(); + $ref_enums['Encoding'] = ProductFeedEncodingValues::getInstance()->getValues(); + $ref_enums['FeedType'] = ProductFeedFeedTypeValues::getInstance()->getValues(); + $ref_enums['ItemSubType'] = ProductFeedItemSubTypeValues::getInstance()->getValues(); + $ref_enums['OverrideType'] = ProductFeedOverrideTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getAutomotiveModels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/automotive_models', + new AutomotiveModel(), + 'EDGE', + AutomotiveModel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDestinations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/destinations', + new Destination(), + 'EDGE', + Destination::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFlights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/flights', + new Flight(), + 'EDGE', + Flight::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHomeListings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/home_listings', + new HomeListing(), + 'EDGE', + HomeListing::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHotels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/hotels', + new Hotel(), + 'EDGE', + Hotel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProducts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/products', + new ProductItem(), + 'EDGE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRules(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/rules', + new ProductFeedRule(), + 'EDGE', + ProductFeedRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createRule(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'attribute' => 'string', + 'params' => 'map', + 'rule_type' => 'rule_type_enum', + ); + $enums = array( + 'rule_type_enum' => ProductFeedRuleRuleTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/rules', + new ProductFeedRule(), + 'EDGE', + ProductFeedRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getUploadSchedules(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/upload_schedules', + new ProductFeedSchedule(), + 'EDGE', + ProductFeedSchedule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUploadSchedule(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'upload_schedule' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/upload_schedules', + new ProductFeed(), + 'EDGE', + ProductFeed::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getUploads(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/uploads', + new ProductFeedUpload(), + 'EDGE', + ProductFeedUpload::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createUpload(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'fbe_external_business_id' => 'string', + 'file' => 'file', + 'password' => 'string', + 'update_only' => 'bool', + 'url' => 'string', + 'username' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/uploads', + new ProductFeedUpload(), + 'EDGE', + ProductFeedUpload::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVehicleOffers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/vehicle_offers', + new VehicleOffer(), + 'EDGE', + VehicleOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVehicles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/vehicles', + new Vehicle(), + 'EDGE', + Vehicle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductFeed(), + 'NODE', + ProductFeed::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'default_currency' => 'string', + 'deletion_enabled' => 'bool', + 'delimiter' => 'delimiter_enum', + 'encoding' => 'encoding_enum', + 'migrated_from_feed_id' => 'string', + 'name' => 'string', + 'quoted_fields_mode' => 'quoted_fields_mode_enum', + 'schedule' => 'string', + 'update_schedule' => 'string', + ); + $enums = array( + 'delimiter_enum' => ProductFeedDelimiterValues::getInstance()->getValues(), + 'encoding_enum' => ProductFeedEncodingValues::getInstance()->getValues(), + 'quoted_fields_mode_enum' => ProductFeedQuotedFieldsModeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductFeed(), + 'NODE', + ProductFeed::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedMissingFeedItemReplacement.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedMissingFeedItemReplacement.php new file mode 100644 index 00000000..c1144c39 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedMissingFeedItemReplacement.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductFeedRule(), + 'NODE', + ProductFeedRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'params' => 'map', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductFeedRule(), + 'NODE', + ProductFeedRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedRuleSuggestion.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedRuleSuggestion.php new file mode 100644 index 00000000..20bae009 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedRuleSuggestion.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Interval'] = ProductFeedScheduleIntervalValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductFeedSchedule(), + 'NODE', + ProductFeedSchedule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'upload_schedule' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductFeedSchedule(), + 'NODE', + ProductFeedSchedule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUpload.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUpload.php new file mode 100644 index 00000000..3c5a8435 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUpload.php @@ -0,0 +1,135 @@ +getValues(); + return $ref_enums; + } + + + public function createErrorReport(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/error_report', + new ProductFeedUpload(), + 'EDGE', + ProductFeedUpload::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getErrors(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/errors', + new ProductFeedUploadError(), + 'EDGE', + ProductFeedUploadError::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductFeedUpload(), + 'NODE', + ProductFeedUpload::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadDiagnosticsReport.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadDiagnosticsReport.php new file mode 100644 index 00000000..28931aa6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadDiagnosticsReport.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Severity'] = ProductFeedUploadErrorSeverityValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSamples(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/samples', + new ProductFeedUploadErrorSample(), + 'EDGE', + ProductFeedUploadErrorSample::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSuggestedRules(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/suggested_rules', + new ProductFeedRuleSuggestion(), + 'EDGE', + ProductFeedRuleSuggestion::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductFeedUploadError(), + 'NODE', + ProductFeedUploadError::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadErrorReport.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadErrorReport.php new file mode 100644 index 00000000..ff431e3a --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductFeedUploadErrorReport.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductFeedUploadErrorSample(), + 'NODE', + ProductFeedUploadErrorSample::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductGroup.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductGroup.php new file mode 100644 index 00000000..abbe690f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductGroup.php @@ -0,0 +1,252 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/products', + new ProductItem(), + 'EDGE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createProduct(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'additional_image_urls' => 'list', + 'additional_variant_attributes' => 'map', + 'android_app_name' => 'string', + 'android_class' => 'string', + 'android_package' => 'string', + 'android_url' => 'string', + 'availability' => 'availability_enum', + 'brand' => 'string', + 'category' => 'string', + 'checkout_url' => 'string', + 'color' => 'string', + 'commerce_tax_category' => 'commerce_tax_category_enum', + 'condition' => 'condition_enum', + 'currency' => 'string', + 'custom_data' => 'map', + 'custom_label_0' => 'string', + 'custom_label_1' => 'string', + 'custom_label_2' => 'string', + 'custom_label_3' => 'string', + 'custom_label_4' => 'string', + 'description' => 'string', + 'expiration_date' => 'string', + 'fb_product_category' => 'string', + 'gender' => 'gender_enum', + 'gtin' => 'string', + 'image_url' => 'string', + 'inventory' => 'unsigned int', + 'ios_app_name' => 'string', + 'ios_app_store_id' => 'unsigned int', + 'ios_url' => 'string', + 'ipad_app_name' => 'string', + 'ipad_app_store_id' => 'unsigned int', + 'ipad_url' => 'string', + 'iphone_app_name' => 'string', + 'iphone_app_store_id' => 'unsigned int', + 'iphone_url' => 'string', + 'launch_date' => 'string', + 'manufacturer_part_number' => 'string', + 'material' => 'string', + 'mobile_link' => 'string', + 'name' => 'string', + 'offer_price_amount' => 'unsigned int', + 'offer_price_end_date' => 'datetime', + 'offer_price_start_date' => 'datetime', + 'ordering_index' => 'unsigned int', + 'pattern' => 'string', + 'price' => 'unsigned int', + 'product_type' => 'string', + 'retailer_id' => 'string', + 'return_policy_days' => 'unsigned int', + 'sale_price' => 'unsigned int', + 'sale_price_end_date' => 'datetime', + 'sale_price_start_date' => 'datetime', + 'short_description' => 'string', + 'size' => 'string', + 'start_date' => 'string', + 'url' => 'string', + 'visibility' => 'visibility_enum', + 'windows_phone_app_id' => 'string', + 'windows_phone_app_name' => 'string', + 'windows_phone_url' => 'string', + ); + $enums = array( + 'availability_enum' => ProductItemAvailabilityValues::getInstance()->getValues(), + 'commerce_tax_category_enum' => ProductItemCommerceTaxCategoryValues::getInstance()->getValues(), + 'condition_enum' => ProductItemConditionValues::getInstance()->getValues(), + 'gender_enum' => ProductItemGenderValues::getInstance()->getValues(), + 'visibility_enum' => ProductItemVisibilityValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/products', + new ProductItem(), + 'EDGE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductGroup(), + 'NODE', + ProductGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'default_product_id' => 'string', + 'variants' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductGroup(), + 'NODE', + ProductGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItem.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItem.php new file mode 100644 index 00000000..2e8820ee --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItem.php @@ -0,0 +1,243 @@ +getValues(); + $ref_enums['Availability'] = ProductItemAvailabilityValues::getInstance()->getValues(); + $ref_enums['Condition'] = ProductItemConditionValues::getInstance()->getValues(); + $ref_enums['Gender'] = ProductItemGenderValues::getInstance()->getValues(); + $ref_enums['ReviewStatus'] = ProductItemReviewStatusValues::getInstance()->getValues(); + $ref_enums['ShippingWeightUnit'] = ProductItemShippingWeightUnitValues::getInstance()->getValues(); + $ref_enums['Visibility'] = ProductItemVisibilityValues::getInstance()->getValues(); + $ref_enums['CommerceTaxCategory'] = ProductItemCommerceTaxCategoryValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getProductSets(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/product_sets', + new ProductSet(), + 'EDGE', + ProductSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'image_height' => 'unsigned int', + 'image_width' => 'unsigned int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductItem(), + 'NODE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'additional_image_files' => 'list', + 'additional_image_urls' => 'list', + 'additional_uploaded_image_ids' => 'list', + 'additional_variant_attributes' => 'map', + 'android_app_name' => 'string', + 'android_class' => 'string', + 'android_package' => 'string', + 'android_url' => 'string', + 'availability' => 'availability_enum', + 'brand' => 'string', + 'category' => 'string', + 'category_specific_fields' => 'map', + 'checkout_url' => 'string', + 'color' => 'string', + 'commerce_tax_category' => 'commerce_tax_category_enum', + 'condition' => 'condition_enum', + 'currency' => 'string', + 'custom_data' => 'map', + 'custom_label_0' => 'string', + 'custom_label_1' => 'string', + 'custom_label_2' => 'string', + 'custom_label_3' => 'string', + 'custom_label_4' => 'string', + 'description' => 'string', + 'expiration_date' => 'string', + 'fb_product_category' => 'string', + 'gender' => 'gender_enum', + 'gtin' => 'string', + 'image_url' => 'string', + 'inventory' => 'unsigned int', + 'ios_app_name' => 'string', + 'ios_app_store_id' => 'unsigned int', + 'ios_url' => 'string', + 'ipad_app_name' => 'string', + 'ipad_app_store_id' => 'unsigned int', + 'ipad_url' => 'string', + 'iphone_app_name' => 'string', + 'iphone_app_store_id' => 'unsigned int', + 'iphone_url' => 'string', + 'launch_date' => 'string', + 'manufacturer_part_number' => 'string', + 'material' => 'string', + 'mobile_link' => 'string', + 'name' => 'string', + 'offer_price_amount' => 'unsigned int', + 'offer_price_end_date' => 'datetime', + 'offer_price_start_date' => 'datetime', + 'ordering_index' => 'unsigned int', + 'pattern' => 'string', + 'price' => 'unsigned int', + 'product_type' => 'string', + 'retailer_id' => 'string', + 'return_policy_days' => 'unsigned int', + 'sale_price' => 'unsigned int', + 'sale_price_end_date' => 'datetime', + 'sale_price_start_date' => 'datetime', + 'short_description' => 'string', + 'size' => 'string', + 'start_date' => 'string', + 'url' => 'string', + 'visibility' => 'visibility_enum', + 'windows_phone_app_id' => 'string', + 'windows_phone_app_name' => 'string', + 'windows_phone_url' => 'string', + ); + $enums = array( + 'availability_enum' => ProductItemAvailabilityValues::getInstance()->getValues(), + 'commerce_tax_category_enum' => ProductItemCommerceTaxCategoryValues::getInstance()->getValues(), + 'condition_enum' => ProductItemConditionValues::getInstance()->getValues(), + 'gender_enum' => ProductItemGenderValues::getInstance()->getValues(), + 'visibility_enum' => ProductItemVisibilityValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductItem(), + 'NODE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItemCommerceInsights.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItemCommerceInsights.php new file mode 100644 index 00000000..ce13896c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductItemCommerceInsights.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/automotive_models', + new AutomotiveModel(), + 'EDGE', + AutomotiveModel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getDestinations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/destinations', + new Destination(), + 'EDGE', + Destination::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFlights(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/flights', + new Flight(), + 'EDGE', + Flight::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHomeListings(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/home_listings', + new HomeListing(), + 'EDGE', + HomeListing::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getHotels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/hotels', + new Hotel(), + 'EDGE', + Hotel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getProducts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/products', + new ProductItem(), + 'EDGE', + ProductItem::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVehicleOffers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/vehicle_offers', + new VehicleOffer(), + 'EDGE', + VehicleOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVehicles(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'bulk_pagination' => 'bool', + 'filter' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/vehicles', + new Vehicle(), + 'EDGE', + Vehicle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'allow_live_product_set_deletion' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ProductSet(), + 'NODE', + ProductSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filter' => 'Object', + 'metadata' => 'map', + 'name' => 'string', + 'retailer_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ProductSet(), + 'NODE', + ProductSet::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductSetMetadata.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductSetMetadata.php new file mode 100644 index 00000000..200ee562 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProductSetMetadata.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['Type'] = ProfileTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breaking_change' => 'breaking_change_enum', + 'height' => 'int', + 'redirect' => 'bool', + 'type' => 'type_enum', + 'width' => 'int', + ); + $enums = array( + 'breaking_change_enum' => ProfilePictureSourceBreakingChangeValues::getInstance()->getValues(), + 'type_enum' => ProfilePictureSourceTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Profile(), + 'NODE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProfilePictureSource.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProfilePictureSource.php new file mode 100644 index 00000000..e17b6c55 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ProfilePictureSource.php @@ -0,0 +1,61 @@ +getValues(); + $ref_enums['BreakingChange'] = ProfilePictureSourceBreakingChangeValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PublisherBlockList.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PublisherBlockList.php new file mode 100644 index 00000000..1d245efd --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/PublisherBlockList.php @@ -0,0 +1,185 @@ +assureId(); + + $param_types = array( + 'publisher_urls' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/append_publisher_urls', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPagedWebPublishers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'draft_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/paged_web_publishers', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'account_id' => 'unsigned int', + 'business_id' => 'string', + 'draft_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new PublisherBlockList(), + 'NODE', + PublisherBlockList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'spec' => 'Object', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new PublisherBlockList(), + 'NODE', + PublisherBlockList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RTBDynamicPost.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RTBDynamicPost.php new file mode 100644 index 00000000..9b99f93e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RTBDynamicPost.php @@ -0,0 +1,136 @@ +assureId(); + + $param_types = array( + 'filter' => 'filter_enum', + 'live_filter' => 'live_filter_enum', + 'order' => 'order_enum', + 'since' => 'datetime', + ); + $enums = array( + 'filter_enum' => CommentFilterValues::getInstance()->getValues(), + 'live_filter_enum' => CommentLiveFilterValues::getInstance()->getValues(), + 'order_enum' => CommentOrderValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/comments', + new Comment(), + 'EDGE', + Comment::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Profile(), + 'EDGE', + Profile::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new RTBDynamicPost(), + 'NODE', + RTBDynamicPost::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RawCustomAudience.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RawCustomAudience.php new file mode 100644 index 00000000..23ffd4e2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RawCustomAudience.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['BuyingType'] = ReachFrequencyPredictionBuyingTypeValues::getInstance()->getValues(); + $ref_enums['InstreamPackages'] = ReachFrequencyPredictionInstreamPackagesValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ReachFrequencyPrediction(), + 'NODE', + ReachFrequencyPrediction::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencySpec.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencySpec.php new file mode 100644 index 00000000..77bd77ad --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ReachFrequencySpec.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ReadOnlyAnalyticsUserPropertyConfig(), + 'NODE', + ReadOnlyAnalyticsUserPropertyConfig::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Recommendation.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Recommendation.php new file mode 100644 index 00000000..484296aa --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Recommendation.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Referral(), + 'NODE', + Referral::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'invite_limit' => 'unsigned int', + 'messenger_cta' => 'string', + 'messenger_promotion_text' => 'string', + 'namespace' => 'unsigned int', + 'need_promo_code' => 'bool', + 'offer_origin' => 'string', + 'privacy_policy_link' => 'string', + 'promotion_text' => 'string', + 'receiver_benefits_text' => 'string', + 'referral_link_uri' => 'string', + 'sender_benefits_text' => 'string', + 'terms_and_condition_link' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Referral(), + 'NODE', + Referral::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RevSharePolicy.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RevSharePolicy.php new file mode 100644 index 00000000..442dc2cc --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/RevSharePolicy.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new SavedAudience(), + 'NODE', + SavedAudience::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/SavedMessageResponse.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/SavedMessageResponse.php new file mode 100644 index 00000000..69ca2eb6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/SavedMessageResponse.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new SavedMessageResponse(), + 'NODE', + SavedMessageResponse::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Search/DemographicSearchClasses.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Search/DemographicSearchClasses.php new file mode 100644 index 00000000..e7ff2031 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Search/DemographicSearchClasses.php @@ -0,0 +1,50 @@ +container['enable_automatic_matching'] = isset($data['enableAutomaticMatching']) ? $data['enableAutomaticMatching'] : null;; + $this->container['enabled_automatic_matching_fields'] = isset($data['enabledAutomaticMatchingFields']) ? $data['enabledAutomaticMatchingFields'] : null; + $this->container['pixel_id'] = isset($data['pixel_id']) ? $data['pixel_id'] : null; + } + + /** + * Factory method to build the settings given a pixel id + * @param string $pixelId + * @return AdsPixelId + */ + public static function buildFromPixelId($pixelId){ + $response = self::callPixelSettingsEndpoint($pixelId); + if( $response !== null ){ + $jsonString = $response->getBody(); + $pixelSettingsAsDict = json_decode($jsonString, true); + if (array_key_exists('errorMessage', $pixelSettingsAsDict)){ + return null; + } + $pixelSettingsAsDict['matchingConfig']['pixel_id'] = $pixelId; + return new AdsPixelSettings($pixelSettingsAsDict['matchingConfig']); + } + return null; + } + + /** + * @param string $pixelId + * @return SimpleRequest + */ + private static function callPixelSettingsEndpoint($pixelId){ + $path = sprintf("%s/%s/", self::SIGNALS_JSON_CONFIG_PATH, $pixelId); + $client = new Client(); + $request = new SimpleRequest($client); + $request->setPath($path); + try{ + return $client->sendRequest($request); + } + catch(Exception $e){ + return null; + } + } + + /** + * Get Pixel Id. + * @return string pixel id + */ + public function getPixelId() { + return $this->container['pixel_id']; + } + + + /** + * Sets Pixel id. + * @param string $pixelId + * @return $this + */ + public function setPixelId($pixelId) { + $this->container['pixel_id'] = $pixelId; + return $this; + } + + /** + * Get Enable automatic matching. + * @return bool enable automatic matching + */ + public function getEnableAutomaticMatching() { + return $this->container['enable_automatic_matching']; + } + + + /** + * Sets Enable automatic matching. + * @param bool $enableAutomaticMatching + * @return $this + */ + public function setEnableAutomaticMatching($enableAutomaticMatching) { + $this->container['enable_automatic_matching'] = $enableAutomaticMatching; + return $this; + } + + /** + * Get Enabled automatic matching fields. + * @return array enabled automatic matching fields + */ + public function getEnabledAutomaticMatchingFields() { + return $this->container['enabled_automatic_matching_fields']; + } + + + /** + * Sets Enabled automatic matching fields. + * @param array $enabledAutomaticMatchingFields + * @return $this + */ + public function setEnabledAutomaticMatchingFields($enabledAutomaticMatchingFields) { + $this->container['enabled_automatic_matching_fields'] = $enabledAutomaticMatchingFields; + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + return json_encode($this); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/AsyncClient.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/AsyncClient.php new file mode 100644 index 00000000..92d9aa59 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/AsyncClient.php @@ -0,0 +1,53 @@ + [ + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => 60, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => true, + CURLOPT_CAINFO => Api::instance()->getHttpClient()->getCaBundlePath(), + ] + ])); + + $this->client = new Client(['handler' => $handler_stack]); + } + + public function getClient() { + return $this->client; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/BatchProcessor.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/BatchProcessor.php new file mode 100644 index 00000000..8f3bbd13 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/BatchProcessor.php @@ -0,0 +1,121 @@ +pixel_id = $pixel_id; + // Note: batch_size is only used in processEvents and processEventsGenerator + $this->batch_size = $batch_size; + $this->concurrent_requests = $concurrent_requests; + } + + /** + * Processes events that have identical event_request params + * @param array $event_request_params + * @param array|\FacebookAds\Object\ServerSide\Event $events + * @return void + */ + public function processEvents($event_request_params, $events) { + $generator = $this->processEventsGenerator($event_request_params, $events); + foreach ($generator as $promises) { + Promise\unwrap($promises); + } + } + + /** + * This generator returns event_requests promises for events that have identical event_request params + * @param array $event_request_params + * @param array|\FacebookAds\Object\ServerSide\Event $events + * @return Generator|array|\GuzzleHttp\Promise\PromiseInterface $promises + */ + public function processEventsGenerator($event_request_params, $events) { + $index = 0; + while ($index < count($events)) { + $promises = []; + + while ($index < count($events) && count($promises) < $this->concurrent_requests) { + $params = array_merge( + array('events' => array_slice($events, $index, $this->batch_size)), + $event_request_params + ); + $event_request = new EventRequestAsync( + $this->pixel_id, + $params + ); + + $promises[] = $event_request->execute(); + $index += $this->batch_size; + } + + yield $promises; + } + } + + /** + * Processes async event_requests + * @param array|\FacebookAds\Object\ServerSide\EventRequestAsync $event_requests_async + * @return void + */ + public function processEventRequests($event_requests_async) { + $generator = $this->processEventRequestsGenerator($event_requests_async); + foreach ($generator as $promises) { + Promise\unwrap($promises); + } + } + + /** + * This generator returns event_requests promises + * @param array|\FacebookAds\Object\ServerSide\EventRequestAsync $event_requests_async + * @return Generator|array|\GuzzleHttp\Promise\PromiseInterface $promises + */ + public function processEventRequestsGenerator($event_requests_async) { + $index = 0; + while ($index < count($event_requests_async)) { + $promises = []; + + $offset = 0; + while (($index + $offset) < count($event_requests_async) && count($promises) < $this->concurrent_requests) { + $promises[] = $event_requests_async[$index + $offset]->execute(); + $offset += 1; + } + $index += $offset; + + yield $promises; + } + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Content.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Content.php new file mode 100644 index 00000000..75087f92 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Content.php @@ -0,0 +1,279 @@ +container['product_id'] = isset($data['product_id']) ? $data['product_id'] : null;; + $this->container['quantity'] = isset($data['quantity']) ? $data['quantity'] : null; + $this->container['item_price'] = isset($data['item_price']) ? $data['item_price'] : null; + $this->container['title'] = isset($data['title']) ? $data['title'] : null; + $this->container['description'] = isset($data['description']) ? $data['description'] : null; + $this->container['brand'] = isset($data['brand']) ? $data['brand'] : null; + $this->container['category'] = isset($data['category']) ? $data['category'] : null; + $this->container['delivery_category'] = isset($data['delivery_category']) ? $data['delivery_category'] : null; + } + + + /** + * Get Product Id. + * @return string Product Id + */ + public function getProductId() { + return $this->container['product_id']; + } + + + /** + * Sets product id. + * @param string $product_id product id + * @return $this + */ + public function setProductId($product_id) { + $this->container['product_id'] = $product_id; + return $this; + } + + + /** + * Get number of product. + * @return integer quantity + */ + public function getQuantity() { + return $this->container['quantity']; + } + + /** + * Set number of product. + * @param integer $quantity number of items + * @return $this + */ + public function setQuantity($quantity) { + $this->container['quantity'] = $quantity; + return $this; + } + + + /** + * Get Item Price. + * @return float Item Price + */ + public function getItemPrice() { + return $this->container['item_price']; + } + + /** + * Set Item Price. + * @param float $item_price single item price + * @return Content + */ + public function setItemPrice($item_price) { + $this->container['item_price'] = $item_price; + return $this; + } + + + /** + * Get title. + * @return string title + */ + public function getTitle() { + return $this->container['title']; + } + + /** + * Sets title. + * @param string $title title + * @return $this + */ + public function setTitle($title) { + $this->container['title'] = $title; + return $this; + } + + + /** + * Get description. + * @return string description + */ + public function getDescription() { + return $this->container['description']; + } + + /** + * Sets description. + * @param string $description description + * @return $this + */ + public function setDescription($description) { + $this->container['description'] = $description; + return $this; + } + + + /** + * Get brand. + * @return string brand + */ + public function getBrand() { + return $this->container['brand']; + } + + /** + * Sets brand. + * @param string $brand brand + * @return $this + */ + public function setBrand($brand) { + $this->container['brand'] = $brand; + return $this; + } + + + /** + * Get category. + * @return string category + */ + public function getCategory() { + return $this->container['category']; + } + + /** + * Sets category. + * @param string $category category + * @return $this + */ + public function setCategory($category) { + $this->container['category'] = $category; + return $this; + } + + /** + * Gets Type of delivery for a purchase event. + * @return string delivery_category + */ + public function getDeliveryCategory() { + return $this->container['delivery_category']; + } + + /** + * Sets Type of delivery for a purchase event. + * @param string $delivery_category + * @return $this + */ + public function setDeliveryCategory($delivery_category) { + $this->container['delivery_category'] = $delivery_category; + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + + return json_encode($this); + } + + /** + * Normalize + * @return array + */ + public function normalize() { + $normalized_payload = array( + 'id' => $this->container['product_id'], + 'quantity' => $this->container['quantity'], + 'item_price' => $this->container['item_price'], + 'title' => $this->container['title'], + 'description' => $this->container['description'], + 'brand' => $this->container['brand'], + 'category' => $this->container['category'], + 'delivery_category' => Normalizer::normalize( + 'delivery_category', $this->container['delivery_category'] + ), + ); + + $normalized_payload = array_filter($normalized_payload); + + return $normalized_payload; + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/CustomData.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/CustomData.php new file mode 100644 index 00000000..d4c54980 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/CustomData.php @@ -0,0 +1,604 @@ + 'float', + 'currency' => 'string', + 'content_name' => 'string', + 'content_category' => 'string', + 'content_ids' => 'string[]', + 'contents' => 'object[]', + 'content_type' => 'string', + 'order_id' => 'string', + 'predicted_ltv' => 'float', + 'num_items' => 'string', + 'status' => 'string', + 'search_string' => 'string', + 'item_number' => 'string', + 'delivery_category' => 'string', + 'custom_properties' => 'array' + ); + /** + * Array of attributes where the key is the local name, and the value is the original name + * @var string[] + */ + protected static $attributeMap = array( + 'value' => 'value', + 'currency' => 'currency', + 'content_name' => 'content_name', + 'content_category' => 'content_category', + 'content_ids' => 'content_ids', + 'contents' => 'contents', + 'content_type' => 'content_type', + 'order_id' => 'order_id', + 'predicted_ltv' => 'predicted_ltv', + 'num_items' => 'num_items', + 'status' => 'status', + 'search_string' => 'search_string', + 'item_number' => 'item_number', + 'delivery_category' => 'delivery_category', + 'custom_properties' => 'custom_properties' + ); + /** + * Array of attributes to setter functions (for deserialization of responses) + * @var string[] + */ + protected static $setters = array( + 'value' => 'setValue', + 'currency' => 'setCurrency', + 'content_name' => 'setContentName', + 'content_category' => 'setContentCategory', + 'content_ids' => 'setContentIds', + 'contents' => 'setContents', + 'content_type' => 'setContentType', + 'order_id' => 'setOrderId', + 'predicted_ltv' => 'setPredictedLtv', + 'num_items' => 'setNumItems', + 'status' => 'setStatus', + 'search_string' => 'setSearchString', + 'item_number' => 'setItemNumber', + 'delivery_category' => 'setDeliveryCategory', + 'custom_properties' => 'setCustomProperties' + ); + /** + * Array of attributes to getter functions (for serialization of requests) + * @var string[] + */ + protected static $getters = array( + 'value' => 'getValue', + 'currency' => 'getCurrency', + 'content_name' => 'getContentName', + 'content_category' => 'getContentCategory', + 'content_ids' => 'getContentIds', + 'contents' => 'getContents', + 'content_type' => 'getContentType', + 'order_id' => 'getOrderId', + 'predicted_ltv' => 'getPredictedLtv', + 'num_items' => 'getNumItems', + 'status' => 'getStatus', + 'search_string' => 'getSearchString', + 'item_number' => 'getItemNumber', + 'delivery_category' => 'getDeliveryCategory', + 'custom_properties' => 'getCustomProperties' + ); + /** + * Associative array for storing property values + * @var mixed[] + */ + protected $container = array(); + + /** + * Constructor + * @param mixed[] $data Associated array of property value initializing the model + */ + public function __construct(array $data = null) { + $this->container['value'] = isset($data['value']) ? $data['value'] : null; + $this->container['currency'] = isset($data['currency']) ? $data['currency'] : null; + $this->container['content_name'] = isset($data['content_name']) ? $data['content_name'] : null; + $this->container['content_category'] = isset($data['content_category']) ? $data['content_category'] : null; + $this->container['content_ids'] = isset($data['content_ids']) ? $data['content_ids'] : null; + $this->container['contents'] = isset($data['contents']) ? $data['contents'] : null; + $this->container['content_type'] = isset($data['content_type']) ? $data['content_type'] : null; + $this->container['order_id'] = isset($data['order_id']) ? $data['order_id'] : null; + $this->container['predicted_ltv'] = isset($data['predicted_ltv']) ? $data['predicted_ltv'] : null; + $this->container['num_items'] = isset($data['num_items']) ? $data['num_items'] : null; + $this->container['status'] = isset($data['status']) ? $data['status'] : null; + $this->container['search_string'] = isset($data['search_string']) ? $data['search_string'] : null; + $this->container['item_number'] = isset($data['item_number']) ? $data['item_number'] : null; + $this->container['delivery_category'] = isset($data['delivery_category']) ? $data['delivery_category'] : null; + $this->container['custom_properties'] = isset($data['custom_properties']) ? $data['custom_properties'] : null; + } + + public static function paramTypes() { + return self::$param_types; + } + + public static function attributeMap() { + return self::$attributeMap; + } + + public static function setters() { + return self::$setters; + } + + public static function getters() { + return self::$getters; + } + + /** + * show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() { + $invalid_properties = array(); + return $invalid_properties; + } + + /** + * validate all the properties in the model + * return true if all passed + * + * @return bool True if all properteis are valid + */ + public function valid() { + return true; + } + + /** + * Sets value + * @param float $value A numeric value associated with this event. + * This could be a monetary value or a value in some other metric. + * @return $this + */ + public function setValue($value) { + $this->container['value'] = $value; + + return $this; + } + + /** + * Sets currency + * @param string $currency The currency for the value specified, if applicable. + * Currency must be a valid ISO 4217 three digit currency code. + * @return $this + */ + public function setCurrency($currency) { + $this->container['currency'] = $currency; + + return $this; + } + + /** + * Sets content_name + * @param string $content_name The name of the page or product associated with the event. Example: 'lettuce'. + * @return $this + */ + public function setContentName($content_name) { + $this->container['content_name'] = $content_name; + + return $this; + } + + /** + * Sets content_category + * @param string $content_category The category of the content associated with the event. Example: 'grocery' + * @return $this + */ + public function setContentCategory($content_category) { + $this->container['content_category'] = $content_category; + + return $this; + } + + /** + * Sets content_ids + * @param string[] $content_ids The content IDs associated with the event, + * such as product SKUs for items in an AddToCart event: ['ABC123', 'XYZ789']. + * If content_type is a product, then your content IDs must be an array with a single string value. + * Otherwise, this array can contain any number of string values. + * @return $this + */ + public function setContentIds($content_ids) { + $this->container['content_ids'] = $content_ids; + + return $this; + } + + /** + * Sets contents + * @param Content[] $contents A list of Content objects that contain the product IDs associated with + * the event plus information about the products. + * @return $this + */ + public function setContents($contents) { + $this->container['contents'] = $contents; + + return $this; + } + + /** + * Sets content_type + * @param string $content_type A String equal to either 'product' or 'product_group'. + * Set to product if the keys you send content_ids or contents represent products. + * Set to product_group if the keys you send in content_ids represent product groups. + * @return $this + */ + public function setContentType($content_type) { + $this->container['content_type'] = $content_type; + + return $this; + } + + /** + * Sets order_id + * @param string $order_id The order ID for this transaction as a String. + * @return $this + */ + public function setOrderId($order_id) { + $this->container['order_id'] = $order_id; + + return $this; + } + + /** + * Sets predicted_ltv + * @param float $predicted_ltv The predicted lifetime value of a conversion event. + * @return $this + */ + public function setPredictedLtv($predicted_ltv) { + $this->container['predicted_ltv'] = $predicted_ltv; + + return $this; + } + + /** + * Sets num_items + * @param string $num_items Use only with InitiateCheckout events. + * The number of items that a user tries to buy during checkout. + * @return $this + */ + public function setNumItems($num_items) { + $this->container['num_items'] = $num_items; + + return $this; + } + + /** + * Sets status + * @param string $status Use only with CompleteRegistration events. + * The status of the registration event. + * @return $this + */ + public function setStatus($status) { + $this->container['status'] = $status; + + return $this; + } + + /** + * Sets a search query made by a user. Use only with Search events. + * @param string $search_string Use only with Search events. + * A search query made by a user. + * @return $this + */ + public function setSearchString($search_string) { + $this->container['search_string'] = $search_string; + + return $this; + } + + /** + * Sets Type of delivery for a purchase event. + * @param string $delivery_category Type of delivery for a purchase event. + * @return $this + */ + public function setDeliveryCategory($delivery_category) { + $this->container['delivery_category'] = $delivery_category; + + return $this; + } + + /** + * Sets the item_number. + * @param string $item_number The item number. + * @return $this + */ + public function setItemNumber($item_number) { + $this->container['item_number'] = $item_number; + + return $this; + } + + /** + * Sets custom_properties that are not defined as the standard properties list in custom data. + * @param array custom_properties dictionary to include custom properties that are not defined in custom data. + * @return $this + */ + public function setCustomProperties($custom_properties) { + $this->container['custom_properties'] = $custom_properties; + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + /** + * Add a custom property to the custom_properties bag + * @param $key Custom property name + * @param $value Custom property value + * @return void + */ + public function addCustomProperty($key, $value) { + $this->container['custom_properties'][$key] = $value; + } + + /** + * Gets the value of a custom property from the custom_properties bag + * @param $key Custom property name + * @return string + */ + public function getCustomProperty($key) { + if (array_key_exists( + $key, $this->container['custom_properties'])) { + return $this->container['custom_properties'][$key]; + } else { + throw new \Exception("Key not found in custom properties:'" . $key . "'"); + } + } + + public function normalize() { + $normalized_payload = array(); + + $normalized_payload['value'] = $this->getValue(); + $normalized_payload['currency'] = + Normalizer::normalize('currency', $this->getCurrency()); + $normalized_payload['content_name'] = $this->getContentName(); + $normalized_payload['content_category'] = $this->getContentCategory(); + $normalized_payload['content_ids'] = $this->getContentIds(); + $normalized_payload['content_type'] = $this->getContentType(); + $normalized_payload['order_id'] = $this->getOrderId(); + $normalized_payload['predicted_ltv'] = $this->getPredictedLtv(); + $normalized_payload['num_items'] = $this->getNumItems(); + $normalized_payload['status'] = $this->getStatus(); + $normalized_payload['search_string'] = $this->getSearchString(); + $normalized_payload['item_number'] = $this->getItemNumber(); + $normalized_payload['delivery_category'] = + Normalizer::normalize('delivery_category', $this->getDeliveryCategory()); + + if (isset($this->container['contents'])) { + $contents = []; + foreach ($this->getContents() as $content) { + array_push($contents, $content->normalize()); + } + $normalized_payload['contents'] = $contents; + } + + if (isset($this->container['custom_properties'])) { + foreach ($this->getCustomProperties() as $key => $val) { + if (array_key_exists($key, $normalized_payload)) { + throw new \Exception('Duplicate key defined as part of the custom_properties. key: "' . $key . '". Please make sure the keys defined in the custom_properties are not already available in standard custom_data property list.'); + } + + $normalized_payload[$key] = $val; + } + } + + $normalized_payload = array_filter($normalized_payload, function($val) { + if (is_array($val)) { + return true; + } else { + return strlen($val); + } + }); + + return $normalized_payload; + + } + + /** + * Gets a numeric value associated with this event. + * This could be a monetary value or a value in some other metric. + * @return float + */ + public function getValue() { + return $this->container['value']; + } + + /** + * Gets currency for the value specified, if applicable. + * @return string + */ + public function getCurrency() { + return $this->container['currency']; + } + + /** + * Gets content name of the page or product associated with the event. Example: 'lettuce'. + * @return string + */ + public function getContentName() { + return $this->container['content_name']; + } + + /** + * Gets the category of the content associated with the event. Example: 'grocery' + * @return string + */ + public function getContentCategory() { + return $this->container['content_category']; + } + + /** + * Gets the content IDs associated with the event, + * such as product SKUs for items in an AddToCart event: ['ABC123', 'XYZ789']. + * @return string[] + */ + public function getContentIds() { + return $this->container['content_ids']; + } + + /** + * Gets a list of Content objects that contain the product IDs associated with + * the event plus information about the products. + * @return Content[] + */ + public function getContents() { + return $this->container['contents']; + } + + /** + * Gets content type 'product' or 'product_group' + * @return string + */ + public function getContentType() { + return $this->container['content_type']; + } + + /** + * Gets the order ID for this transaction as a String. + * @return string + */ + public function getOrderId() { + return $this->container['order_id']; + } + + /** + * Gets the predicted lifetime value of a conversion event. + * @return float + */ + public function getPredictedLtv() { + return $this->container['predicted_ltv']; + } + + /** + * Gets the number of items that a user tries to buy during checkout + * @return string + */ + public function getNumItems() { + return $this->container['num_items']; + } + + /** + * Gets the status of the registration event + * @return string + */ + public function getStatus() { + return $this->container['status']; + } + + /** + * Gets a search query made by a user. + * @return string + */ + public function getSearchString() { + return $this->container['search_string']; + } + + /** + * Gets a delivery_category for a purchase order. + * @return string + */ + public function getDeliveryCategory() { + return $this->container['delivery_category']; + } + + /** + * Gets the item number. + * @return string + */ + public function getItemNumber() { + return $this->container['item_number']; + } + + /** + * Gets Custom Properties dictionary to add properties that are not defined as part of the custom data. + * @return array + */ + public function getCustomProperties() { + return $this->container['custom_properties']; + } + + /** + * Gets the string presentation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + + return json_encode($this); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/DeliveryCategory.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/DeliveryCategory.php new file mode 100644 index 00000000..5ebbcd7c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/DeliveryCategory.php @@ -0,0 +1,52 @@ + 'string', + 'event_time' => 'int', + 'event_source_url' => 'string', + 'opt_out' => 'bool', + 'event_id' => 'string', + 'user_data' => 'FacebookAds\Object\ServerSide\UserData', + 'custom_data' => 'FacebookAds\Object\ServerSide\CustomData', + 'data_processing_options' => 'string[]', + 'data_processing_options_country' => 'int', + 'data_processing_options_state' => 'int', + ); + /** + * Array of attributes where the key is the local name, and the value is the original name + * @var string[] + */ + protected static $attributeMap = array( + 'event_name' => 'event_name', + 'event_time' => 'event_time', + 'event_source_url' => 'event_source_url', + 'opt_out' => 'opt_out', + 'event_id' => 'event_id', + 'user_data' => 'user_data', + 'custom_data' => 'custom_data', + 'data_processing_options' => 'data_processing_options', + 'data_processing_options_country' => 'data_processing_options_country', + 'data_processing_options_state' => 'data_processing_options_state' + ); + + /** + * Array of attributes to setter functions (for deserialization of responses) + * @var string[] + */ + protected static $setters = array( + 'event_name' => 'setEventName', + 'event_time' => 'setEventTime', + 'event_source_url' => 'setEventSourceUrl', + 'opt_out' => 'setOptOut', + 'event_id' => 'setEventId', + 'user_data' => 'setUserData', + 'custom_data' => 'setCustomData', + 'data_processing_options' => 'setDataProcessingOptions', + 'data_processing_options_country' => 'setDataProcessingOptionsCountry', + 'data_processing_options_state' => 'setDataProcessingOptionsState', + ); + /** + * Array of attributes to getter functions (for serialization of requests) + * @var string[] + */ + protected static $getters = array( + 'event_name' => 'getEventName', + 'event_time' => 'getEventTime', + 'event_source_url' => 'getEventSourceUrl', + 'opt_out' => 'getOptOut', + 'event_id' => 'getEventId', + 'user_data' => 'getUserData', + 'custom_data' => 'getCustomData', + 'data_processing_options' => 'getDataProcessingOptions', + 'data_processing_options_country' => 'getDataProcessingOptionsCountry', + 'data_processing_options_state' => 'getDataProcessingOptionsState', + ); + /** + * Associative array for storing property values + * @var mixed[] + */ + protected $container = array(); + + /** + * Constructor + * @param mixed[] $data Associated array of property value initalizing the model + */ + public function __construct(array $data = null) { + $this->container['event_name'] = isset($data['event_name']) ? $data['event_name'] : null; + $this->container['event_time'] = isset($data['event_time']) ? $data['event_time'] : null; + $this->container['event_source_url'] = isset($data['event_source_url']) ? $data['event_source_url'] : null; + $this->container['opt_out'] = isset($data['opt_out']) ? $data['opt_out'] : null; + $this->container['event_id'] = isset($data['event_id']) ? $data['event_id'] : null; + $this->container['user_data'] = isset($data['user_data']) ? $data['user_data'] : null; + $this->container['custom_data'] = isset($data['custom_data']) ? $data['custom_data'] : null; + $this->container['data_processing_options'] = isset($data['data_processing_options']) ? $data['data_processing_options'] : null; + $this->container['data_processing_options_country'] = isset($data['data_processing_options_country']) ? $data['data_processing_options_country'] : null; + $this->container['data_processing_options_state'] = isset($data['data_processing_options_state']) ? $data['data_processing_options_state'] : null; + } + + public static function paramTypes() { + return self::$param_types; + } + + public static function attributeMap() { + return self::$attributeMap; + } + + public static function setters() { + return self::$setters; + } + + public static function getters() { + return self::$getters; + } + + /** + * show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() { + $invalid_properties = array(); + if ($this->container['event_name'] === null) { + $invalid_properties[] = "'event_name' can't be null"; + } + if ($this->container['event_time'] === null) { + $invalid_properties[] = "'event_time' can't be null"; + } + if ($this->container['user_data'] === null) { + $invalid_properties[] = "'user_data' can't be null"; + } + return $invalid_properties; + } + + /** + * validate all the properties in the model + * return true if all passed + * + * @return bool True if all properteis are valid + */ + public function valid() { + if ($this->container['event_name'] === null) { + return false; + } + if ($this->container['event_time'] === null) { + return false; + } + if ($this->container['user_data'] === null) { + return false; + } + return true; + } + + /** + * Sets a Facebook pixel Standard Event or Custom Event name + * @param string $event_name A Facebook pixel Standard Event or Custom Event name. + * @return $this + */ + public function setEventName($event_name) { + $this->container['event_name'] = $event_name; + + return $this; + } + + /** + * Sets a Unix timestamp in seconds indicating when the actual event occurred + * @param int $event_time A Unix timestamp in seconds indicating when the actual event occurred. + * @return $this + */ + public function setEventTime($event_time) { + $this->container['event_time'] = $event_time; + + return $this; + } + + /** + * Sets the browser URL where the event happened + * @param string $event_source_url The browser URL where the event happened. + * @return $this + */ + public function setEventSourceUrl($event_source_url) { + $this->container['event_source_url'] = $event_source_url; + + return $this; + } + + /** + * Sets a flag that indicates Facebook should or should not use this event for ads delivery optimization + * @param bool $opt_out A flag that indicates Facebook should or should not + * use this event for ads delivery optimization. + * If set to true, Facebook only use the event for attribution. + * @return $this + */ + public function setOptOut($opt_out) { + $this->container['opt_out'] = $opt_out; + + return $this; + } + + /** + * Sets an ID used by Facebook to deduplicate the same event sent from both server and browser. + * @param string $event_id This ID can be any unique string chosen by the advertiser. + * event_id is used to deduplicate events sent by both Facebook Pixel and Server-Side API. + * event_name is also used in the deduplication process. + * For deduplication, the eventID from Facebook pixel must match the + * event_id in the corresponding Server-Side API event. + * @return $this + */ + public function setEventId($event_id) { + $this->container['event_id'] = $event_id; + + return $this; + } + + /** + * Sets UserData object that contains user data. + * @param FacebookAds\Object\ServerSide\UserData $user_data + * @return $this + */ + public function setUserData($user_data) { + $this->container['user_data'] = $user_data; + + return $this; + } + + /** + * Sets CustomData object that includes additional business data about the event. + * @param FacebookAds\Object\ServerSide\CustomData $custom_data + * @return $this + */ + public function setCustomData($custom_data) { + $this->container['custom_data'] = $custom_data; + + return $this; + } + + /** + * Sets the processing options you would like to enable for a specific event. + * For more details see: https://developers.facebook.com/docs/marketing-apis/data-processing-options + * @param string[], e.g. [] or ['LDU'] + * @return $this + */ + public function setDataProcessingOptions($data_processing_options) { + $this->container['data_processing_options'] = $data_processing_options; + + return $this; + } + + /** + * Sets a country that you want to associate to this data processing option. If you set a country, you must also set a state. + * For more details see: https://developers.facebook.com/docs/marketing-apis/data-processing-options + * @param int + * @return $this + */ + public function setDataProcessingOptionsCountry($data_processing_options_country) { + $this->container['data_processing_options_country'] = $data_processing_options_country; + + return $this; + } + + /** + * Sets a state that you want to associate with this data processing option. + * For more details see: https://developers.facebook.com/docs/marketing-apis/data-processing-options + * @param int + * @return $this + * + */ + public function setDataProcessingOptionsState($data_processing_options_state) { + $this->container['data_processing_options_state'] = $data_processing_options_state; + + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + /** + * Normalize + * @return array + */ + public function normalize() { + $normalized_payload = array(); + + $normalized_payload['event_name'] = $this->getEventName(); + $normalized_payload['event_time'] = $this->getEventTime(); + $normalized_payload['event_source_url'] = $this->getEventSourceUrl(); + $normalized_payload['opt_out'] = $this->getOptOut(); + $normalized_payload['event_id'] = $this->getEventId(); + $normalized_payload['user_data'] = isset($this->container['user_data']) ? $this->getUserData()->normalize() : null; + $normalized_payload['custom_data'] = isset($this->container['custom_data']) ? $this->getCustomData() + ->normalize() : null; + + $normalized_payload['data_processing_options'] = $this->getDataProcessingOptions(); + $normalized_payload['data_processing_options_country'] = $this->getDataProcessingOptionsCountry(); + $normalized_payload['data_processing_options_state'] = $this->getDataProcessingOptionsState(); + $normalized_payload = array_filter($normalized_payload, function($val) { if(is_array($val)) { return true; } else { return strlen($val); }}); + + return $normalized_payload; + } + + /** + * Gets Facebook pixel Standard Event or Custom Event name. + * @return string + */ + public function getEventName() { + return $this->container['event_name']; + } + + /** + * Gets Unix timestamp in seconds indicating when the actual event occurred. + * @return int + */ + public function getEventTime() { + return $this->container['event_time']; + } + + /** + * Gets browser URL where the event happened. + * @return string + */ + public function getEventSourceUrl() { + return $this->container['event_source_url']; + } + + /** + * Gets flag that indicates Facebook should or should not use this event for ads delivery optimization. + * If set to true, we only use the event for attribution. + * @return bool + */ + public function getOptOut() { + return $this->container['opt_out']; + } + + /** + * Gets Event ID can be any string chosen by the advertiser. It is used by Facebook to deduplicate + * the same event sent from both server and browser. + * @return string + */ + public function getEventId() { + return $this->container['event_id']; + } + + /** + * Gets UserData object that contains user data + * @return FacebookAds\Object\ServerSide\UserData + */ + public function getUserData() { + return $this->container['user_data']; + } + + /** + * Gets customData object that includes additional business data about the event. + * @return FacebookAds\Object\ServerSide\CustomData + */ + public function getCustomData() { + return $this->container['custom_data']; + } + + /** + * Gets DataProcessionOptions value of Processing options you would like to enable for a specific event. + * @return string[] + */ + public function getDataProcessingOptions() { + return $this->container['data_processing_options']; + } + + /** + * Gets DataProcessionOptionsState value that represents the state that you want to associate with this data processing option. + * @return int + */ + public function getDataProcessingOptionsState() { + return $this->container['data_processing_options_state']; + } + + /** + * Gets DataProcessionOptionsCountry value that represents the country that you want to associate to this data processing option. + * @return int + */ + public function getDataProcessingOptionsCountry() { + return $this->container['data_processing_options_country']; + } + + /** + * Gets the string representation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + + return json_encode($this); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequest.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequest.php new file mode 100644 index 00000000..34475133 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequest.php @@ -0,0 +1,460 @@ + '\FacebookAds\Object\ServerSide\Event[]', + 'test_event_code' => 'string', + 'partner_agent' => 'string', + 'namespace_id' => 'string', + 'upload_id' => 'string', + 'upload_tag' => 'string', + 'upload_source' => 'string' + ); + /** + * Array of attributes where the key is the local name, and the value is the original name + * @var string[] + */ + protected static $attributeMap = array( + 'events' => 'events', + 'test_event_code' => 'test_event_code', + 'partner_agent' => 'partner_agent', + 'namespace_id' => 'namespace_id', + 'upload_id' => 'upload_id', + 'upload_tag' => 'upload_tag', + 'upload_source' => 'upload_source' + ); + /** + * Array of attributes to setter functions (for deserialization of responses) + * @var string[] + */ + protected static $setters = array( + 'events' => 'setEvents', + 'test_event_code' => 'setTestEventCode', + 'partner_agent' => 'setPartnerAgent', + 'namespace_id' => 'setNamespaceId', + 'upload_id' => 'setUploadId', + 'upload_tag' => 'setUploadTag', + 'upload_source' => 'setUploadSource' + ); + /** + * Array of attributes to getter functions (for serialization of requests) + * @var string[] + */ + protected static $getters = array( + 'events' => 'getEvents', + 'test_event_code' => 'getTestEventCode', + 'partner_agent' => 'getPartnerAgent', + 'namespace_id' => 'getNamespaceId', + 'upload_id' => 'getUploadId', + 'upload_tag' => 'getUploadTag', + 'upload_source' => 'getUploadSource' + ); + /** + * Associative array for storing property values + * @var mixed[] + */ + protected $container = array(); + + protected $http_client = null; + + /** + * Constructor + * @param string $pixel_id pixel id + * @param mixed[] $data Associated array of property value initializing the model + */ + public function __construct(string $pixel_id, array $data = null) { + $this->container['pixel_id'] = $pixel_id; + $this->container['events'] = isset($data['events']) ? $data['events'] : null; + $this->container['test_event_code'] = isset($data['test_event_code']) ? $data['test_event_code'] : null; + $this->container['partner_agent'] = isset($data['partner_agent']) ? $data['partner_agent'] : null; + $this->container['namespace_id'] = isset($data['namespace_id']) ? $data['namespace_id'] : null; + $this->container['upload_id'] = isset($data['upload_id']) ? $data['upload_id'] : null; + $this->container['upload_tag'] = isset($data['upload_tag']) ? $data['upload_tag'] : null; + $this->container['upload_source'] = isset($data['upload_source']) ? $data['upload_source'] : null; + } + + public static function paramTypes() { + return self::$param_types; + } + + public static function attributeMap() { + return self::$attributeMap; + } + + public static function setters() { + return self::$setters; + } + + public static function getters() { + return self::$getters; + } + + /** + * show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() { + $invalid_properties = array(); + if ($this->container['events'] === null) { + $invalid_properties[] = "'events' can't be null"; + } + return $invalid_properties; + } + + /** + * validate all the properties in the model + * return true if all passed + * + * @return bool True if all properties are valid + */ + public function valid() { + if ($this->container['events'] === null) { + return false; + } + return true; + } + + /** + * Sets an array of Server Event objects + * @param FacebookAds\Object\ServerSide\Event[] $events An array of Server Event objects + * @return $this + */ + public function setEvents($events) { + $this->container['events'] = $events; + return $this; + } + + /** + * Gets code used to verify that your server events are received correctly by Facebook. Use this + * code to test your server events in the Test Events feature in Events Manager. + * See Test Events Tool + * (https://developers.facebook.com/docs/marketing-api/facebook-pixel/server-side-api/using-the-api#testEvents) + * for an example. + * @return string + */ + public function getTestEventCode() { + return $this->container['test_event_code']; + } + + /** + * Sets code used to verify that your server events are received correctly by Facebook. Use this + * code to test your server events in the Test Events feature in Events Manager. + * See Test Events Tool + * (https://developers.facebook.com/docs/marketing-api/facebook-pixel/server-side-api/using-the-api#testEvents) + * for an example. + * @param string $test_event_code Code used to verify that your server events are received correctly by Facebook. + * Use this code to test your server events in the Test Events feature in Events Manager. See Test Events Tool + * (https://developers.facebook.com/docs/marketing-api/facebook-pixel/server-side-api/using-the-api#testEvents) + * for an example. + * @return $this + */ + public function setTestEventCode($test_event_code) { + $this->container['test_event_code'] = $test_event_code; + return $this; + } + + /** + * Sets Partner Agent, which specifies who is sending the event. + * @param string $partner_agent The partner agent who is sending the event + * @return $this + */ + public function setPartnerAgent($partner_agent) { + $this->container['partner_agent'] = $partner_agent; + + return $this; + } + + /** + * Sets a custom HTTP Client object, which overrides the default HTTP service + * used to send the event request. + * @param HttpServiceInterface $http_client An object that implements the HttpServiceInterface + * @return $this + */ + public function setHttpClient($http_client) { + $this->http_client = $http_client; + + return $this; + } + + /** + * Execute the request + * @return EventResponse + */ + public function execute() { + $http_client = null; + + if ($this->http_client != null) { + $http_client = $this->http_client; + } else { + $http_client = HttpServiceClientConfig::getInstance()->getClient(); + } + + if ($http_client != null) { + return $this->httpClientExecute($http_client); + } + + return $this->defaultExecute(); + } + + private function defaultExecute() { + $fields = array(); + $normalized_param = $this->normalize(); + $ads_pixel = new AdsPixel($this->container['pixel_id']); + $response = $ads_pixel->createEvent( + $fields, + $normalized_param + ); + $event_response = new EventResponse($response->exportAllData()); + return $event_response; + } + + private function httpClientExecute($http_client) { + $base_url = 'https://graph.facebook.com/v' . ApiConfig::APIVersion; + $url = $base_url . '/' . $this->container['pixel_id'] . '/events'; + + $headers = array( + 'User-Agent' => 'fbbizsdk-php-v' . ApiConfig::SDKVersion, + 'Accept-Encoding' => '*', + ); + + $curl_options = array( + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => 60, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => true, + CURLOPT_CAINFO => Util::getCaBundlePath(), + ); + + $params = $this->normalize(); + if (HttpServiceClientConfig::getInstance()->getAccessToken() == null) { + $params['access_token'] = Api::instance()->getSession()->getAccessToken(); + } else { + $params['access_token'] = HttpServiceClientConfig::getInstance()->getAccessToken(); + } + + $appsecret = null; + if (HttpServiceClientConfig::getInstance()->getAppsecret() == null) { + $appsecret = Api::instance()->getSession()->getAppSecret(); + } else { + $appsecret = HttpServiceClientConfig::getInstance()->getAppsecret(); + } + if ($appsecret != null) { + $params['appsecret_proof'] = Util::getAppsecretProof($params['access_token'], $appsecret); + } + + return $http_client->executeRequest( + $url, + HttpMethod::POST, + $curl_options, + $headers, + $params + ); + } + + /** + * Normalize + * @return array + */ + public function normalize() { + $normalized_events = array(); + $events = $this->getEvents(); + if (!is_null($events)) { + foreach ($events as $event) { + $normalized_event = $event->normalize(); + array_push($normalized_events, $normalized_event); + } + } + + $normalized_payload = array( + 'data' => $normalized_events, + 'test_event_code' => $this->container['test_event_code'], + 'partner_agent' => $this->container['partner_agent'], + 'namespace_id' => $this->container['namespace_id'], + 'upload_id' => $this->container['upload_id'], + 'upload_tag' => $this->container['upload_tag'], + 'upload_source' => $this->container['upload_source'], + ); + $normalized_payload = array_filter($normalized_payload); + + return $normalized_payload; + } + + /** + * Gets an array of Server Event objects + * @return FacebookAds\Object\ServerSide\Event[] + */ + public function getEvents() { + return $this->container['events']; + } + + /** + * Gets Partner Agent, which specifies who is sending the event. + * @return string + */ + public function getPartnerAgent() { + return $this->container['partner_agent']; + } + + /** + * Gets namespace_id, a scope used to resolve extern_id or Third-party ID. + * Can be another data set or data partner ID. + * @return string + */ + public function getNamespaceId() { + return $this->container['namespace_id']; + } + + /** + * Sets namespace_id, a scope used to resolve extern_id or Third-party ID. + * Can be another data set or data partner ID. + * @return $this + */ + public function setNamespaceId($namespace_id) { + $this->container['namespace_id'] = $namespace_id; + return $this; + } + + /** + * Gets upload_id, a unique id used to denote the current set being uploaded. + * @return string + */ + public function getUploadId() { + return $this->container['upload_id']; + } + + /** + * Sets upload_id, a unique id used to denote the current set being uploaded. + * @return $this + */ + public function setUploadId($upload_id) { + $this->container['upload_id'] = $upload_id; + return $this; + } + + /** + * Gets upload_tag, a tag string added to track your Offline event uploads. + * @return string + */ + public function getUploadTag() { + return $this->container['upload_tag']; + } + + /** + * Sets upload_tag, a tag string added to track your Offline event uploads. + * @return $this + */ + public function setUploadTag($upload_tag) { + $this->container['upload_tag'] = $upload_tag; + return $this; + } + + /** + * Gets upload_source, the origin/source of data for the dataset to be uploaded. + * @return string + */ + public function getUploadSource() { + return $this->container['upload_source']; + } + + /** + * Sets upload_source, the origin/source of data for the dataset to be uploaded. + * @return $this + */ + public function setUploadSource($upload_source) { + $this->container['upload_source'] = $upload_source; + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + + /** + * Gets the string presentation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + + return json_encode($this); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequestAsync.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequestAsync.php new file mode 100644 index 00000000..4ae1bae8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventRequestAsync.php @@ -0,0 +1,89 @@ +normalize(); + $pixel_id = $this->container['pixel_id']; + return $this->eventPromise( + $pixel_id, + $normalized_param + ); + } + + private function eventPromise(string $pixel_id, array $params = array()) { + $access_token = Api::instance()->getSession()->getAccessToken(); + $headers = array( + 'User-Agent' => 'fbbizsdk-php-v'.ApiConfig::APIVersion, + 'Accept-Encoding' => '*', + ); + + $domain = Client::DEFAULT_LAST_LEVEL_DOMAIN . '.' . Client::DEFAULT_GRAPH_BASE_DOMAIN; + $base_url = 'https://' . $domain . '/v' . ApiConfig::APIVersion; + + $url = $base_url.'/'.$pixel_id.'/events'; + + $events_json = \GuzzleHttp\json_encode($params['data']); + $multipart_contents = [ + [ + 'name' => 'access_token', + 'contents' => $access_token, + 'headers' => array('Content-Type' => 'multipart/form-data'), + ], + [ + 'name' => 'data', + 'contents' => $events_json, + 'headers' => array('Content-Type' => 'multipart/form-data'), + ] + ]; + + foreach ($params as $key => $value) { + if ($key !== 'data') { + $multipart_contents[] = [ + 'name' => $key, + 'contents' => $value, + 'headers' => array('Content-Type' => 'multipart/form-data'), + ]; + } + } + + $body = new MultipartStream($multipart_contents); + $request = new Request('POST', $url, $headers, $body); + + $client = AsyncClient::getInstance()->getClient(); + return $client->sendAsync($request); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventResponse.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventResponse.php new file mode 100644 index 00000000..7ee8a972 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/EventResponse.php @@ -0,0 +1,234 @@ + 'int', + 'messages' => 'string[]', + 'fbtrace_id' => 'string' + ); + /** + * Array of attributes where the key is the local name, and the value is the original name + * @var string[] + */ + protected static $attributeMap = array( + 'events_received' => 'events_received', + 'messages' => 'messages', + 'fbtrace_id' => 'fbtrace_id' + ); + /** + * Array of attributes to setter functions (for deserialization of responses) + * @var string[] + */ + protected static $setters = array( + 'events_received' => 'setEventsReceived', + 'messages' => 'setMessages', + 'fbtrace_id' => 'setFbTraceId' + ); + /** + * Array of attributes to getter functions (for serialization of requests) + * @var string[] + */ + protected static $getters = array( + 'events_received' => 'getEventsReceived', + 'messages' => 'getMessages', + 'fbtrace_id' => 'getFbTraceId' + ); + /** + * Associative array for storing property values + * @var mixed[] + */ + protected $container = array(); + + /** + * Constructor + * @param mixed[] $data Associated array of property value initalizing the model + */ + public function __construct(array $data = null) { + $this->container['events_received'] = isset($data['events_received']) ? $data['events_received'] : null; + $this->container['messages'] = isset($data['messages']) ? $data['messages'] : null; + $this->container['fbtrace_id'] = isset($data['fbtrace_id']) ? $data['fbtrace_id'] : null; + } + + public static function paramTypes() { + return self::$param_types; + } + + public static function attributeMap() { + return self::$attributeMap; + } + + public static function setters() { + return self::$setters; + } + + public static function getters() { + return self::$getters; + } + + /** + * show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() { + $invalid_properties = array(); + return $invalid_properties; + } + + /** + * validate all the properties in the model + * return true if all passed + * + * @return bool True if all properteis are valid + */ + public function valid() { + return true; + } + + + /** + * Gets number of events received. + * @return int + */ + public function getEventsReceived() { + return $this->container['events_received']; + } + + /** + * Sets number of events received. + * @param int $events_received number of events received. + * @return $this + */ + public function setEventsReceived($events_received) { + $this->container['events_received'] = $events_received; + + return $this; + } + + /** + * Gets response messages. + * @return string[] + */ + public function getMessages() { + return $this->container['messages']; + } + + /** + * Sets response messages. + * @param string[] $messages response messages. + * @return $this + */ + public function setMessages($messages) { + $this->container['messages'] = $messages; + + return $this; + } + + /** + * Gets Facebook trace id + * @return string + */ + public function getFbTraceId() { + return $this->container['fbtrace_id']; + } + + /** + * Sets Facebook trace id + * @param $fbtrace_id Facebook trace id + * @return $this + */ + public function setFbTraceId($fbtrace_id) { + $this->container['fbtrace_id'] = $fbtrace_id; + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + /** + * Gets the string presentation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + return json_encode($this); + } +} + + diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Gender.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Gender.php new file mode 100644 index 00000000..30e9dea8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Gender.php @@ -0,0 +1,44 @@ + 'string', + 'f' => 'string', + ); + } +} \ No newline at end of file diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpMethod.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpMethod.php new file mode 100644 index 00000000..f2200878 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpMethod.php @@ -0,0 +1,34 @@ +client; + } + + public function getAccessToken() { + return $this->access_token; + } + + public function getAppsecret() { + return $this->appsecret; + } + + public function setClient($client) { + $this->client = $client; + } + + public function setAccessToken($access_token) { + $this->access_token = $access_token; + } + + public function setAppsecret($appsecret) { + $this->appsecret = $appsecret; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpServiceInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpServiceInterface.php new file mode 100644 index 00000000..9510ddc7 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/HttpServiceInterface.php @@ -0,0 +1,37 @@ += 1) && ($dobd_int <= 31); + if (!$in_day_range) { + throw new InvalidArgumentException('Invalid dobd passed(' . $dobd . '). Date of birth day should be in format "DD".'); + } + + return $dobd; + } + + /** + * @param string $dobm A date of birth month to be normalized. + * @return string + */ + private static function normalizeDobm($dobm) { + if (strlen($dobm) == 1) { + $dobm = '0' . $dobm; + } + + if (!preg_match('/^[0-9]{2}$/', $dobm)) { + throw new InvalidArgumentException('Invalid dobm passed(' . $dobm . '). Date of birth month should be in format "MM".'); + } + + $dobm_int = intval($dobm); + $in_month_range = ($dobm_int >= 1) && ($dobm_int <= 12); + if (!$in_month_range) { + throw new InvalidArgumentException('Invalid dobm passed(' . $dobm . '). Date of birth month should be in format "MM".'); + } + + return $dobm; + } + + /** + * @param string $doby A date of birth year to be normalized. + * @return string + */ + private static function normalizeDoby($doby) { + if (!preg_match('/^[0-9]{4}$/', $doby)) { + throw new InvalidArgumentException('Invalid doby passed(' . $doby . '). Date of birth year should be in format "YYYY".'); + } + + return $doby; + } + + /** + * Normalizes the type of DeliveryCategory and throws error if invalid. + * @param string $delivery_category type of DeliveryCategory. + * @return string + */ + private static function normalizeDeliveryCategory($delivery_category) { + + $delivery_categories = DeliveryCategory::getInstance()->getValues(); + if(!DeliveryCategory::getInstance()->isValidValue($delivery_category)) + throw new InvalidArgumentException('Invalid delivery_category passed: ' . $delivery_category . + '.Allowed values are one of ' . implode(",",$delivery_categories)); + + return $delivery_category; + } + + /** + * @param string $phone_number Phone number to be normalized. + * @return bool + */ + private static function isInternationalNumber($phone_number) { + // Remove spaces and hyphens + $phone_number = preg_replace('/[\-\s]/', '', $phone_number); + + // Strip + and up to 2 leading 0s + $phone_number = preg_replace('/^\+?0{0,2}/', '', $phone_number); + + if (substr($phone_number, 0, 1) === '0') { + return false; + } + + // International Phone number with country calling code. + $international_number_regex = '/^\d{1,4}\(?\d{2,3}\)?\d{4,}$/'; + + return preg_match($international_number_regex, $phone_number); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Singleton.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Singleton.php new file mode 100644 index 00000000..58ecd123 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Singleton.php @@ -0,0 +1,44 @@ + 'string', + 'phone' => 'string', + 'gender' => 'string', + 'date_of_birth' => 'string', + 'last_name' => 'string', + 'first_name' => 'string', + 'ct' => 'string', + 'state' => 'string', + 'country_code' => 'string', + 'zip_code' => 'string', + 'external_id' => 'string', + 'client_ip_address' => 'string', + 'client_user_agent' => 'string', + 'fbc' => 'string', + 'fbp' => 'string', + 'subscription_id' => 'string', + 'fb_login_id' => 'string', + 'lead_id' => 'string', + 'f5first' => 'string', + 'f5last' => 'string', + 'fi' => 'string', + 'dobd' => 'string', + 'dobm' => 'string', + 'doby' => 'string' + ); + /** + * Array of attributes where the key is the local name, and the value is the original name + * @var string[] + */ + protected static $attributeMap = array( + 'email' => 'email', + 'phone' => 'phone', + 'gender' => 'gender', + 'date_of_birth' => 'date_of_birth', + 'last_name' => 'last_name', + 'first_name' => 'first_name', + 'ct' => 'ct', + 'state' => 'state', + 'country_code' => 'country_code', + 'zip_code' => 'zip_code', + 'external_id' => 'external_id', + 'client_ip_address' => 'client_ip_address', + 'client_user_agent' => 'client_user_agent', + 'fbc' => 'fbc', + 'fbp' => 'fbp', + 'subscription_id' => 'subscription_id', + 'fb_login_id' => 'fb_login_id', + 'lead_id' => 'lead_id', + 'f5first' => 'f5first', + 'f5last' => 'f5last', + 'fi' => 'fi', + 'dobd' => 'dobd', + 'dobm' => 'dobm', + 'doby' => 'doby' + ); + /** + * Array of attributes to setter functions (for deserialization of responses) + * @var string[] + */ + protected static $setters = array( + 'email' => 'setEmail', + 'phone' => 'setPhone', + 'gender' => 'setGender', + 'date_of_birth' => 'setDateOfBirth', + 'last_name' => 'setLastName', + 'first_name' => 'setFirstName', + 'city' => 'setCity', + 'state' => 'setState', + 'country_code' => 'setCountryCode', + 'zip_code' => 'setZipCode', + 'external_id' => 'setExternalId', + 'client_ip_address' => 'setClientIpAddress', + 'client_user_agent' => 'setClientUserAgent', + 'fbc' => 'setFbc', + 'fbp' => 'setFbp', + 'subscription_id' => 'setSubscriptionId', + 'fb_login_id' => 'setFbLoginId', + 'lead_id' => 'setLeadId', + 'f5first' => 'setF5first', + 'f5last' => 'setF5last', + 'fi' => 'setFi', + 'dobd' => 'setDobd', + 'dobm' => 'setDobm', + 'doby' => 'setDoby' + ); + /** + * Array of attributes to getter functions (for serialization of requests) + * @var string[] + */ + protected static $getters = array( + 'email' => 'getEmail', + 'phone' => 'getPhone', + 'gender' => 'getGender', + 'date_of_birth' => 'getDateOfBirth', + 'last_name' => 'getLastName', + 'first_name' => 'getFirstName', + 'city' => 'getCity', + 'state' => 'getState', + 'country_code' => 'getCountryCode', + 'zip_code' => 'getZipCode', + 'external_id' => 'getExternalId', + 'client_ip_address' => 'getClientIpAddress', + 'client_user_agent' => 'getClientUserAgent', + 'fbc' => 'getFbc', + 'fbp' => 'getFbp', + 'subscription_id' => 'getSubscriptionId', + 'fb_login_id' => 'getFbLoginId', + 'lead_id' => 'getLeadId', + 'f5first' => 'getF5first', + 'f5last' => 'getF5last', + 'fi' => 'getFi', + 'dobd' => 'getDobd', + 'dobm' => 'getDobm', + 'doby' => 'getDoby' + ); + /** + * Associative array for storing property values + * @var mixed[] + */ + protected $container = array(); + + /** + * Constructor + * @param mixed[] $data Associated array of property value initalizing the model + */ + public function __construct(array $data = null) { + $this->container['email'] = isset($data['email']) ? $data['email'] : null; + $this->container['phone'] = isset($data['phone']) ? $data['phone'] : null; + $this->container['gender'] = isset($data['gender']) ? $data['gender'] : null; + $this->container['date_of_birth'] = isset($data['date_of_birth']) ? $data['date_of_birth'] : null; + $this->container['last_name'] = isset($data['last_name']) ? $data['last_name'] : null; + $this->container['first_name'] = isset($data['first_name']) ? $data['first_name'] : null; + $this->container['city'] = isset($data['city']) ? $data['city'] : null; + $this->container['state'] = isset($data['state']) ? $data['state'] : null; + $this->container['country_code'] = isset($data['country_code']) ? $data['country_code'] : null; + $this->container['zip_code'] = isset($data['zip_code']) ? $data['zip_code'] : null; + $this->container['external_id'] = isset($data['external_id']) ? $data['external_id'] : null; + $this->container['client_ip_address'] = isset($data['client_ip_address']) ? $data['client_ip_address'] : null; + $this->container['client_user_agent'] = isset($data['client_user_agent']) ? $data['client_user_agent'] : null; + $this->container['fbc'] = isset($data['fbc']) ? $data['fbc'] : null; + $this->container['fbp'] = isset($data['fbp']) ? $data['fbp'] : null; + $this->container['subscription_id'] = isset($data['subscription_id']) ? $data['subscription_id'] : null; + $this->container['fb_login_id'] = isset($data['fb_login_id']) ? $data['fb_login_id'] : null; + $this->container['lead_id'] = isset($data['lead_id']) ? $data['lead_id'] : null; + $this->container['f5first'] = isset($data['f5first']) ? $data['f5first'] : null; + $this->container['f5last'] = isset($data['f5last']) ? $data['f5last'] : null; + $this->container['fi'] = isset($data['fi']) ? $data['fi'] : null; + $this->container['dobd'] = isset($data['dobd']) ? $data['dobd'] : null; + $this->container['dobm'] = isset($data['dobm']) ? $data['dobm'] : null; + $this->container['doby'] = isset($data['doby']) ? $data['doby'] : null; + } + + public static function paramTypes() { + return self::$param_types; + } + + public static function attributeMap() { + return self::$attributeMap; + } + + public static function setters() { + return self::$setters; + } + + public static function getters() { + return self::$gendertters; + } + + /** + * show all the invalid properties with reasons. + * + * @return array invalid properties with reasons + */ + public function listInvalidProperties() { + $invalid_properties = array(); + return $invalid_properties; + } + + /** + * validate all the properties in the model + * return true if all passed + * + * @return bool True if all properteis are valid + */ + public function valid() { + return true; + } + + /** + * Sets an email address, in lowercase. + * + *

Example: joe@eg.com + * @param string $email An email address, in lowercase. + * @return $this + */ + public function setEmail($email) { + $this->container['email'] = $email; + + return $this; + } + + /** + * Sets a phone number. Include only digits with countryCode code, area code, and number. + * + *

Example: 16505551212 + * @param string $phone A phone number. Include only digits with country code, area code, and number. + * @return $this + */ + public function setPhone($phone) { + $this->container['phone'] = $phone; + + return $this; + } + + /** + * Sets Gender, in lowercase. Either f or m. + * @param FacebookAds\Object\ServerSide\Gender $gender Gender, in lowercase. Either f or m. + * @return $this + */ + public function setGender($gender) { + $this->container['gender'] = $gender; + + return $this; + } + + /** + * Sets a date of birth given as year, month, and day. + * + *

Example: 19971226 for December 26, 1997. + * @param string $date_of_birth A date of birth given as year, month, and day. + * @return $this + */ + public function setDateOfBirth($date_of_birth) { + $this->container['date_of_birth'] = $date_of_birth; + + return $this; + } + + /** + * Sets a last name in lowercase. + * + *

Example: smith + * @param string $last_name A last name in lowercase. + * @return $this + */ + public function setLastName($last_name) { + $this->container['last_name'] = $last_name; + + return $this; + } + + /** + * Sets a first name in lowercase. + * + *

Example: joe + * @param string $first_name A first name in lowercase. + * @return $this + */ + public function setFirstName($first_name) { + $this->container['first_name'] = $first_name; + + return $this; + } + + /** + * Sets a city in lower-case without spaces or punctuation. + * + *

Example: menlopark + * @param string $city A city in lower-case without spaces or punctuation. + * @return $this + */ + public function setCity($city) { + $this->container['city'] = $city; + + return $this; + } + + /** + * Sets a two-letter state code in lowercase. + * + *

Example: ca + * @param string $state A two-letter state code in lowercase. + * @return $this + */ + public function setState($state) { + $this->container['state'] = $state; + + return $this; + } + + /** + * Sets a two-letter country code in lowercase. + * + *

Example: us + * @param string $country_code two-letter country code in lowercase. + * @return $this + */ + public function setCountryCode($country_code) { + $this->container['country_code'] = $country_code; + + return $this; + } + + /** + * Sets a five-digit zip code. + * + *

Example: 94035 + * @param string $zip_code A five-digit zip code. + * @return $this + */ + public function setZipCode($zip_code) { + $this->container['zip_code'] = $zip_code; + + return $this; + } + + /** + * Sets any unique ID from the advertiser, such as loyalty membership IDs, user IDs, and external + * cookie IDs. In the Offline Conversions API, this is known as extern_id. For more information, + * see Offline Conversions, Providing External IDs. If External ID is being sent via other + * channels, then it should be sent in the same format via the server-side API. + * @param string $external_id Any unique ID from the advertiser, such as loyalty membership IDs, + * user IDs, and external cookie IDs. + * @return $this + */ + public function setExternalId($external_id) { + $this->container['external_id'] = $external_id; + + return $this; + } + + /** + * Sets IP address of the browser corresponding to the event. + * @param string $client_ip_address The IP address of the browser corresponding to the event. + * @return $this + */ + public function setClientIpAddress($client_ip_address) { + $this->container['client_ip_address'] = $client_ip_address; + + return $this; + } + + /** + * Sets user agent for the browser corresponding to the event. + * @param string $client_user_agent The user agent for the browser corresponding to the event. + * @return $this + */ + public function setClientUserAgent($client_user_agent) { + $this->container['client_user_agent'] = $client_user_agent; + + return $this; + } + + /** + * Sets Facebook click ID value stored in the _fbc browser cookie under your domain. See Managing + * fbc and fbp Parameters for how to get this value + * (https://developers.facebook.com/docs/marketing-api/facebook-pixel/server-side-api/parameters#fbc), + * or generate this value from a fbclid query parameter. + * @param string $fbc The Facebook click ID value stored in the _fbc browser cookie under your domain. + * @return $this + */ + public function setFbc($fbc) { + $this->container['fbc'] = $fbc; + + return $this; + } + + /** + * Sets Set Facebook browser ID value stored in the _fbp browser cookie under your domain. See Managing + * fbc and fbp Parameters for how to get this value + * (https://developers.facebook.com/docs/marketing-api/facebook-pixel/server-side-api/parameters#fbc), + * or generate this value from a fbclid query parameter. + * @param string $fbp The Facebook browser ID value stored in the _fbp browser cookie under your domain. + * @return $this + */ + public function setFbp($fbp) { + $this->container['fbp'] = $fbp; + + return $this; + } + + /** + * Sets subscription ID for the user in this transaction. This is similar to the order ID for an + * individual product. + * @param string $subscription_id The subscription ID for the user in this transaction. + * @return $this + */ + public function setSubscriptionId($subscription_id) { + $this->container['subscription_id'] = $subscription_id; + + return $this; + } + + /** + * Sets FbLogin ID for the user in this transaction. + * ID issued by Facebook when a person first logs into an instance of an app. + * This is also known as App-Scoped ID. + * @param string $fb_login_id The Fb_Login_Id for the user in this transaction. + * @return $this + */ + public function setFbLoginId($fb_login_id) { + $this->container['fb_login_id'] = $fb_login_id; + + return $this; + } + + /** + * Sets lead_id for the user in this transaction. + * A lead_id is associated with a lead generated by Facebook's Lead Ads. + * @param string $lead_id The lead_id for the user in this transaction. + * @return $this + */ + public function setLeadId($lead_id) { + $this->container['lead_id'] = $lead_id; + + return $this; + } + + /** + * Sets the first 5 letters of the first name. + * @param string $f5first The first 5 letters of the first name. + * @return $this + */ + public function setF5first($f5first) { + $this->container['f5first'] = $f5first; + + return $this; + } + + /** + * Sets the first 5 letters of the last name. + * @param string $f5last The first 5 letters of the last name. + * @return $this + */ + public function setF5last($f5last) { + $this->container['f5last'] = $f5last; + + return $this; + } + + /** + * Sets the first initial. + * @param string $fi The first initial. + * @return $this + */ + public function setFi($fi) { + $this->container['fi'] = $fi; + + return $this; + } + + /** + * Sets the date of birth day. + * @param string $dobd The date of birth day. + * @return $this + */ + public function setDobd($dobd) { + $this->container['dobd'] = $dobd; + + return $this; + } + + /** + * Sets the date of birth month. + * @param string $dobm The date of birth month. + * @return $this + */ + public function setDobm($dobm) { + $this->container['dobm'] = $dobm; + + return $this; + } + + /** + * Sets the date of birth year. + * @param string $doby The date of birth year. + * @return $this + */ + public function setDoby($doby) { + $this->container['doby'] = $doby; + + return $this; + } + + /** + * Returns true if offset exists. False otherwise. + * @param integer $offset Offset + * @return boolean + */ + public function offsetExists($offset) { + return isset($this->container[$offset]); + } + + /** + * Gets offset. + * @param integer $offset Offset + * @return mixed + */ + public function offsetGet($offset) { + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + /** + * Sets value based on offset. + * @param integer $offset Offset + * @param mixed $value Value to be set + * @return void + */ + public function offsetSet($offset, $value) { + if (is_null($offset)) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * Unsets offset. + * @param integer $offset Offset + * @return void + */ + public function offsetUnset($offset) { + unset($this->container[$offset]); + } + + public function normalize() { + $normalized_payload = array(); + + $normalized_payload['em'] = Util::hash(Normalizer::normalize('em', $this->getEmail())); + $normalized_payload['ph'] = Util::hash(Normalizer::normalize('ph', $this->getPhone())); + $normalized_payload['ge'] = Util::hash(Normalizer::normalize('ge', $this->getGender())); + $normalized_payload['db'] = Util::hash(Normalizer::normalize('db', $this->getDateOfBirth())); + $normalized_payload['ln'] = Util::hash(Normalizer::normalize('ln', $this->getLastName())); + $normalized_payload['fn'] = Util::hash(Normalizer::normalize('fn', $this->getFirstName())); + $normalized_payload['ct'] = Util::hash(Normalizer::normalize('ct', $this->getCity())); + $normalized_payload['st'] = Util::hash(Normalizer::normalize('st', $this->getState())); + $normalized_payload['zp'] = Util::hash(Normalizer::normalize('zp', $this->getZipCode())); + $normalized_payload['country'] = Util::hash(Normalizer::normalize('country', $this->getCountryCode())); + $normalized_payload['external_id'] = $this->getExternalId(); + $normalized_payload['client_ip_address'] = $this->getClientIpAddress(); + $normalized_payload['client_user_agent'] = $this->getClientUserAgent(); + $normalized_payload['fbc'] = $this->getFbc(); + $normalized_payload['fbp'] = $this->getFbp(); + $normalized_payload['subscription_id'] = $this->getSubscriptionId(); + $normalized_payload['fb_login_id'] = $this->getFbLoginId(); + $normalized_payload['lead_id'] = $this->getLeadId(); + $normalized_payload['f5first'] = Util::hash(Normalizer::normalize('f5first', $this->getF5first())); + $normalized_payload['f5last'] = Util::hash(Normalizer::normalize('f5last', $this->getF5last())); + $normalized_payload['fi'] = Util::hash(Normalizer::normalize('fi', $this->getFi())); + $normalized_payload['dobd'] = Util::hash(Normalizer::normalize('dobd', $this->getDobd())); + $normalized_payload['dobm'] = Util::hash(Normalizer::normalize('dobm', $this->getDobm())); + $normalized_payload['doby'] = Util::hash(Normalizer::normalize('doby', $this->getDoby())); + $normalized_payload = array_filter($normalized_payload); + return $normalized_payload; + } + + /** + * Gets an email address, in lowercase. + * @return string + */ + public function getEmail() { + return $this->container['email']; + } + + /** + * Gets a phone number + * @return string + */ + public function getPhone() { + return $this->container['phone']; + } + + /** + * Gets gender. + * @return string + */ + public function getGender() { + return $this->container['gender']; + } + + /** + * Gets Date Of Birth. + * @return string + */ + public function getDateOfBirth() { + return $this->container['date_of_birth']; + } + + /** + * Gets Last Name. + * @return string + */ + public function getLastName() { + return $this->container['last_name']; + } + + /** + * Gets First Name. + * @return string + */ + public function getFirstName() { + return $this->container['first_name']; + } + + /** + * Gets city. + * @return string + */ + public function getCity() { + return $this->container['city']; + } + + /** + * Gets state. + * @return string + */ + public function getState() { + return $this->container['state']; + } + + /** + * Gets zip code + * @return string + */ + public function getZipCode() { + return $this->container['zip_code']; + } + + /** + * Gets country code. + * @return string + */ + public function getCountryCode() { + return $this->container['country_code']; + } + + /** + * Gets Any unique ID from the advertiser, such as loyalty membership IDs, user IDs, and external cookie IDs. + * @return string + */ + public function getExternalId() { + return $this->container['external_id']; + } + + /** + * Gets IP address of the browser corresponding to the event. + * @return string + */ + public function getClientIpAddress() { + return $this->container['client_ip_address']; + } + + /** + * Gets user agent for the browser corresponding to the event. + * @return string + */ + public function getClientUserAgent() { + return $this->container['client_user_agent']; + } + + /** + * Gets the Facebook click ID value stored in the _fbc browser cookie under your domain. + * @return string + */ + public function getFbc() { + return $this->container['fbc']; + } + + /** + * Gets the Facebook browser ID value stored in the _fbp browser cookie under your domain. + * @return string + */ + public function getFbp() { + return $this->container['fbp']; + } + + /** + * Gets the subscription ID for the user in this transaction. + * @return string + */ + public function getSubscriptionId() { + return $this->container['subscription_id']; + } + + /** + * Gets the FbLogin ID for the user in this transaction. + * @return string + */ + public function getFbLoginId() { + return $this->container['fb_login_id']; + } + + /** + * Gets the lead_id for the user in this transaction. + * @return string + */ + public function getLeadId() { + return $this->container['lead_id']; + } + + /** + * Gets the first 5 letters of the first name. + * @return string + */ + public function getF5first() { + return $this->container['f5first']; + } + + /** + * Gets the first 5 letters of the last name. + * @return string + */ + public function getF5last() { + return $this->container['f5last']; + } + + /** + * Gets the first initial. + * @return string + */ + public function getFi() { + return $this->container['fi']; + } + + /** + * Gets the date of birth day. + * @return string + */ + public function getDobd() { + return $this->container['dobd']; + } + + /** + * Gets the date of birth month. + * @return string + */ + public function getDobm() { + return $this->container['dobm']; + } + + /** + * Gets the date of birth year. + * @return string + */ + public function getDoby() { + return $this->container['doby']; + } + + /** + * Gets the string presentation of the object + * @return string + */ + public function __toString() { + if (defined('JSON_PRETTY_PRINT')) { // use JSON pretty print + return json_encode($this, JSON_PRETTY_PRINT); + } + + return json_encode($this); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Util.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Util.php new file mode 100644 index 00000000..2055aaed --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/Util.php @@ -0,0 +1,149 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new StoreCatalogSettings(), + 'NODE', + StoreCatalogSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'page' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new StoreCatalogSettings(), + 'NODE', + StoreCatalogSettings::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/SystemUser.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/SystemUser.php new file mode 100644 index 00000000..379f394f --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/SystemUser.php @@ -0,0 +1,52 @@ +getApi()->call( + '/'.$this->assureId().'/access_tokens', + RequestInterface::METHOD_DELETE); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Tab.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Tab.php new file mode 100644 index 00000000..2b64a3c2 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Tab.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['EffectiveDevicePlatforms'] = TargetingEffectiveDevicePlatformsValues::getInstance()->getValues(); + return $ref_enums; + } + + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingDynamicRule.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingDynamicRule.php new file mode 100644 index 00000000..96a65c61 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingDynamicRule.php @@ -0,0 +1,57 @@ + $class, + 'q' => $query, + ))); + + $response = $api->call('/search', RequestInterface::METHOD_GET, $params); + return new Cursor($response, new TargetingSearch()); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingSentenceLine.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingSentenceLine.php new file mode 100644 index 00000000..43b28630 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TargetingSentenceLine.php @@ -0,0 +1,64 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new ThirdPartyMeasurementReportDataset(), + 'NODE', + ThirdPartyMeasurementReportDataset::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'data' => 'list', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new ThirdPartyMeasurementReportDataset(), + 'NODE', + ThirdPartyMeasurementReportDataset::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TrackingAndConversionWithDefaults.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TrackingAndConversionWithDefaults.php new file mode 100644 index 00000000..6ba8ad02 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/TrackingAndConversionWithDefaults.php @@ -0,0 +1,57 @@ + $adlabel_id); + } + + return array('adlabels' => $adlabel_ids); + } + + /** + * @deprecated use createAdLabel instead + * @param array $ad_label_ids + */ + public function addAdLabels(array $ad_label_ids) { + $this->getApi()->call( + '/'.$this->assureId().'/adlabels', + RequestInterface::METHOD_POST, + $this->formatParams($ad_label_ids)); + } + + /** + * @deprecated use deleteAdLabels instead + * @param array $ad_label_ids + */ + public function removeAdLabels(array $ad_label_ids) { + $this->getApi()->call( + '/'.$this->assureId().'/adlabels', + RequestInterface::METHOD_DELETE, + $this->formatParams($ad_label_ids)); + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/FieldValidation.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/FieldValidation.php new file mode 100644 index 00000000..b53c3c6c --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/FieldValidation.php @@ -0,0 +1,48 @@ +isValidValue($name)) { + parent::__set($name, $value); + } else { + throw new \InvalidArgumentException( + $name.' is not a field of '.get_class($this)); + } + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/ObjectValidation.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/ObjectValidation.php new file mode 100644 index 00000000..4cc20db3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/Traits/ObjectValidation.php @@ -0,0 +1,54 @@ +changedFields; + $validate_flag = array( + 'execution_options' => array('validate_only') + ); + $this->save(array_merge($params, $validate_flag)); + $this->changedFields = $changed_fields; + return $this; + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/URL.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/URL.php new file mode 100644 index 00000000..a3331d45 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/URL.php @@ -0,0 +1,112 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new URL(), + 'NODE', + URL::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'blacklist' => 'bool', + 'denylist' => 'bool', + 'hmac' => 'string', + 'locale' => 'list', + 'scopes' => 'list', + 'ts' => 'datetime', + ); + $enums = array( + 'scopes_enum' => URLScopesValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new URL(), + 'NODE', + URL::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/UnifiedThread.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/UnifiedThread.php new file mode 100644 index 00000000..ce773a23 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/UnifiedThread.php @@ -0,0 +1,108 @@ +assureId(); + + $param_types = array( + 'source' => 'source_enum', + ); + $enums = array( + 'source_enum' => array( + 'ALL', + 'PARTICIPANTS', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/messages', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new UnifiedThread(), + 'NODE', + UnifiedThread::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/User.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/User.php new file mode 100644 index 00000000..9a6786ba --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/User.php @@ -0,0 +1,1738 @@ +getValues(); + $ref_enums['LocalNewsSubscriptionStatus'] = UserLocalNewsSubscriptionStatusValues::getInstance()->getValues(); + $ref_enums['Filtering'] = UserFilteringValues::getInstance()->getValues(); + $ref_enums['Type'] = UserTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAccessTokens(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/access_tokens', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'is_place' => 'bool', + 'is_promotable' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/accounts', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAccount(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'about' => 'string', + 'address' => 'string', + 'category' => 'int', + 'category_enum' => 'string', + 'category_list' => 'list', + 'city_id' => 'string', + 'coordinates' => 'Object', + 'cover_photo' => 'Object', + 'description' => 'string', + 'ignore_coordinate_warnings' => 'bool', + 'location' => 'Object', + 'name' => 'string', + 'phone' => 'string', + 'picture' => 'string', + 'website' => 'string', + 'zip' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/accounts', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdStudies(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAdStudy(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'cells' => 'list', + 'client_business' => 'string', + 'confidence_level' => 'float', + 'cooldown_start_time' => 'int', + 'description' => 'string', + 'end_time' => 'int', + 'name' => 'string', + 'objectives' => 'list', + 'observation_end_time' => 'int', + 'start_time' => 'int', + 'type' => 'type_enum', + 'viewers' => 'list', + ); + $enums = array( + 'type_enum' => AdStudyTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/ad_studies', + new AdStudy(), + 'EDGE', + AdStudy::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/adaccounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAlbums(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/albums', + new Album(), + 'EDGE', + Album::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createApplication(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business_app' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/applications', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAppRequestFormerRecipients(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/apprequestformerrecipients', + new AppRequestFormerRecipient(), + 'EDGE', + AppRequestFormerRecipient::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAppRequests(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/apprequests', + new AppRequest(), + 'EDGE', + AppRequest::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedBusinessAssetGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'contained_asset_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_business_asset_groups', + new BusinessAssetGroup(), + 'EDGE', + BusinessAssetGroup::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_pages', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinessUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/business_users', + new BusinessUser(), + 'EDGE', + BusinessUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteBusinesses(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/businesses', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getBusinesses(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/businesses', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createBusiness(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'child_business_external_id' => 'string', + 'email' => 'string', + 'name' => 'string', + 'primary_page' => 'string', + 'sales_rep_email' => 'string', + 'survey_business_type' => 'survey_business_type_enum', + 'survey_num_assets' => 'unsigned int', + 'survey_num_people' => 'unsigned int', + 'timezone_id' => 'unsigned int', + 'vertical' => 'vertical_enum', + ); + $enums = array( + 'survey_business_type_enum' => BusinessSurveyBusinessTypeValues::getInstance()->getValues(), + 'vertical_enum' => BusinessVerticalValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/businesses', + new Business(), + 'EDGE', + Business::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getConversations(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'folder' => 'string', + 'tags' => 'list', + 'user_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/conversations', + new UnifiedThread(), + 'EDGE', + UnifiedThread::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getCustomLabels(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/custom_labels', + new PageUserMessageThreadLabel(), + 'EDGE', + PageUserMessageThreadLabel::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getEvents(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_canceled' => 'bool', + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => EventTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/events', + new Event(), + 'EDGE', + Event::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'include_hidden' => 'bool', + 'q' => 'string', + 'show_expired' => 'bool', + 'since' => 'datetime', + 'until' => 'datetime', + 'with' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/feed', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createFeed(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'actions' => 'Object', + 'adaptive_type' => 'string', + 'album_id' => 'string', + 'android_key_hash' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'asset3d_id' => 'unsigned int', + 'associated_id' => 'string', + 'attach_place_suggestion' => 'bool', + 'attached_media' => 'list', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'call_to_action' => 'Object', + 'caption' => 'string', + 'checkin_entry_point' => 'checkin_entry_point_enum', + 'child_attachments' => 'list', + 'client_mutation_id' => 'string', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'connection_class' => 'string', + 'content_attachment' => 'string', + 'coordinates' => 'Object', + 'cta_link' => 'string', + 'cta_type' => 'string', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'expanded_height' => 'unsigned int', + 'expanded_width' => 'unsigned int', + 'feed_targeting' => 'Object', + 'formatting' => 'formatting_enum', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'has_nickname' => 'bool', + 'height' => 'unsigned int', + 'holiday_card' => 'string', + 'home_checkin_city_id' => 'Object', + 'image_crops' => 'map', + 'implicit_with_tags' => 'list', + 'instant_game_entry_point_data' => 'string', + 'ios_bundle_id' => 'string', + 'is_backout_draft' => 'bool', + 'is_boost_intended' => 'bool', + 'is_explicit_location' => 'bool', + 'is_explicit_share' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_photo_container' => 'bool', + 'link' => 'string', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'multi_share_end_card' => 'bool', + 'multi_share_optimized' => 'bool', + 'name' => 'string', + 'nectar_module' => 'string', + 'object_attachment' => 'string', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_hide_object_attachment' => 'bool', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'page_recommendation' => 'string', + 'picture' => 'string', + 'place' => 'Object', + 'place_attachment_setting' => 'place_attachment_setting_enum', + 'place_list' => 'string', + 'place_list_data' => 'list', + 'post_surfaces_blacklist' => 'list', + 'posting_to_redspace' => 'posting_to_redspace_enum', + 'privacy' => 'string', + 'prompt_id' => 'string', + 'prompt_tracking_string' => 'string', + 'properties' => 'Object', + 'proxied_app_id' => 'string', + 'publish_event_id' => 'unsigned int', + 'published' => 'bool', + 'quote' => 'string', + 'react_mode_metadata' => 'string', + 'ref' => 'list', + 'referenceable_image_ids' => 'list', + 'referral_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'scheduled_publish_time' => 'datetime', + 'source' => 'string', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'suggested_place_id' => 'Object', + 'tags' => 'list', + 'target_surface' => 'target_surface_enum', + 'targeting' => 'Object', + 'text_format_metadata' => 'string', + 'text_format_preset_id' => 'string', + 'text_only_place' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumbnail' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'tracking_info' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'user_selected_tags' => 'bool', + 'video_start_time_ms' => 'unsigned int', + 'viewer_coordinates' => 'Object', + 'width' => 'unsigned int', + ); + $enums = array( + 'backdated_time_granularity_enum' => PostBackdatedTimeGranularityValues::getInstance()->getValues(), + 'checkin_entry_point_enum' => PostCheckinEntryPointValues::getInstance()->getValues(), + 'formatting_enum' => PostFormattingValues::getInstance()->getValues(), + 'place_attachment_setting_enum' => PostPlaceAttachmentSettingValues::getInstance()->getValues(), + 'post_surfaces_blacklist_enum' => PostPostSurfacesBlacklistValues::getInstance()->getValues(), + 'posting_to_redspace_enum' => PostPostingToRedspaceValues::getInstance()->getValues(), + 'target_surface_enum' => PostTargetSurfaceValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => PostUnpublishedContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/feed', + new Post(), + 'EDGE', + Post::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getFriends(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'uid' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/friends', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createGameItem(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + 'app_id' => 'string', + 'drop_table_id' => 'string', + 'ext_id' => 'string', + 'item_id' => 'string', + 'quantity' => 'unsigned int', + ); + $enums = array( + 'action_enum' => array( + 'CONSUME', + 'DROP', + 'MARK', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/game_items', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createGameTime(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + ); + $enums = array( + 'action_enum' => array( + 'END', + 'HEARTBEAT', + 'START', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/game_times', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createGamesPlay(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'added' => 'string', + 'alias' => 'string', + 'android_key_hash' => 'string', + 'client_secret' => 'string', + 'created_time' => 'datetime', + 'end_time' => 'datetime', + 'expires_in' => 'unsigned int', + 'fb:channel' => 'string', + 'fb:explicitly_shared' => 'bool', + 'image:height' => 'unsigned int', + 'image:secure_url' => 'string', + 'image:type' => 'string', + 'image:url' => 'string', + 'image:user_generated' => 'bool', + 'image:width' => 'unsigned int', + 'ios_bundle_id' => 'string', + 'message' => 'string', + 'no_action_link' => 'bool', + 'no_feed_story' => 'bool', + 'notify' => 'bool', + 'place' => 'string', + 'preview' => 'bool', + 'privacy' => 'string', + 'proxied_app_id' => 'string', + 'ref' => 'string', + 'scrape' => 'bool', + 'start_time' => 'datetime', + 'tags' => 'list', + 'to' => 'string', + 'user_selected_place' => 'bool', + 'user_selected_tags' => 'bool', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/games_plays', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getGroups(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'admin_only' => 'bool', + 'parent' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/groups', + new Group(), + 'EDGE', + Group::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getIdsForApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ids_for_apps', + new UserIDForApp(), + 'EDGE', + UserIDForApp::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getIdsForBusiness(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'app' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ids_for_business', + new UserIDForApp(), + 'EDGE', + UserIDForApp::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getIdsForPages(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'page' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/ids_for_pages', + new UserIDForPage(), + 'EDGE', + UserIDForPage::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLikes(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'target_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/likes', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveEncoders(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_encoders', + new LiveEncoder(), + 'EDGE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLiveEncoder(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'brand' => 'string', + 'device_id' => 'string', + 'model' => 'string', + 'name' => 'string', + 'version' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/live_encoders', + new LiveEncoder(), + 'EDGE', + LiveEncoder::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getLiveVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'broadcast_status' => 'list', + 'source' => 'source_enum', + ); + $enums = array( + 'broadcast_status_enum' => LiveVideoBroadcastStatusValues::getInstance()->getValues(), + 'source_enum' => LiveVideoSourceValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createLiveVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'content_tags' => 'list', + 'description' => 'string', + 'enable_backup_ingest' => 'bool', + 'encoding_settings' => 'string', + 'fisheye_video_cropped' => 'bool', + 'front_z_rotation' => 'float', + 'is_audio_only' => 'bool', + 'is_spherical' => 'bool', + 'live_encoders' => 'list', + 'original_fov' => 'unsigned int', + 'planned_start_time' => 'int', + 'privacy' => 'string', + 'projection' => 'projection_enum', + 'published' => 'bool', + 'schedule_custom_profile_image' => 'file', + 'spatial_audio_format' => 'spatial_audio_format_enum', + 'status' => 'status_enum', + 'stereoscopic_mode' => 'stereoscopic_mode_enum', + 'stop_on_delete_stream' => 'bool', + 'stream_type' => 'stream_type_enum', + 'title' => 'string', + ); + $enums = array( + 'projection_enum' => LiveVideoProjectionValues::getInstance()->getValues(), + 'spatial_audio_format_enum' => LiveVideoSpatialAudioFormatValues::getInstance()->getValues(), + 'status_enum' => LiveVideoStatusValues::getInstance()->getValues(), + 'stereoscopic_mode_enum' => LiveVideoStereoscopicModeValues::getInstance()->getValues(), + 'stream_type_enum' => LiveVideoStreamTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/live_videos', + new LiveVideo(), + 'EDGE', + LiveVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMusic(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'target_id' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/music', + new Page(), + 'EDGE', + Page::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createNotification(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'filtering' => 'list', + 'href' => 'Object', + 'notif_ids' => 'list', + 'read' => 'bool', + 'ref' => 'string', + 'seen' => 'bool', + 'template' => 'Object', + 'type' => 'type_enum', + ); + $enums = array( + 'filtering_enum' => UserFilteringValues::getInstance()->getValues(), + 'type_enum' => UserTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/notifications', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getOwnedProductCatalogs(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/owned_product_catalogs', + new ProductCatalog(), + 'EDGE', + ProductCatalog::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deletePermissions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'permission' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/permissions', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPermissions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'permission' => 'string', + 'status' => 'status_enum', + ); + $enums = array( + 'status_enum' => PermissionStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/permissions', + new Permission(), + 'EDGE', + Permission::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPersonalAdAccounts(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/personal_ad_accounts', + new AdAccount(), + 'EDGE', + AdAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPhotos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => PhotoTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createPhoto(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'aid' => 'string', + 'allow_spherical_photo' => 'bool', + 'alt_text_custom' => 'string', + 'android_key_hash' => 'string', + 'application_id' => 'string', + 'attempt' => 'unsigned int', + 'audience_exp' => 'bool', + 'backdated_time' => 'datetime', + 'backdated_time_granularity' => 'backdated_time_granularity_enum', + 'caption' => 'string', + 'composer_session_id' => 'string', + 'direct_share_status' => 'unsigned int', + 'feed_targeting' => 'Object', + 'filter_type' => 'unsigned int', + 'full_res_is_coming_later' => 'bool', + 'initial_view_heading_override_degrees' => 'unsigned int', + 'initial_view_pitch_override_degrees' => 'unsigned int', + 'initial_view_vertical_fov_override_degrees' => 'unsigned int', + 'ios_bundle_id' => 'string', + 'is_explicit_location' => 'bool', + 'is_explicit_place' => 'bool', + 'is_visual_search' => 'bool', + 'manual_privacy' => 'bool', + 'message' => 'string', + 'name' => 'string', + 'no_story' => 'bool', + 'offline_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_set_profile_badge' => 'bool', + 'og_suggestion_mechanism' => 'string', + 'place' => 'Object', + 'privacy' => 'string', + 'profile_id' => 'int', + 'proxied_app_id' => 'string', + 'published' => 'bool', + 'qn' => 'string', + 'scheduled_publish_time' => 'unsigned int', + 'spherical_metadata' => 'map', + 'sponsor_id' => 'string', + 'sponsor_relationship' => 'unsigned int', + 'tags' => 'list', + 'target_id' => 'int', + 'targeting' => 'Object', + 'time_since_original_post' => 'unsigned int', + 'uid' => 'int', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'url' => 'string', + 'user_selected_tags' => 'bool', + 'vault_image_id' => 'string', + ); + $enums = array( + 'backdated_time_granularity_enum' => PhotoBackdatedTimeGranularityValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => PhotoUnpublishedContentTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/photos', + new Photo(), + 'EDGE', + Photo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPicture(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'breaking_change' => 'breaking_change_enum', + 'height' => 'int', + 'redirect' => 'bool', + 'type' => 'type_enum', + 'width' => 'int', + ); + $enums = array( + 'breaking_change_enum' => ProfilePictureSourceBreakingChangeValues::getInstance()->getValues(), + 'type_enum' => ProfilePictureSourceTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/picture', + new ProfilePictureSource(), + 'EDGE', + ProfilePictureSource::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getRichMediaDocuments(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'query' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/rich_media_documents', + new Canvas(), + 'EDGE', + Canvas::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createStagingResource(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'file' => 'file', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/staging_resources', + new User(), + 'EDGE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getVideos(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'type' => 'type_enum', + ); + $enums = array( + 'type_enum' => AdVideoTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createVideo(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'adaptive_type' => 'string', + 'animated_effect_id' => 'unsigned int', + 'application_id' => 'string', + 'asked_fun_fact_prompt_id' => 'unsigned int', + 'attribution_app_id' => 'string', + 'audio_story_wave_animation_handle' => 'string', + 'composer_entry_picker' => 'string', + 'composer_entry_point' => 'string', + 'composer_entry_time' => 'unsigned int', + 'composer_session_events_log' => 'string', + 'composer_session_id' => 'string', + 'composer_source_surface' => 'string', + 'composer_type' => 'string', + 'container_type' => 'container_type_enum', + 'content_category' => 'content_category_enum', + 'creative_tools' => 'string', + 'description' => 'string', + 'direct_share_status' => 'unsigned int', + 'embeddable' => 'bool', + 'end_offset' => 'unsigned int', + 'fbuploader_video_file_chunk' => 'string', + 'file_size' => 'unsigned int', + 'file_url' => 'string', + 'fisheye_video_cropped' => 'bool', + 'formatting' => 'formatting_enum', + 'fov' => 'unsigned int', + 'front_z_rotation' => 'float', + 'fun_fact_prompt_id' => 'unsigned int', + 'fun_fact_toastee_id' => 'unsigned int', + 'guide' => 'list>', + 'guide_enabled' => 'bool', + 'has_nickname' => 'bool', + 'holiday_card' => 'string', + 'initial_heading' => 'unsigned int', + 'initial_pitch' => 'unsigned int', + 'instant_game_entry_point_data' => 'string', + 'is_boost_intended' => 'bool', + 'is_explicit_share' => 'bool', + 'is_group_linking_post' => 'bool', + 'is_voice_clip' => 'bool', + 'location_source_id' => 'string', + 'manual_privacy' => 'bool', + 'no_story' => 'bool', + 'offer_like_post_id' => 'unsigned int', + 'og_action_type_id' => 'string', + 'og_icon_id' => 'string', + 'og_object_id' => 'string', + 'og_phrase' => 'string', + 'og_suggestion_mechanism' => 'string', + 'original_fov' => 'unsigned int', + 'original_projection_type' => 'original_projection_type_enum', + 'privacy' => 'string', + 'publish_event_id' => 'unsigned int', + 'react_mode_metadata' => 'string', + 'referenced_sticker_id' => 'string', + 'replace_video_id' => 'string', + 'sales_promo_id' => 'unsigned int', + 'slideshow_spec' => 'map', + 'source' => 'string', + 'source_instagram_media_id' => 'string', + 'spherical' => 'bool', + 'sponsor_id' => 'string', + 'start_offset' => 'unsigned int', + 'swap_mode' => 'swap_mode_enum', + 'text_format_metadata' => 'string', + 'throwback_camera_roll_media' => 'string', + 'thumb' => 'file', + 'time_since_original_post' => 'unsigned int', + 'title' => 'string', + 'transcode_setting_properties' => 'string', + 'unpublished_content_type' => 'unpublished_content_type_enum', + 'upload_phase' => 'upload_phase_enum', + 'upload_session_id' => 'string', + 'upload_setting_properties' => 'string', + 'video_file_chunk' => 'string', + 'video_id_original' => 'string', + 'video_start_time_ms' => 'unsigned int', + 'waterfall_id' => 'string', + ); + $enums = array( + 'container_type_enum' => AdVideoContainerTypeValues::getInstance()->getValues(), + 'content_category_enum' => AdVideoContentCategoryValues::getInstance()->getValues(), + 'formatting_enum' => AdVideoFormattingValues::getInstance()->getValues(), + 'original_projection_type_enum' => AdVideoOriginalProjectionTypeValues::getInstance()->getValues(), + 'swap_mode_enum' => AdVideoSwapModeValues::getInstance()->getValues(), + 'unpublished_content_type_enum' => AdVideoUnpublishedContentTypeValues::getInstance()->getValues(), + 'upload_phase_enum' => AdVideoUploadPhaseValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/', + new AbstractCrudObject(), + 'NODE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new User(), + 'NODE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'emoji_color_pref' => 'unsigned int', + 'firstname' => 'string', + 'lastname' => 'string', + 'local_news_megaphone_dismiss_status' => 'local_news_megaphone_dismiss_status_enum', + 'local_news_subscription_status' => 'local_news_subscription_status_enum', + 'name' => 'string', + 'password' => 'string', + ); + $enums = array( + 'local_news_megaphone_dismiss_status_enum' => UserLocalNewsMegaphoneDismissStatusValues::getInstance()->getValues(), + 'local_news_subscription_status_enum' => UserLocalNewsSubscriptionStatusValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new User(), + 'NODE', + User::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserCoverPhoto.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserCoverPhoto.php new file mode 100644 index 00000000..c35e6eb4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/UserCoverPhoto.php @@ -0,0 +1,57 @@ +getValues(); + $ref_enums['BodyStyle'] = VehicleBodyStyleValues::getInstance()->getValues(); + $ref_enums['Condition'] = VehicleConditionValues::getInstance()->getValues(); + $ref_enums['Drivetrain'] = VehicleDrivetrainValues::getInstance()->getValues(); + $ref_enums['FuelType'] = VehicleFuelTypeValues::getInstance()->getValues(); + $ref_enums['StateOfVehicle'] = VehicleStateOfVehicleValues::getInstance()->getValues(); + $ref_enums['Transmission'] = VehicleTransmissionValues::getInstance()->getValues(); + $ref_enums['VehicleType'] = VehicleVehicleTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new Vehicle(), + 'NODE', + Vehicle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'address' => 'map', + 'applinks' => 'Object', + 'availability' => 'availability_enum', + 'body_style' => 'body_style_enum', + 'condition' => 'condition_enum', + 'currency' => 'string', + 'date_first_on_lot' => 'string', + 'dealer_id' => 'string', + 'dealer_name' => 'string', + 'dealer_phone' => 'string', + 'description' => 'string', + 'drivetrain' => 'drivetrain_enum', + 'exterior_color' => 'string', + 'fb_page_id' => 'string', + 'fuel_type' => 'fuel_type_enum', + 'images' => 'list', + 'interior_color' => 'string', + 'make' => 'string', + 'mileage' => 'map', + 'model' => 'string', + 'price' => 'unsigned int', + 'state_of_vehicle' => 'state_of_vehicle_enum', + 'title' => 'string', + 'transmission' => 'transmission_enum', + 'trim' => 'string', + 'url' => 'string', + 'vehicle_type' => 'vehicle_type_enum', + 'vin' => 'string', + 'year' => 'unsigned int', + ); + $enums = array( + 'availability_enum' => VehicleAvailabilityValues::getInstance()->getValues(), + 'body_style_enum' => VehicleBodyStyleValues::getInstance()->getValues(), + 'condition_enum' => VehicleConditionValues::getInstance()->getValues(), + 'drivetrain_enum' => VehicleDrivetrainValues::getInstance()->getValues(), + 'fuel_type_enum' => VehicleFuelTypeValues::getInstance()->getValues(), + 'state_of_vehicle_enum' => VehicleStateOfVehicleValues::getInstance()->getValues(), + 'transmission_enum' => VehicleTransmissionValues::getInstance()->getValues(), + 'vehicle_type_enum' => VehicleVehicleTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new Vehicle(), + 'NODE', + Vehicle::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VehicleOffer.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VehicleOffer.php new file mode 100644 index 00000000..b50f358e --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VehicleOffer.php @@ -0,0 +1,80 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new VehicleOffer(), + 'NODE', + VehicleOffer::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyright.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyright.php new file mode 100644 index 00000000..11cf1d17 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyright.php @@ -0,0 +1,120 @@ +getValues(); + $ref_enums['MonitoringType'] = VideoCopyrightMonitoringTypeValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new VideoCopyright(), + 'NODE', + VideoCopyright::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'append_excluded_ownership_segments' => 'bool', + 'attribution_id' => 'string', + 'content_category' => 'content_category_enum', + 'excluded_ownership_countries' => 'list', + 'excluded_ownership_segments' => 'list', + 'is_reference_disabled' => 'bool', + 'monitoring_type' => 'monitoring_type_enum', + 'ownership_countries' => 'list', + 'rule_id' => 'string', + 'whitelisted_ids' => 'list', + 'whitelisted_ig_user_ids' => 'list', + ); + $enums = array( + 'content_category_enum' => VideoCopyrightContentCategoryValues::getInstance()->getValues(), + 'monitoring_type_enum' => VideoCopyrightMonitoringTypeValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new VideoCopyright(), + 'NODE', + VideoCopyright::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightConditionGroup.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightConditionGroup.php new file mode 100644 index 00000000..2cc34d8d --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightConditionGroup.php @@ -0,0 +1,57 @@ +getValues(); + return $ref_enums; + } + + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new VideoCopyrightRule(), + 'NODE', + VideoCopyrightRule::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightSegment.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightSegment.php new file mode 100644 index 00000000..e95c9140 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoCopyrightSegment.php @@ -0,0 +1,57 @@ +assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/videos', + new AdVideo(), + 'EDGE', + AdVideo::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new VideoList(), + 'NODE', + VideoList::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoPoll.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoPoll.php new file mode 100644 index 00000000..4c085711 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoPoll.php @@ -0,0 +1,136 @@ +getValues(); + $ref_enums['Action'] = VideoPollActionValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function getPollOptions(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/poll_options', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new VideoPoll(), + 'NODE', + VideoPoll::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function updateSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'action' => 'action_enum', + 'close_after_voting' => 'bool', + 'default_open' => 'bool', + 'show_gradient' => 'bool', + 'show_results' => 'bool', + ); + $enums = array( + 'action_enum' => VideoPollActionValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/', + new VideoPoll(), + 'NODE', + VideoPoll::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoThumbnail.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoThumbnail.php new file mode 100644 index 00000000..ec1afc65 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/VideoThumbnail.php @@ -0,0 +1,64 @@ +getValues(); + $ref_enums['Category'] = WhatsAppBusinessAccountCategoryValues::getInstance()->getValues(); + return $ref_enums; + } + + + public function deleteAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'user' => 'int', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/assigned_users', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getAssignedUsers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'business' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/assigned_users', + new AssignedUser(), + 'EDGE', + AssignedUser::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createAssignedUser(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'tasks' => 'list', + 'user' => 'int', + ); + $enums = array( + 'tasks_enum' => WhatsAppBusinessAccountTasksValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/assigned_users', + new WhatsAppBusinessAccount(), + 'EDGE', + WhatsAppBusinessAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteMessageTemplates(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'name' => 'string', + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/message_templates', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getMessageTemplates(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'category' => 'list', + 'content' => 'string', + 'language' => 'list', + 'name' => 'string', + 'name_or_content' => 'string', + 'status' => 'list', + ); + $enums = array( + 'category_enum' => WhatsAppBusinessAccountCategoryValues::getInstance()->getValues(), + 'status_enum' => array( + 'APPROVED', + 'DELETED', + 'DISABLED', + 'IN_APPEAL', + 'PENDING', + 'PENDING_DELETION', + 'REJECTED', + ), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/message_templates', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createMessageTemplate(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + 'category' => 'category_enum', + 'components' => 'list', + 'language' => 'string', + 'name' => 'string', + ); + $enums = array( + 'category_enum' => WhatsAppBusinessAccountCategoryValues::getInstance()->getValues(), + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/message_templates', + new WhatsAppBusinessAccount(), + 'EDGE', + WhatsAppBusinessAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getPhoneNumbers(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/phone_numbers', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function deleteSubscribedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_DELETE, + '/subscribed_apps', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSubscribedApps(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/subscribed_apps', + new AbstractCrudObject(), + 'EDGE', + array(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function createSubscribedApp(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_POST, + '/subscribed_apps', + new WhatsAppBusinessAccount(), + 'EDGE', + WhatsAppBusinessAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + + public function getSelf(array $fields = array(), array $params = array(), $pending = false) { + $this->assureId(); + + $param_types = array( + ); + $enums = array( + ); + + $request = new ApiRequest( + $this->api, + $this->data['id'], + RequestInterface::METHOD_GET, + '/', + new WhatsAppBusinessAccount(), + 'NODE', + WhatsAppBusinessAccount::getFieldsEnum()->getValues(), + new TypeChecker($param_types, $enums) + ); + $request->addParams($params); + $request->addFields($fields); + return $pending ? $request : $request->execute(); + } + +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/Object/WindowsAppLink.php b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/WindowsAppLink.php new file mode 100644 index 00000000..7abb908b --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/Object/WindowsAppLink.php @@ -0,0 +1,57 @@ +appId = $app_id; + $this->appSecret = $app_secret; + $this->accessToken = $access_token; + } + + /** + * @return string + */ + public function getAppId() { + return $this->appId; + } + + /** + * @return string + */ + public function getAppSecret() { + return $this->appSecret; + } + + /** + * @return string + */ + public function getAccessToken() { + return $this->accessToken; + } + + /** + * @return string + */ + public function getAppSecretProof() { + if ($this->getAppSecret() === null) { + return null; + } + if ($this->appSecretProof === null) { + $this->appSecretProof + = hash_hmac('sha256', $this->getAccessToken(), $this->getAppSecret()); + } + return $this->appSecretProof; + } + + /** + * @return array + */ + public function getRequestParameters() { + if ($this->getAppSecretProof() !== null) { + return array( + 'access_token' => $this->getAccessToken(), + 'appsecret_proof' => $this->getAppSecretProof(), + ); + } else { + return array( + 'access_token' => $this->getAccessToken(), + ); + } + } +} diff --git a/vendor/facebook/php-business-sdk/src/FacebookAds/SessionInterface.php b/vendor/facebook/php-business-sdk/src/FacebookAds/SessionInterface.php new file mode 100644 index 00000000..0c1769e4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/src/FacebookAds/SessionInterface.php @@ -0,0 +1,33 @@ +type_data = $type_check_info; + $this->enum_data = $type_check_enum; + } + + public function isPrimitiveType($param) { + return (in_array($param, $this->primitive_types) || + array_key_exists($param, $this->enum_data)); + } + + public function convertStringToPrimType($primitive_type, $value) { + if (array_key_exists($primitive_type, $this->enum_data)) { + return $value; + } elseif (in_array($primitive_type, array("unsigned int", "int"))) { + return intval($value); + } elseif ($primitive_type === "bool") { + return boolval($value); + } elseif ($primitive_type === "float") { + return floatval($value); + } elseif ($primitive_type === "datetime") { + return $value; + } elseif ($primitive_type === "string") { + return $value; + } elseif ($primitive_type === "Object") { + return $value; + } else { + if (ApiConfig::TYPE_CHECKER_STRICT_MODE) { + throw new \Exception("Not a primitive type"); + } else { + return $value; + } + } + } + + public function getType($param) { + if (array_key_exists($param, $this->type_data)) { + return $this->type_data[$param]; + } else { + return null; + } + } + + public function isValidParam($param) { + return array_key_exists($param, $this->type_data); + } + + public function isValidParamPair($param, $value) { + if ($this->isValidParam($param)) { + $type = $this->type_data[$param]; + return $this->checkType($type, $value); + } + return false; + } + + public function checkType($type, $value, $allow_array_for_obj = true) { + if ($value === null || $type === null || $type === "Object") { + return true; + } else if (array_key_exists($type, $this->enum_data)) { + return in_array($value, $this->enum_data[$type]); + } else if ($type === "file") { + return file_exists($value); + } else if ($type === "list" || $type === "map") { + return is_array($value); + } else if ($type === "bool") { + return is_bool($value); + } else if ($type === "int" || $type === "unsigned int" || $type === "float") { + return is_numeric($value); + } else if ($type === "string" || $type === "datetime") { + return is_string($value) || is_numeric($value) || is_bool($value); + } else if ($this->isTypeCollection($type, "list")) { + $sub_types = $this->getTypeFromCollection($type, "list"); + $sub_type = $sub_types[0]; + if (is_array($value)) { + if (empty($value)) { + return true; + } + $all_object_same_type = true; + foreach ($value as $key => $sub_value) { + $all_object_same_type = ($all_object_same_type && + $this->checkType($sub_type, $sub_value)); + } + return $all_object_same_type; + } else { + return $this->checkType($sub_type, $value); + } + } else if ($this->isTypeCollection($type, "map")) { + if (is_array($value)) { + $sub_types = $this->getTypeFromCollection($type, "map"); + if (count($sub_types) === 1) { + $sub_key_type = 'string'; + $sub_value_type = $sub_types[0]; + } else { + $sub_key_type = $sub_types[0]; + $sub_value_type = $sub_types[1]; + } + $all_object_same_type = true; + foreach ($value as $key => $sub_value) { + $all_object_same_type = ($all_object_same_type && + $this->checkType($sub_key_type, $key) && + $this->checkType($sub_value_type, $sub_value)); + } + return $all_object_same_type; + } + } else { + // the type is an object + if ($allow_array_for_obj && is_array($value)) { + return true; + } + if (!$this->startsWith($type, self::ABSTRACT_OBJECT_PREFIX)) { + $type = self::ABSTRACT_OBJECT_PREFIX.$type; + } + return is_a($value, $type); + } + return false; + } + + public function isAbstractObject($value) { + if (is_object($value)) { + $cls_name = get_class($value); + return $this->startsWith($cls_name, self::ABSTRACT_OBJECT_PREFIX); + } + return false; + } + + private function startsWith($string, $prefix) { + return $prefix === "" || + strrpos($string, $prefix, -strlen($string)) !== false; + } + + public function isListParam($param) { + if ($this->isValidParam($param)) { + return $this->isTypeCollection($this->type_data[$param], "list"); + } + return false; + } + + public function isMapParam($param) { + if ($this->isValidParam($param)) { + return $this->isTypeCollection($this->type_data[$param], "map"); + } + return false; + } + + public function isFileParam($param) { + if ($this->isValidParam($param)) { + return ($this->type_data[$param] === "file"); + } + return false; + } + + public function isTypeCollection($type, $collection) { + $len_of_collection = strlen($collection); + $typeCollection = substr($type, 0, $len_of_collection); + return ($collection === $typeCollection); + } + + public function getTypeFromCollection($type, $collection) { + return explode(",", trim(substr($type, strlen($collection)), "<>")); + } +} diff --git a/vendor/facebook/php-business-sdk/test/.gitignore b/vendor/facebook/php-business-sdk/test/.gitignore new file mode 100644 index 00000000..a5719aec --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/.gitignore @@ -0,0 +1 @@ +/report diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractIntegrationTestCase.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractIntegrationTestCase.php new file mode 100644 index 00000000..ecfc16ae --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractIntegrationTestCase.php @@ -0,0 +1,161 @@ +logger; + } + + /** + * @return Session + */ + public function getSession() { + return $this->session; + } + + /** + * @return Client + */ + public function getHttpClient() { + return $this->httpClient; + } + + /** + * @return Api + */ + public function getApi() { + return $this->api; + } + + protected function setupSession() { + $this->session = new Session( + $this->getConfig()->appId, + $this->getConfig()->appSecret, + $this->getConfig()->accessToken); + } + + protected function setupHttpClient() { + $this->httpClient = new Client(); + if ($this->getConfig()->graphBaseDomain) { + $this->httpClient->setDefaultGraphBaseDomain( + $this->getConfig()->graphBaseDomain); + } + if ($this->getConfig()->skipSslVerification) { + /** @var CurlAdapter $adapter */ + $adapter = $this->httpClient->getAdapter(); + $adapter->getOpts()->offsetSet(CURLOPT_SSL_VERIFYHOST, false); + $adapter->getOpts()->offsetSet(CURLOPT_SSL_VERIFYPEER, false); + } + } + + protected function setupLogger() { + $this->logger = $this->getConfig()->curlLogger + ? new CurlLogger(fopen($this->getConfig()->curlLogger, "a")) + : new NullLogger(); + } + + protected function setupApi() { + $this->api = new Api( + $this->getHttpClient(), + $this->getSession()); + + $this->api->setLogger($this->getLogger()); + + Api::setInstance($this->api); + } + + public function setup() : void { + parent::setup(); + + $this->getSkippableFeaturesManager()->enforceSkipTest($this); + + $this->setupLogger(); + $this->setupSession(); + $this->setupHttpClient(); + $this->setupApi(); + } + + public function tearDown() : void { + $this->api = null; + $this->httpClient = null; + $this->session = null; + $this->logger = null; + + parent::tearDown(); + } + + /** + * This method is called when a test method did not execute successfully. + * + * @param \Throwable $e + * @throws \Throwable + */ + protected function onNotSuccessfulTest(\Throwable $e) : void { + if ($e instanceof RequestException) { + throw new PHPUnitRequestExceptionWrapper($e); + } else { + throw $e; + } + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractTestCase.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractTestCase.php new file mode 100644 index 00000000..00c20b64 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractTestCase.php @@ -0,0 +1,132 @@ +getSkippableFeaturesManager()->isSkipKey($key); + } + + public function skipIf($key) { + if ($this->shouldSkipTest($key)) { + $this->markTestSkipped(); + } + } + + /** + * @return Config + */ + public function getConfig() { + return Config::instance(); + } + + /** + * @return string + * @deprecated use getConfig() + */ + public function getTestRunId() { + return $this->getConfig()->testRunId; + } + + /** + * @return string + * @deprecated use getConfig() + */ + public function getTestImagePath() { + return $this->getConfig()->testImagePath; + } + + /** + * @return string + * @deprecated use getConfig() + */ + public function getTestZippedImagesPath() { + return $this->getConfig()->testZippedImagesPath; + } + + /** + * @return string + * @deprecated use getConfig() + */ + public function getTestVideoPath() { + return $this->getConfig()->testVideoPath; + } + + /** + * @param mixed $mock + * @param array $data + */ + protected function makeMockIterable( + $mock, array $data = array()) { + + /** @var Mock $mock */ + $mock->method('count')->willReturn(count($data)); + $mock->method('getIterator')->willReturn(new \ArrayIterator($data)); + $mock->method('getArrayCopy')->willReturn($data); + $mock->method('export')->willReturn($data); + } + + /** + * @param \Closure $closure + * @param string $fqn + */ + protected function assertWillThrow( + \Closure $closure, + $fqn = 'Exception') { + + try { + call_user_func($closure); + } catch (\Exception $e) { + $this->assertTrue( + is_a($e, $fqn), + 'Expected exception of type '.$fqn.': '.get_class($e).' received'); + + return; + } + + $this->fail('Expected exception didn\'t throw: '.$fqn); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractUnitTestCase.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractUnitTestCase.php new file mode 100644 index 00000000..dcd83fb1 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/AbstractUnitTestCase.php @@ -0,0 +1,185 @@ +'; + + /** + * @var string + */ + const VALUE_SESSION_APP_SECRET = ''; + + /** + * @var string + */ + const VALUE_SESSION_ACCESS_TOKEN = ''; + + /** + * @return Mocker|Mock|ResponseInterface + */ + protected function createResponseMock() { + return $this->createMock(static::FQN_RESPONSE_INTERFACE); + } + + /** + * @return Mocker|Mock|Client + */ + protected function createClientMock() { + return $this->createMock(static::FQN_CLIENT); + } + + /** + * @return Mocker|Mock|CurlInterface + */ + protected function createCurlMock() { + return $this->createMock(static::FQN_CURL_INTERFACE); + } + + /** + * @return Mocker|Mock|Headers + */ + protected function createHeadersMock() { + return $this->createMock(static::FQN_HEADERS); + } + + /** + * @return Mocker|Mock|LoggerInterface + */ + protected function createLoggerMock() { + return $this->createMock(static::FQN_LOGGER_INTERFACE); + } + + /** + * @return Mocker|Mock|Parameters + */ + protected function createParametersMock() { + return $this->createMock(static::FQN_PARAMETERS); + } + + /** + * @return Mocker|Mock|Parameters + */ + protected function createJsonAwareParametersMock() { + return $this->createMock(static::FQN_JSON_AWARE_PARAMETERS); + } + + /** + * @return Mocker|Mock|RequestInterface + */ + protected function createRequestMock() { + return $this->createMock(static::FQN_REQUEST_INTERFACE); + } + + /** + * @return Mocker|Mock|AdapterInterface + */ + protected function createAdapterMock() { + return $this->createMock(static::FQN_ADAPTER_INTERFACE); + } + + /** + * @return Mocker|Mock|Session + */ + protected function createSessionMock() { + return $this->getMockBuilder(static::FQN_SESSION) + ->setConstructorArgs(array( + static::VALUE_SESSION_APP_ID, + static::VALUE_SESSION_APP_SECRET, + static::VALUE_SESSION_ACCESS_TOKEN, + )) + ->getMock(); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/ApiTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/ApiTest.php new file mode 100644 index 00000000..49e06b06 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/ApiTest.php @@ -0,0 +1,148 @@ +createClientMock(), $this->createSessionMock()); + } + + public function testInstance() { + $this->assertNull(Api::instance()); + + $api = $this->createApi(); + Api::setInstance($api); + $this->assertTrue($api === Api::instance()); + + $newApi = $this->createApi(); + Api::setInstance($newApi); + $this->assertTrue($newApi === Api::instance()); + $this->assertFalse($api === Api::instance()); + } + + public function testInit() { + $api = Api::init( + static::VALUE_SESSION_APP_ID, + static::VALUE_SESSION_APP_SECRET, + static::VALUE_SESSION_ACCESS_TOKEN, + false + ); + $this->assertTrue($api instanceof Api); + $this->assertTrue($api === Api::instance()); + $this->assertEquals( + static::VALUE_SESSION_APP_ID, $api->getSession()->getAppId()); + $this->assertEquals( + static::VALUE_SESSION_APP_SECRET, $api->getSession()->getAppSecret()); + $this->assertEquals( + static::VALUE_SESSION_ACCESS_TOKEN, $api->getSession()->getAccessToken()); + } + + public function testGetters() { + $client = $this->createClientMock(); + $session = $this->createSessionMock(); + $api = new Api($client, $session); + $this->assertTrue($api->getHttpClient() === $client); + $this->assertTrue($api->getSession() === $session); + } + + public function testLogger() { + $api = $this->createApi(); + $logger = $this->createLoggerMock(); + $api->setLogger($logger); + $this->assertTrue($logger === $api->getLogger()); + + // Test default + $api = $this->createApi(); + $this->assertTrue($api->getLogger() instanceof NullLogger); + } + + public function testDefaultGraphVersion() { + $api = $this->createApi(); + $api->setDefaultGraphVersion(''); + $this->assertEquals('', $api->getDefaultGraphVersion()); + + // Test default + $api = $this->createApi(); + $this->assertTrue(is_string($api->getDefaultGraphVersion())); + $this->assertRegExp('/^\d+\.\d+$/', $api->getDefaultGraphVersion()); + } + + public function testCall() { + $request = $this->createRequestMock(); + $request->method('execute')->willReturn($this->createResponseMock()); + $request->method('getQueryParams') + ->willReturn($this->createParametersMock()); + $request->method('getBodyParams') + ->willReturn($this->createParametersMock()); + $request->expects($this->exactly(2))->method('setMethod') + ->with($this->logicalOr( + RequestInterface::METHOD_GET, + RequestInterface::METHOD_POST)); + $request->expects($this->exactly(2))->method('setGraphVersion') + ->with($this->equalTo($this->createApi()->getDefaultGraphVersion())); + $request->expects($this->exactly(2))->method('setPath') + ->with($this->equalTo('/')); + + $client = $this->createClientMock(); + $client->method('createRequest')->willReturn($request); + + $session = $this->createSessionMock(); + $session->method('getAppSecretProof')->willReturn(''); + $session->method('getRequestParameters')->willReturn([]); + + $logger = $this->createLoggerMock(); + $logger->expects($this->exactly(2))->method('logRequest'); + $logger->expects($this->exactly(2))->method('logResponse'); + + $api = new Api($client, $session); + $api->setLogger($logger); + + // HTTP GET request + $request->expects($this->exactly(1))->method('getQueryParams'); + + $response = $api->call('/'); + $this->assertTrue($response instanceof ResponseInterface); + + // HTTP POST request + $request->expects($this->exactly(1))->method('getBodyParams'); + + $api->call( + '/', RequestInterface::METHOD_POST, array('param' => 'value')); + $this->assertTrue($response instanceof ResponseInterface); + } + + public function testBase64UrlEncode() { + $this->assertEquals('MTIzNDU', Api::base64UrlEncode('12345')); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/Bootstrap.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/Bootstrap.php new file mode 100644 index 00000000..4540a34f --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/Bootstrap.php @@ -0,0 +1,149 @@ +autoloader === null) { + $autoload_path = $this->getComposerAutoloadPath(); + if (!is_readable($autoload_path)) { + throw new \RuntimeException("Could not read ".$autoload_path); + } + $this->autoloader = include $autoload_path; + $this->autoloader->addPsr4('FacebookAdsTest\\', __DIR__.'/../'); + } + + return $this->autoloader; + } + + /** + * Simplifies the common pattern of checking for an index in an array + * and selecting a default value if it does not exist + * + * @param array $array + * @param string|int $key + * @param mixed $default + * @return mixed + */ + protected function idx(array $array, $key, $default = null) { + return array_key_exists($key, $array) && $array[$key] !== '' + ? $array[$key] + : $default; + } + + /** + * Simplifies the common pattern of checking for an index in an array + * and throw an exception if not + * + * @param array $array + * @param string|int $key + * @return mixed + * @throws \Exception + */ + protected function idxt(array $array, $key) { + if (!array_key_exists($key, $array) || !$array[$key]) { + throw new \Exception("Missing mandatory config '{$key}'"); + } + + return $array[$key]; + } + + /** + * @return Config + */ + public function getConfig() { + if ($this->config === null) { + $this->config = new Config(); + $this->config->testRunId + = md5($this->idx($_SERVER, 'LOGNAME', uniqid(true)).microtime(true)); + $this->config->testImagePath = __DIR__.'/../../misc/image.png'; + $this->config->testZippedImagesPath = __DIR__.'/../../misc/images.zip'; + $this->config->testVideoPath = __DIR__.'/../../misc/video.mp4'; + } + + return $this->config; + } + + /** + * @throws \LogicException + */ + public function init() { + if ($this->isIntialized) { + throw new \LogicException("Bootstrap already initialized"); + } + + $this->getAutoloader(); + Config::setInstance($this->getConfig()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/IntegrationBootstrap.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/IntegrationBootstrap.php new file mode 100644 index 00000000..4876c2b0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Bootstrap/IntegrationBootstrap.php @@ -0,0 +1,129 @@ +configData === null) { + $this->configData = $this->loadConfigData(__DIR__.'/../../config.php'); + } + + return $this->configData; + } + + /** + * @param string|int $key + * @param mixed $default + * @return mixed + */ + protected function confx($key, $default = null) { + return $this->idx($this->getConfigData(), $key, $default); + } + + /** + * @param string|int $key + * @return mixed + * @throws \Exception + */ + protected function confxt($key) { + return $this->idxt($this->getConfigData(), $key); + } + + /** + * @return Config + */ + protected function getUnitConfig() { + return parent::getConfig(); + } + + /** + * @return Config + */ + public function getConfig() { + if ($this->config === null) { + $this->config = parent::getConfig(); + $this->config->appId = $this->confx('app_id'); + $this->config->appSecret = $this->confx('app_secret'); + $this->config->accessToken = $this->confx('access_token'); + $this->config->accountId = $this->confx('act_id'); + $this->config->pageId = $this->confx('page_id'); + $this->config->appUrl = $this->confx('app_url'); + $this->config->businessId = $this->confx('business_id'); + $this->config->instagramActorId = $this->confx('instagram_actor_id'); + + // Optionals: Override unit config + $this->config->testRunId = $this->confx( + 'test_run_id', $this->config->testRunId); + $this->config->testImagePath = $this->confx( + 'test_image_path', $this->config->testImagePath); + $this->config->testZippedImagesPath = $this->confx( + 'test_zipped_images_path', $this->config->testZippedImagesPath); + $this->config->testVideoPath = $this->confx( + 'test_video_path', $this->config->testVideoPath); + + // Optionals + $this->config->secondaryBusinessId + = $this->confx('secondary_business_id', ''); + $this->config->secondaryAccountId + = $this->confx('secondary_account_id', ''); + $this->config->secondaryPageId = $this->confx('secondary_page_id', ''); + $this->config->secondaryAppId = $this->confx('secondary_app_id', ''); + $this->config->graphBaseDomain = $this->confx('graph_base_domain'); + $this->config->skipSslVerification + = $this->confx('skip_ssl_verification', false); + $this->config->curlLogger = $this->confx('curl_logger'); + + SkippableFeaturesManager::setInstance( + new SkippableFeaturesManager($this->confx('skip_if', array()))); + } + + return $this->config; + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Config/Config.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Config/Config.php new file mode 100644 index 00000000..026f0c57 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Config/Config.php @@ -0,0 +1,150 @@ +setData($data); + } + + public function setData(array $data = array()) { + $this->data = $data; + } + + /** + * @return array + */ + public function getData() { + return $this->data; + } + + /** + * @param $key + * @return bool + */ + public function isSkipKey($key) { + return array_key_exists($key, $this->data) && $this->data[$key]; + } + + /** + * @param AbstractTestCase $test + * @return bool + */ + public function enforceSkipTest(AbstractTestCase $test) { + if ($test instanceof SkippableFeatureTestInterface) { + foreach ($test->skipIfAny() as $key) { + if ($this->isSkipKey($key)) { + /** @var AbstractTestCase $test */ + $test->markTestSkipped("Reason: skipped by config '{$key}'"); + } + } + } + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorDegradationTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorDegradationTest.php new file mode 100644 index 00000000..a1ba0e42 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorDegradationTest.php @@ -0,0 +1,76 @@ +createUnparameterizedUrl() + .'?offset=%s'; + + $content = parent::createSampleResponseContent(); + $content['paging'] = array( + 'next' => sprintf($url_fmt, $this->getUniquePageId()), + 'previous' => sprintf($url_fmt, $this->getUniquePageId()), + ); + + return $content; + } + + public function testRequestParamReset() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + $params = $cursor->getLastResponse()->getRequest()->getQueryParams(); + $params->offsetSet('offset', $this->getUniquePageId()); + + $cursor->fetchAfter(); + $params2 = $cursor->getLastResponse()->getRequest()->getQueryParams(); + + $this->assertNotEquals( + $params->offsetGet('offset'), $params2->offsetGet('offset')); + } + + public function testGetters() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + + $this->assertTrue($response === $cursor->getResponse()); + $this->assertTrue($response === $cursor->getLastResponse()); + $this->assertNull($cursor->getAfter()); + $this->assertNull($cursor->getBefore()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorTest.php new file mode 100644 index 00000000..6f1c9273 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/CursorTest.php @@ -0,0 +1,385 @@ + array()); + } + + + /** + * @return string + */ + protected function getUniquePageId() { + return uniqid(); + } + + /** + * @return array + */ + protected function createSampleResponseContent() { + $content = array( + 'paging' => array( + 'cursors' => array( + 'after' => $this->getUniquePageId(), + 'before' => $this->getUniquePageId(), + ), + ), + ) + $this->createEmptyResponseContent(); + + $count = rand(2, 5); + for ($i = 0; $i < $count; $i++) { + $content['data'][] = array( + AbstractCrudObject::FIELD_ID => $i, + ); + } + + return $content; + } + + /** + * @return string + */ + protected function createUnparameterizedUrl() { + return Request::PROTOCOL_HTTPS + .Client::DEFAULT_LAST_LEVEL_DOMAIN + .'.'.Client::DEFAULT_GRAPH_BASE_DOMAIN + .'/node/edge'; + } + + /** + * @param int $num_pages + * @param RequestInterface|null $prev + * @return Mock|ResponseInterface + */ + protected function createResponseChainMock( + $num_pages, RequestInterface $prev = null) { + + $query_params = $prev ? clone $prev->getQueryParams() : new Parameters(); + $sample_content = $this->createSampleResponseContent(); + + $request = $this->createRequestMock(); + $request->method('getMethod')->willReturn(RequestInterface::METHOD_GET); + $request->method('getQueryParams')->willReturn($query_params); + + $response = $this->createResponseMock(); + $response->method('getRequest')->willReturn($request); + + $request->method('execute')->willReturn($response); + + $callback = function() use ($num_pages, $sample_content) { + return $num_pages > 0 + ? $sample_content + : $this->createEmptyResponseContent(); + }; + + $clone_callback = function() use ($num_pages, $request) { + return $this->createResponseChainMock( + $num_pages - 1, $request)->getRequest(); + }; + + $url_callback = function() use ($query_params) { + return $this->createUnparameterizedUrl().'?' + .http_build_query($query_params->getArrayCopy()); + }; + + $response->method('getContent')->willReturnCallback($callback); + $request->method('createClone')->willReturnCallback($clone_callback); + $request->method('getUrl')->willReturnCallback($url_callback); + + return $response; + } + + /** + * @return Mock|ResponseInterface + */ + protected function createEmptyResponseMock() { + $response = $this->createResponseMock(); + $response->method('getContent')->willReturn(array( + 'data' => array(), + )); + + return $response; + } + + public function setup(): void { + parent::setup(); + $this->objectPrototype = new EmptyObject(); + } + + public function tearDown(): void { + $this->objectPrototype = null; + parent::tearDown(); + } + + public function testGetters() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + + $this->assertTrue($response === $cursor->getResponse()); + $this->assertTrue($response === $cursor->getLastResponse()); + $this->assertTrue(is_string($cursor->getAfter())); + $this->assertTrue(is_string($cursor->getBefore())); + $this->assertNotEquals($cursor->getBefore(), $cursor->getAfter()); + } + + /** + * @return array + */ + public function responseDataStructureProvider() { + return array( + array(array()), + array(array('data' => null)), + array(array('data' => 1)), + ); + } + + /** + * @dataProvider responseDataStructureProvider + * @expectedException \InvalidArgumentException + * @param mixed $content + */ + public function testResponseDataStructure($content) { + $response = $this->createResponseMock(); + $response->method('getContent')->willReturn($content); + + new Cursor($response, $this->objectPrototype); + } + + public function testIterator() { + $cursor = new Cursor( + $this->createResponseChainMock(1), $this->objectPrototype); + + $this->assertTrue($cursor instanceof \Iterator); + + $k = 0; + + foreach ($cursor as $key => $value) { + if ($key != $k) { + $this->fail('iteration count missmatch $key'); + } + ++$k; + } + + $this->assertEquals($k, count($cursor)); + + $cursor->rewind(); + + $this->assertEquals(0, $cursor->key()); + $cursor->next(); + $this->assertEquals(1, $cursor->key()); + $cursor->prev(); + $this->assertEquals(0, $cursor->key()); + + $this->assertEquals($cursor->getIndexLeft(), 0); + $this->assertEquals($cursor->getIndexRight(), count($cursor) - 1); + } + + public function testCountable() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + + $this->assertTrue($cursor instanceof \Countable); + $this->assertEquals($cursor->count(), count($cursor)); + $this->assertEquals( + $cursor->count(), count($response->getContent()['data'])); + } + + public function testArrayAccess() { + $response = $this->createResponseChainMock(1); + $test_index = rand(1, count($response->getContent()) - 1); + + $cursor = new Cursor($response, $this->objectPrototype); + + $this->assertTrue($cursor instanceof \arrayaccess); + + $subject = new EmptyObject(); + $subject->setData($response->getContent()['data'][$test_index]); + + // Checking offsetGet + $this->assertEquals($cursor[$test_index]->getData(), $subject->getData()); + // Checking offsetExists + $this->assertFalse(isset($cursor[count($cursor)])); + // Checking offsetUnset + unset($cursor[$test_index]); + $this->assertNull($cursor[$test_index]); + // Checking offsetSet + $cursor->offsetSet($test_index, $subject); + $this->assertEquals($cursor[$test_index]->getData(), $subject->getData()); + // Checking offsetSet - append + $count = count($cursor); + $cursor->offsetSet(null, new EmptyObject()); + $this->assertEquals(count($cursor), $count + 1); + } + + public function testUnneededFetch() { + $response = $this->createEmptyResponseMock(); + $cursor = new Cursor($response, $this->objectPrototype); + $this->assertNull($cursor->createBeforeRequest()); + $this->assertNull($cursor->createAfterRequest()); + + // Reset for proper fetching + $response = $this->createEmptyResponseMock(); + $cursor = new Cursor($response, $this->objectPrototype); + $length = $cursor->count(); + $cursor->fetchBefore(); + $this->assertEquals($length, $cursor->count()); + $cursor->fetchAfter(); + $this->assertEquals($length, $cursor->count()); + } + + public function testIterability() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + + $cursor->next(); + $cursor->rewind(); + $this->assertEquals($cursor->getIndexLeft(), $cursor->key()); + + $cursor->end(); + $this->assertEquals($cursor->getIndexRight(), $cursor->key()); + + $index = rand($cursor->getIndexLeft(), $cursor->getIndexRight()); + $cursor->seekTo($index); + $this->assertEquals($index, $cursor->key()); + + // Fetch after + $cursor = new Cursor($response, $this->objectPrototype); + $cursor->fetchAfter(); + $this->assertFalse($response === $cursor->getLastResponse()); + } + + public function testRequestParamReset() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + $params = $cursor->getLastResponse()->getRequest()->getQueryParams(); + $params->offsetSet('after', $this->getUniquePageId()); + $params->offsetSet('before', $this->getUniquePageId()); + + $cursor->fetchAfter(); + $params2 = $cursor->getLastResponse()->getRequest()->getQueryParams(); + $this->assertNotEquals( + $params->offsetGet('after'), $params2->offsetGet('after')); + } + + public function testImplicitFetch() { + // Test setters/getters + $response = $this->createEmptyResponseMock(); + $cursor = new Cursor($response, $this->objectPrototype); + + $this->assertFalse(Cursor::getDefaultUseImplicitFetch()); + $this->assertFalse($cursor->getUseImplicitFetch()); + $cursor->setUseImplicitFetch(true); + $this->assertTrue($cursor->getUseImplicitFetch()); + + Cursor::setDefaultUseImplicitFetch(true); + + $response = $this->createEmptyResponseMock(); + $cursor = new Cursor($response, $this->objectPrototype); + $this->assertTrue(Cursor::getDefaultUseImplicitFetch()); + $this->assertTrue($cursor->getUseImplicitFetch()); + + // Test ordered iteration + // f() lower interval * min repetition > upper interval + // Min repetition > upper interval / lower interval -> f(x): x > 5 / 2 -> 3 + $response = $this->createResponseChainMock(3); + $cursor = new Cursor($response, $this->objectPrototype); + while ($cursor->valid()) { + $cursor->next(); + } + + // Min upper boundary = upper interval + 1 = 5 + 1 = 6 + $this->assertGreaterThanOrEqual(6, $cursor->count()); + + // Test rervese iteration + // same f() + $response = $this->createResponseChainMock(3); + $cursor = new Cursor($response, $this->objectPrototype); + + $count = 0; + while ($cursor->valid()) { + $cursor->prev(); + } + + $this->assertGreaterThanOrEqual(6, $cursor->count()); + + // Force the array out of boundaries + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + $cursor->setUseImplicitFetch(false); + $cursor->prev(); + + // Restore static behaviour + Cursor::setDefaultUseImplicitFetch(false); + } + + public function testExportability() { + $response = $this->createResponseChainMock(1); + $cursor = new Cursor($response, $this->objectPrototype); + $array_copy = $cursor->getArrayCopy(); + + $this->assertTrue(is_array($array_copy)); + $this->assertEquals($cursor->getArrayCopy(), $cursor->getObjects()); + $this->assertEquals( + count($array_copy), count($response->getContent()['data'])); + + foreach ($array_copy as $object) { + if (!$object instanceof AbstractObject) { + $this->fail("Wrong instance in array copy"); + } + } + + $cursor->fetchAfter(); + $cursor->fetchBefore(); + + $index = $cursor->getIndexLeft(); + // Test in-memory order while exporting + foreach ($cursor->getArrayCopy(true) as $key => $object) { + if ($key < $index) { + $this->fail("Wrong order in sorted array copy"); + } + } + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Enum/DummyEnum.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Enum/DummyEnum.php new file mode 100644 index 00000000..c216ac08 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Enum/DummyEnum.php @@ -0,0 +1,33 @@ +assertTrue(DummyEnum::getInstance() === DummyEnum::getInstance()); + } + + public function testAccess() { + $this->assertEquals(DummyEnum::className(), get_class(new DummyEnum())); + + $enum = DummyEnum::getInstance(); + $copy = $enum->getArrayCopy(); + $names = $enum->getNames(); + $values = $enum->getValues(); + $values_map = $enum->getValuesMap(); + + $this->assertEquals(2, count($copy)); + $this->assertArrayHasKey('NAME_1', $copy); + $this->assertEquals(DummyEnum::NAME_1, $copy['NAME_1']); + + $this->assertEquals(2, count($names)); + $this->assertTrue(in_array('NAME_1', $names)); + + $this->assertEquals(2, count($values)); + $this->assertTrue(in_array(DummyEnum::NAME_1, $values)); + + $this->assertEquals(2, count($values_map)); + $this->assertArrayHasKey(DummyEnum::NAME_1, $values_map); + + $this->assertEquals(DummyEnum::NAME_1, $enum->getValueForName('NAME_1')); + } + + public function testLazyLoading() { + $enum = DummyEnum::getInstance(); + + $this->assertTrue($enum->getArrayCopy() === $enum->getArrayCopy()); + $this->assertTrue($enum->getNames() === $enum->getNames()); + $this->assertTrue($enum->getValues() === $enum->getValues()); + $this->assertTrue($enum->getValuesMap() === $enum->getValuesMap()); + } + + public function testValidation() { + $enum = DummyEnum::getInstance(); + + $this->assertTrue($enum->isValid('NAME_1')); + $this->assertFalse($enum->isValid('NAME_ND')); + $this->assertTrue($enum->isValidValue(DummyEnum::NAME_1)); + $this->assertFalse($enum->isValidValue('VALUE_ND')); + } + + + public function testAssurance() { + $enum = DummyEnum::getInstance(); + + $this->assertEquals(DummyEnum::NAME_1, $enum->assureValueForName('NAME_1')); + $this->assertWillThrow(function() use ($enum) { + $enum->assureValueForName('NAME_ND'); + }, 'InvalidArgumentException'); + + $enum->assureIsValid('NAME_1'); + $this->assertWillThrow(function() use ($enum) { + $enum->assureIsValid('NAME_ND'); + }, 'InvalidArgumentException'); + + $enum->assureIsValidValue(DummyEnum::NAME_1); + $this->assertWillThrow(function() use ($enum) { + $enum->assureIsValidValue('VALUE_ND'); + }, 'InvalidArgumentException'); + } + + public function testEmptyEnum() { + $enum = EmptyEnum::getInstance(); + + $this->assertEquals(array(), $enum->getArrayCopy()); + $this->assertEquals(array(), $enum->getNames()); + $this->assertEquals(array(), $enum->getValues()); + $this->assertEquals(array(), $enum->getValuesMap()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Exception/PHPUnitRequestExceptionWrapper.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Exception/PHPUnitRequestExceptionWrapper.php new file mode 100644 index 00000000..1a21257e --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Exception/PHPUnitRequestExceptionWrapper.php @@ -0,0 +1,108 @@ +wrappedException = $e; + parent::__construct($e); + } + + /** + * @return RequestException + */ + public function getWrappedException() { + return $this->wrappedException; + } + + protected function requestToString(RequestException $e) { + if ($e->getResponse() === null) { + return '-'; + } + + $request = $e->getResponse()->getRequest(); + + return sprintf( + "%s %s\n%s", + $request->getMethod(), + $request->getUrl(), + " ".str_replace("\n", "\n ", json_encode( + $request->getFileParams()->getArrayCopy() + + $request->getBodyParams()->getArrayCopy(), + JSON_PRETTY_PRINT))); + } + + /** + * @return string + */ + protected function blameFieldSpecsToString() { + return implode(", ", array_map(function($value) { + return $value[0]; + }, $this->getWrappedException()->getErrorBlameFieldSpecs())); + } + + /** + * @return string + */ + public function __toString() { + $string = \PHPUnit_Framework_TestFailure::exceptionToString($this); + + $e = $this->getWrappedException(); + + $string .= "\n Request: ".$this->requestToString($e)."\n" + ." HTTP status Code: ".$e->getHttpStatusCode()."\n" + ." Is transient: ".($e->isTransient() ? 'true' : 'false')."\n" + ." Code: ".$e->getCode()."\n" + ." Error Subcode: ".$e->getErrorSubcode()."\n" + ." Error User Title: ".$e->getErrorUserTitle()."\n" + ." Error User Message: ".$e->getErrorUserMessage()."\n"; + + if ($e->getErrorBlameFieldSpecs()) { + $string .= " Error Blame Fields: ".$this->blameFieldSpecsToString()."\n"; + } + + if ($trace = \PHPUnit_Util_Filter::getFilteredStacktrace($this)) { + $string .= "\n" . $trace; + } + + if ($this->previous) { + $string .= "\nCaused by\n" . $this->previous; + } + + return $string; + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/AbstractAdapterTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/AbstractAdapterTest.php new file mode 100644 index 00000000..43df7571 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/AbstractAdapterTest.php @@ -0,0 +1,59 @@ +createAdapter($client); + $this->assertTrue($client === $adapter->getClient()); + $this->assertEquals( + $client->getCaBundlePath(), $adapter->getCaBundlePath()); + } + + public function testOpts() { + $adapter = $this->createAdapter(); + $opts = new \ArrayObject(); + $adapter->setOpts($opts); + $this->assertTrue($opts === $adapter->getOpts()); + + // Default initialization + $adapter = $this->createAdapter(); + $this->assertTrue($adapter->getOpts() instanceof \ArrayObject); + } + + abstract public function testRequest(); +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/CurlAdapterTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/CurlAdapterTest.php new file mode 100644 index 00000000..d3807c71 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Adapter/CurlAdapterTest.php @@ -0,0 +1,146 @@ +createCurlMock()); + } + + public function testGetters() { + parent::testGetters(); + $this->assertTrue( + $this->createAdapter()->getCurl() instanceof CurlInterface); + } + + public function testRequest() { + $adapter = $this->createAdapter(); + + /** @var Mock|CurlInterface $curl */ + $curl = $adapter->getCurl(); + $curl->method('preparePostFileField')->willReturn('file'); + $curl->method('exec')->willReturn("HTTP/1.1 200 OK\nX-header: value"); + + $headers = $this->createHeadersMock(); + $this->makeMockIterable($headers, array( + 'X-custom-header' => 'header value', + )); + + $query = $this->createParametersMock(array( + 'param' => 'value', + )); + + // HTTP_GET + $body = $this->createParametersMock(); + $this->makeMockIterable($body); + + $files = $this->createParametersMock(); + $this->makeMockIterable($files); + + $request = $this->createRequestMock(); + $request->method('getMethod')->willReturn(RequestInterface::METHOD_GET); + $request->method('getHeaders')->willReturn($headers); + $request->method('getQueryParams')->willReturn($query); + $request->method('getBodyParams')->willReturn($body); + $request->method('getFileParams')->willReturn($files); + $response = $adapter->sendRequest($request); + $this->assertTrue($response instanceof ResponseInterface); + + // HTTP_POST with files + $body = $this->createParametersMock(); + $this->makeMockIterable($body, array( + 'file' => './filepath', + )); + + $files = $this->createParametersMock(); + $this->makeMockIterable($files, array( + 'field' => 'value', + )); + + $request = $this->createRequestMock(); + $request->method('getMethod')->willReturn(RequestInterface::METHOD_POST); + $request->method('getHeaders')->willReturn($headers); + $request->method('getQueryParams')->willReturn($query); + $request->method('getBodyParams')->willReturn($body); + $request->method('getFileParams')->willReturn($files); + + $response = $adapter->sendRequest($request); + $this->assertTrue($response instanceof ResponseInterface); + + // HTTP_DELETE + $body = $this->createParametersMock(); + $this->makeMockIterable($body); + + $files = $this->createParametersMock(); + $this->makeMockIterable($files); + + $request = $this->createRequestMock(); + $request->method('getMethod')->willReturn(RequestInterface::METHOD_DELETE); + $request->method('getHeaders')->willReturn($headers); + $request->method('getQueryParams')->willReturn($query); + $request->method('getBodyParams')->willReturn($body); + $request->method('getFileParams')->willReturn($files); + + $response = $adapter->sendRequest($request); + $this->assertTrue($response instanceof ResponseInterface); + + // Force Curl Error + /** @var CurlInterface|Mock $curl */ + $curl = $adapter->getCurl(); + $curl->method('errno')->willReturn(CURLE_SSL_CONNECT_ERROR); + $curl->method('error')->willReturn('Mocked Curl Error'); + $body = $this->createParametersMock(); + $this->makeMockIterable($body); + + $files = $this->createParametersMock(); + $this->makeMockIterable($files); + + $request = $this->createRequestMock(); + $request->method('getMethod')->willReturn(RequestInterface::METHOD_DELETE); + $request->method('getHeaders')->willReturn($headers); + $request->method('getQueryParams')->willReturn($query); + $request->method('getBodyParams')->willReturn($body); + $request->method('getFileParams')->willReturn($files); + + $e = null; + try { + $adapter->sendRequest($request); + } catch (Exception $e) {} + $this->assertTrue($e !== null); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ClientTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ClientTest.php new file mode 100644 index 00000000..6a67705d --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ClientTest.php @@ -0,0 +1,176 @@ +createAdapterMock(); + $response = $this->createResponseMock(); + $response->method('getContent')->willReturn($response_content); + $adapter->method('sendRequest')->willReturn($response); + + return $adapter; + } + + public function testPrototypes() { + $client = new Client(); + + $request_proto = $this->createRequestMock(); + $request_proto->method('createClone')->willReturnSelf(); + $client->setRequestPrototype($request_proto); + $this->assertTrue($request_proto === $client->getRequestPrototype()); + $this->assertTrue($client->createRequest() instanceof RequestInterface); + + $response_proto = $this->createResponseMock(); + $client->setResponsePrototype($response_proto); + $this->assertTrue($response_proto === $client->getResponsePrototype()); + $this->assertTrue($client->createResponse() instanceof ResponseInterface); + + // Default initialization + $client = new Client(); + $this->assertTrue($client->getRequestPrototype() instanceof Request); + $this->assertTrue($client->getResponsePrototype() instanceof Response); + } + + public function testHeaders() { + $headers = new Headers(); + $this->assertTrue($headers instanceof \IteratorAggregate); + $this->assertTrue($headers instanceof \Traversable); + $this->assertTrue($headers instanceof \ArrayAccess); + $this->assertTrue($headers instanceof \Serializable); + $this->assertTrue($headers instanceof \Countable); + + $client = new Client(); + $client->setDefaultRequestHeaders($headers); + $this->assertTrue($headers === $client->getDefaultRequestHeaderds()); + + // Default initialization + $client = new Client(); + $headers = $client->getDefaultRequestHeaderds(); + $this->assertTrue($headers instanceof Headers); + $this->assertTrue($headers === $client->getDefaultRequestHeaderds()); + $this->assertArrayHasKey('User-Agent', $headers); + $this->assertEquals('fbbizsdk-php-v'.ApiConfig::SDKVersion, $headers['User-Agent']); + } + + public function testDomain() { + $client = new Client(); + $this->assertEquals( + Client::DEFAULT_GRAPH_BASE_DOMAIN, $client->getDefaultGraphBaseDomain()); + + $domain = 'not.facebook.com'; + $client->setDefaultGraphBaseDomain($domain); + $this->assertEquals($domain, $client->getDefaultGraphBaseDomain()); + } + + public function testAdapter() { + $client = new Client(); + + $adapter = $this->createAdapterMock(); + $client->setAdapter($adapter); + $this->assertTrue($client->getAdapter() instanceof AdapterInterface); + $this->assertTrue($adapter === $client->getAdapter()); + + // Default initialization + $client = new Client(); + $this->assertTrue($client->getAdapter() instanceof CurlAdapter); + } + + public function testCaBundlePath() { + $client = new Client(); + $path = '/tmp/dont_care_if_exists'; + $client->setCaBundlePath($path); + $this->assertEquals($path, $client->getCaBundlePath()); + + // Default initialization + $client = new Client(); + $this->assertFalse(!$client->getCaBundlePath()); + $this->assertFileExists($client->getCaBundlePath()); + } + + public function testSendRequest() { + $client = new Client(); + + // Empty response > json_decode('') = null + $client->setAdapter($this->createMockChain(null)); + + $exception_catched = false; + try { + $client->sendRequest($this->createRequestMock()); + } catch (EmptyResponseException $e) { + $exception_catched = true; + } + $this->assertTrue($exception_catched); + + // Error payload + $client->setAdapter($this->createMockChain(array( + 'error' => array( + 'message' => 'Stub Server Error Message', + 'type' => 'FacebookApiException', + 'code' => 1, + ), + ))); + + $exception_catched = false; + try { + $client->sendRequest($this->createRequestMock()); + } catch (EmptyResponseException $e) { + $this->fail("Catched wrong RequestException"); + } catch (RequestException $e) { + $exception_catched = true; + } + $this->assertTrue($exception_catched); + + // Success + $client->setAdapter($this->createMockChain(array( + 'id' => 4, + ))); + + $response = $client->sendRequest($this->createRequestMock()); + $this->assertTrue($response instanceof ResponseInterface); + $content = $response->getContent(); + $this->assertArrayHasKey('id', $content); + $this->assertEquals($content['id'], 4); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Exception/RequestExceptionTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Exception/RequestExceptionTest.php new file mode 100644 index 00000000..3c0bd44d --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/Exception/RequestExceptionTest.php @@ -0,0 +1,123 @@ + array( + 'message' => 'Stub Server Error Message', + 'type' => 'FacebookApiException', + 'code' => 1, + 'error_data' => array( + 'blame_field_specs' => array( + array('mandatory_field'), + array('field_with_malformed_value'), + ), + ), + 'error_subcode' => 1, + 'is_transient' => false, + 'error_user_title' => 'Just a test', + 'error_user_msg' => 'Let\'s avoid alarmism', + ), + ); + $status_code = 400; + $response = new Response(); + $response->setBody(json_encode($data)); + $response->setStatusCode($status_code); + $e = new RequestException($response); + $this->assertEquals($status_code, $e->getHttpStatusCode()); + $this->assertEquals( + $data['error']['error_subcode'], $e->getErrorSubcode()); + $this->assertEquals( + $data['error']['error_user_title'], $e->getErrorUserTitle()); + $this->assertEquals( + $data['error']['error_user_msg'], $e->getErrorUserMessage()); + $this->assertEquals( + $data['error']['error_data']['blame_field_specs'], + $e->getErrorBlameFieldSpecs()); + } + + public function testGetFacebookTraceIdReturnsValueFromResponseErrorData() { + $data = array( + 'error' => array( + 'fbtrace_id' => 'abc123', + ), + ); + + $response = new Response(); + $response->setBody(json_encode($data)); + $e = new RequestException($response); + + $this->assertSame('abc123', $e->getFacebookTraceId()); + } + + public function testGetErrorBlameFieldSpecsReturnsNullWithNullErrorData() { + $data = array( + 'error' => array( + 'error_data' => null, + ), + ); + + $response = new Response(); + $response->setBody(json_encode($data)); + $e = new RequestException($response); + + $this->assertNull($e->getErrorBlameFieldSpecs()); + } + + /** + * @return array + */ + public function createConcreteProvider() { + return array( + array(array('type' => 'OAuthException'), 'AuthorizationException'), + array(array('code' => 1), 'ServerException'), + array(array('code' => 4), 'ThrottleException'), + array(array('code' => 506), 'ClientException'), + array(array('code' => 10), 'PermissionException'), + array(array(), 'RequestException'), + ); + } + + /** + * @param array $data + * @param string $expected_class + * @dataProvider createConcreteProvider + */ + public function testCreateConcrete($data, $expected_class) { + $response = new Response(); + $response->setBody(json_encode(array('error' => $data))); + $response->setStatusCode(400); + $e = RequestException::create($response); + $fqn = '\FacebookAds\Http\Exception\\'.$expected_class; + $this->assertTrue(is_a($e, $fqn)); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/FileParameterTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/FileParameterTest.php new file mode 100644 index 00000000..57f9b4d8 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/FileParameterTest.php @@ -0,0 +1,44 @@ +setName($name) + ->setMimeType($mime_type); + + $this->assertEquals($param->getPath(), $path); + $this->assertEquals($param->getName(), $name); + $this->assertEquals($param->getMimeType(), $mime_type); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ParametersTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ParametersTest.php new file mode 100644 index 00000000..7ceb87d6 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ParametersTest.php @@ -0,0 +1,74 @@ +assertTrue($parameters instanceof \IteratorAggregate); + $this->assertTrue($parameters instanceof \Traversable); + $this->assertTrue($parameters instanceof \ArrayAccess); + $this->assertTrue($parameters instanceof \Serializable); + $this->assertTrue($parameters instanceof \Countable); + } + + public function testEnhance() { + $parameters = new Parameters(); + $copy = $parameters->getArrayCopy(); + + $data = array( + 'foo' => 0, + 'bar' => 1, + ); + + $copy = array_merge($copy, $data); + $parameters->enhance($data); + $this->assertEquals($copy, $parameters->getArrayCopy()); + + $data = array( + 'bar' => -1, + 'baz' => 2, + ); + + $copy = array_merge($copy, $data); + $parameters->enhance($data); + $this->assertEquals($copy, $parameters->getArrayCopy()); + } + + public function testExport() { + $parameters = new Parameters(); + $parameters['scalar'] = 1; + $parameters['non_scalar'] = array(0, '1', true); + $data = $parameters->export(); + $this->assertArrayHasKey('scalar', $data); + $this->assertEquals(1, $data['scalar']); + $this->assertArrayHasKey('non_scalar', $data); + $this->assertEquals('[0,"1",true]', $data['non_scalar']); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/RequestTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/RequestTest.php new file mode 100644 index 00000000..d600610c --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/RequestTest.php @@ -0,0 +1,236 @@ +createClientMock()); + } + + public function testGetters() { + $client = $this->createClientMock(); + $request = new Request($client); + + $this->assertTrue($request->getClient() instanceof Client); + $this->assertTrue($client === $request->getClient()); + } + + public function testProtocol() { + $request = $this->createRequest(); + $protocol = Request::PROTOCOL_HTTP; + $request->setProtocol($protocol); + $this->assertEquals($protocol, $request->getProtocol()); + } + + public function testDomain() { + $request = $this->createRequest(); + $domain = 'not.facebook.com'; + $request->setDomain($domain); + $this->assertEquals($domain, $request->getDomain()); + + // Default initialization + $client = $this->createClientMock(); + $client->method('getDefaultGraphBaseDomain') + ->willReturn('not.facebook.com'); + $request = new Request($client); + $domain = $request->getDomain(); + $this->assertRegExp('/.+\.not\.facebook\.com/', $domain); + $this->assertEquals($domain, $request->getDomain()); + + // Partially set + $client = $this->createClientMock(); + $client->method('getDefaultGraphBaseDomain') + ->willReturn('probably.not.facebook.com'); + $request = new Request($client); + $request->setLastLevelDomain('most'); + $domain = $request->getDomain(); + $this->assertEquals('most.probably.not.facebook.com', $domain); + $this->assertEquals($domain, $request->getDomain()); + } + + public function testHeaders() { + $client = $this->createClientMock(); + $request = new Request($client); + $headers = $this->createHeadersMock(); + $client->setDefaultRequestHeaders($headers); + $request->setHeaders($headers); + $headers_mirror = $request->getHeaders(); + $this->assertTrue($headers_mirror instanceof Headers); + $this->assertTrue($headers_mirror === $request->getHeaders()); + + // Default initialization + $headers = new Headers(); + $client = $this->createClientMock(); + $client->method('getDefaultRequestHeaderds')->willReturn($headers); + $request = new Request($client); + $headers_mirror = $request->getHeaders(); + $this->assertTrue($headers_mirror instanceof Headers); + $this->assertFalse($headers === $request->getHeaders()); + $this->assertTrue($headers_mirror === $request->getHeaders()); + } + + public function testMethod() { + $request = $this->createRequest(); + $method = Request::METHOD_GET; + $request->setMethod($method); + $this->assertEquals($method, $request->getMethod()); + } + + public function testPath() { + $request = $this->createRequest(); + $path = '/node/edge'; + $request->setPath($path); + $this->assertEquals($path, $request->getPath()); + } + + public function testGraphVersion() { + $request = $this->createRequest(); + $graph_version = Api::VERSION; + $request->setGraphVersion($graph_version); + $this->assertEquals($graph_version, $request->getGraphVersion()); + } + + public function testQueryParams() { + $request = $this->createRequest(); + $parameters = $this->createParametersMock(); + $request->setQueryParams($parameters); + $this->assertTrue($request->getQueryParams() instanceof Parameters); + $this->assertTrue($parameters === $request->getQueryParams()); + + // Default initialization + $request = $this->createRequest(); + $parameters = $request->getQueryParams(); + $this->assertTrue($parameters instanceof Parameters); + $this->assertTrue($parameters === $request->getQueryParams()); + } + + public function testBodyParams() { + $request = $this->createRequest(); + $parameters = $this->createParametersMock(); + $request->setBodyParams($parameters); + $this->assertTrue($request->getBodyParams() instanceof Parameters); + $this->assertTrue($parameters === $request->getBodyParams()); + + // Default initialization + $request = $this->createRequest(); + $parameters = $request->getBodyParams(); + $this->assertTrue($parameters instanceof Parameters); + $this->assertTrue($parameters === $request->getBodyParams()); + } + + public function testFileParams() { + $request = $this->createRequest(); + $parameters = $this->createParametersMock(); + $request->setFileParams($parameters); + $this->assertTrue($request->getFileParams() instanceof Parameters); + $this->assertTrue($parameters === $request->getFileParams()); + + // Default initialization + $request = $this->createRequest(); + $parameters = $request->getFileParams(); + $this->assertTrue($parameters instanceof Parameters); + $this->assertTrue($parameters === $request->getFileParams()); + } + + public function testClone() { + $request = $this->createRequest(); + $query_params = $this->createParametersMock(); + $request->setFileParams($query_params); + $body_params = $this->createParametersMock(); + $request->setBodyParams($body_params); + $file_params = $this->createParametersMock(); + $request->setFileParams($file_params); + + $clone = $request->createClone(); + $this->assertFalse($query_params === $clone->getQueryParams()); + $this->assertFalse($body_params === $clone->getBodyParams()); + $this->assertFalse($file_params === $clone->getFileParams()); + } + + public function testUrlCustomArgSeparator(){ + $separator = ini_get('arg_separator.output'); + ini_set('arg_separator.output', '&'); + $this->testUrl(); + ini_set('arg_separator.output', $separator); + } + + /** + * @depends testProtocol + * @depends testDomain + * @depends testGraphVersion + * @depends testPath + * @depends testQueryParams + */ + public function testUrl() { + $client = $this->createClientMock(); + $client->method('getDefaultGraphBaseDomain') + ->willReturn(Client::DEFAULT_GRAPH_BASE_DOMAIN); + $request = new Request($client); + $request->setGraphVersion('2.2'); + $request->setPath('/node/edge'); + $url = $request->getUrl(); + $this->assertEquals( + parse_url($url, PHP_URL_SCHEME).'://', $request->getProtocol()); + $this->assertEquals(parse_url($url, PHP_URL_HOST), $request->getDomain()); + $this->assertEquals( + parse_url($url, PHP_URL_PATH), + sprintf("/v%s%s", $request->getGraphVersion(), $request->getPath())); + $this->assertNull(parse_url($url, PHP_URL_QUERY)); + + // With query + $params = array( + 'sdk' => 'PHP', + 'names' => 'abc,def', + ); + $request->setQueryParams(new Parameters($params)); + $url = $request->getUrl(); + $parsed_query = Util::parseUrlQuery(parse_url($url, PHP_URL_QUERY)); + $this->assertEquals( + $parsed_query, $request->getQueryParams()->getArrayCopy()); + } + + public function testExecute() { + $response = $this->createResponseMock(); + $client = $this->createClientMock(); + $client->method('sendRequest')->willReturn($response); + $request = new Request($client); + $response_mirror = $request->execute(); + $this->assertTrue($response_mirror instanceof ResponseInterface); + $this->assertTrue($response_mirror === $response); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ResponseTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ResponseTest.php new file mode 100644 index 00000000..d1971d27 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Http/ResponseTest.php @@ -0,0 +1,78 @@ +createResponse(); + $request = $this->createRequestMock(); + $response->setRequest($request); + $request_mirror = $response->getRequest(); + $this->assertTrue($request_mirror instanceof RequestInterface); + $this->assertTrue($request_mirror === $request); + } + + public function testStatusCode() { + $response = $this->createResponse(); + $response->setStatusCode(200); + $this->assertEquals(200, $response->getStatusCode()); + } + + public function testHeaders() { + $response = $this->createResponse(); + $headers = $this->createHeadersMock(); + $response->setHeaders($headers); + $headers_mirror = $response->getHeaders(); + $this->assertTrue($headers_mirror instanceof Headers); + $this->assertTrue($headers_mirror === $response->getHeaders()); + + // Default initialization + $response = $this->createResponse(); + $headers_mirror = $response->getHeaders(); + $this->assertTrue($headers instanceof Headers); + $this->assertTrue($headers_mirror === $response->getHeaders()); + } + + public function testBodyContent() { + $response = $this->createResponse(); + $body = '{"data":[]}'; + $response->setBody($body); + $this->assertEquals($body, $response->getBody()); + $this->assertEquals(array('data' => array()), $response->getContent()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/AbstractLoggerTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/AbstractLoggerTest.php new file mode 100644 index 00000000..2fb44720 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/AbstractLoggerTest.php @@ -0,0 +1,46 @@ +'; + + /** + * @var string + */ + const VALUE_LOG_MESSAGE = ''; + + /** + * @return LoggerInterface + */ + abstract protected function createLogger(); +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareParametersTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareParametersTest.php new file mode 100644 index 00000000..fd368500 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareParametersTest.php @@ -0,0 +1,42 @@ +export() as $param) { + $this->assertTrue(is_scalar($param) || is_null($param)); + } + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareTestTrait.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareTestTrait.php new file mode 100644 index 00000000..fd88e4f0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonAwareTestTrait.php @@ -0,0 +1,87 @@ + '', + 'access_token' => '', + 'query_field' => 'query_value', + ); + + return array( + array( + $base + array( + 'json_field' => array( + 'query_field' => 'query_value', + ), + ) + ), + array( + $base + array( + 'json_field' => array( + 'query_field' => 'query_value', + 'query_field_1' => 'query_value_1', + 'query_field_2' => 'query_value_2', + ), + ) + ), + array( + $base + array( + 'json_field' => array( + 'query_field' => str_repeat('x', JsonNode::EXPLOSION_THRESHOLD + 1), + ), + ), + ), + array( + $base + array( + 'json_field' => array(), + ), + ), + array( + $base + array( + 'json_field' => array( + 'vector_value_1', + 'vector_value_2', + 'vector_value_3', + ), + ), + ), + array( + array(), + ), + array( + new \StdClass(), + ) + ); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonNodeTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonNodeTest.php new file mode 100644 index 00000000..c15c4c2d --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLogger/JsonNodeTest.php @@ -0,0 +1,61 @@ +encode(); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testInvalidType() { + JsonNode::factory(fopen('php://memory', 'r'))->encode(); + } + + /** + * Test the sanity check for behaviour on empty children list + * which should never happen as this is protected method + */ + public function testGetLastChildKey() { + $object = JsonNode::factory(array()); + $method = new \ReflectionMethod($object, 'getLastChildKey'); + $method->setAccessible(true); + + $this->assertNull($method->invoke($object)); + + $method->setAccessible(false); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLoggerTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLoggerTest.php new file mode 100644 index 00000000..a7e6b38e --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/CurlLoggerTest.php @@ -0,0 +1,141 @@ +handle = fopen('php://temp', 'w+'); + } + + public function tearDown(): void { + fclose($this->handle); + } + + /** + * @return resource + */ + protected function getHandle() { + return $this->handle; + } + + /** + * @return CurlLogger + */ + protected function createLogger() { + return new CurlLogger($this->getHandle()); + } + + protected function createRequestMock() { + $query = $this->createParametersMock(); + $query->method('export')->willReturn(array( + 'appsecret_proof' => '', + 'access_token' => '', + 'query_field' => 'query_value', + )); + + $body = $this->createParametersMock(); + $body->method('export')->willReturn(array( + 'body_field' => 'body_value', + )); + + $files = $this->createParametersMock(); + $files->method('export')->willReturn(array( + 'file_field' => 'filepath', + )); + + $request = parent::createRequestMock(); + $request->method('getQueryParams')->willReturn($query); + $request->method('getBodyParams')->willReturn($body); + $request->method('getFileParams')->willReturn($files); + + return $request; + } + + public function testLog() { + $this->createLogger()->log( + static::VALUE_LOG_LEVEL, static::VALUE_LOG_MESSAGE); + } + + /** + * @return array + */ + public function logRequestProvider() { + return array( + array(RequestInterface::METHOD_GET), + array(RequestInterface::METHOD_POST), + array(RequestInterface::METHOD_PUT), + array(RequestInterface::METHOD_DELETE), + ); + } + + /** + * @dataProvider logRequestProvider + * @param string $http_method + */ + public function testLogRequest($http_method) { + $request = $this->createRequestMock(); + $request->method('getMethod')->willReturn($http_method); + + $logger = $this->createLogger(); + $logger->logRequest(static::VALUE_LOG_LEVEL, $request); + } + + public function testLogResponse() { + $this->createLogger()->logResponse( + static::VALUE_LOG_LEVEL, $this->createResponseMock()); + } + + public function testJsonPrettyPrint() { + $logger = $this->createLogger(); + $this->assertFalse($logger->isJsonPrettyPrint()); + $logger->setJsonPrettyPrint(true); + $this->assertTrue($logger->isJsonPrettyPrint()); + + $query = new JsonAwareParameters(array( + 'json_field' => array_fill(0, 3, 'json_value'), + )); + $body = $files = $this->createParametersMock(); + + $request = parent::createRequestMock(); + $request->method('getQueryParams')->willReturn($query); + $request->method('getBodyParams')->willReturn($body); + $request->method('getFileParams')->willReturn($files); + + $logger->logRequest(static::VALUE_LOG_LEVEL, $request); + + $logger->setJsonPrettyPrint(false); + $this->assertFalse($logger->isJsonPrettyPrint()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/NullLoggerTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/NullLoggerTest.php new file mode 100644 index 00000000..3b3fbf51 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Logger/NullLoggerTest.php @@ -0,0 +1,49 @@ +createLogger()->log( + static::VALUE_LOG_LEVEL, static::VALUE_LOG_MESSAGE); + } + + public function testLogRequest() { + $this->createLogger()->logRequest( + static::VALUE_LOG_LEVEL, $this->createRequestMock()); + } + + public function testLogResponse() { + $this->createLogger()->logResponse( + static::VALUE_LOG_LEVEL, $this->createResponseMock()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractAsyncJobTestCase.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractAsyncJobTestCase.php new file mode 100644 index 00000000..25945540 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractAsyncJobTestCase.php @@ -0,0 +1,59 @@ +getSelf()->isComplete()) { + return; + } + sleep($interval); + } while (time() <= $end); + + $this->markTestSkipped( + "Async Job timed out. Timeout: {$timeout}, Interval: {$interval}"); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTest.php new file mode 100644 index 00000000..581343d4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTest.php @@ -0,0 +1,88 @@ +checkCreationSuccessWithID(null); + } + + public function testCreationWithNegativeId() { + $this->checkCreationFailureWithID(-1234123); + } + + public function testCreationWithPositiveId() { + $this->checkCreationSuccessWithID(100007309086878); + } + + public function testCreationWithCorrectStringId() { + $this->checkCreationSuccessWithID('100007309086878'); + } + + public function testCreationWithIncorrectNegativeStringId() { + $this->checkCreationFailureWithID('-1234123'); + } + + public function testCreationWithIncorrectStringId() { + $this->checkCreationFailureWithID('1.234e10'); + } + + public function testCreationSuccessWithAct_() { + $this->checkCreationSuccessWithID('act_12341521352312'); + } + + public function testCreationFailureWithAct_() { + $this->checkCreationFailureWithID('act_1.1234e10'); + } + + public function testCreationWithOverFlowInt() { + $this->checkCreationFailureWithID(PHP_INT_MAX+1); + } + private function checkCreationSuccessWithID($id) { + new EmptyCrudObject($id); + } + + private function checkCreationFailureWithID($id) { + $this->assertInvalidArgumentException($id); + } + + /** + * @param mixed $id + */ + public function assertInvalidArgumentException(mixed $id) { + $has_throw_exception = false; + try { + new EmptyCrudObject($id); + } catch (\InvalidArgumentException $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTestCase.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTestCase.php new file mode 100644 index 00000000..1fbcef68 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AbstractCrudObjectTestCase.php @@ -0,0 +1,315 @@ +assertEmpty($subject->{AbstractCrudObject::FIELD_ID}); + $subject->create($params); + $this->assertNotEmpty($subject->{AbstractCrudObject::FIELD_ID}); + + /** @var AbstractCrudObject $subject */ + if ($subject instanceof CanRedownloadInterface) { + $non_null_count = 0; + foreach ($subject->getData() as $key => $value) { + if ($key !== AbstractCrudObject::FIELD_ID && $value !== null) { + ++$non_null_count; + // Normalize assert function behaviour with non-redownloadable objects + $subject->{$key} = null; + } + } + + $this->assertGreaterThan(0, $non_null_count); + } + } + + /** + * @param AbstractCrudObject $object + * @return AbstractCrudObject + */ + protected function getEmptyClone(AbstractCrudObject $object) { + $fqn = get_class($object); + return new $fqn( + $object->{AbstractCrudObject::FIELD_ID}, + $object->getParentId()); + } + + /** + * @param AbstractCrudObject $subject + */ + public function assertCannotCreate(AbstractCrudObject $subject) { + $has_throw_exception = false; + try { + $subject->create(); + } catch (\Exception $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + + /** + * @param AbstractCrudObject $subject + */ + public function assertCanRead(AbstractCrudObject $subject) { + $this->assertNotEmpty($subject->{AbstractCrudObject::FIELD_ID}); + $mirror = $this->getEmptyClone($subject); + $mirror->read(); + $this->assertEquals( + $subject->{AbstractCrudObject::FIELD_ID}, + $mirror->{AbstractCrudObject::FIELD_ID}); + } + + /** + * @param AbstractCrudObject $subject + * @param string $connection_name + * @param array $fields + * @param array $params + * @return mixed + */ + protected function fetchConnection( + AbstractCrudObject $subject, + $connection_name, + array $fields = array(), + array $params = array()) { + + $this->assertNotEmpty($subject->{AbstractCrudObject::FIELD_ID}); + $mirror = $this->getEmptyClone($subject); + return call_user_func(array($mirror, $connection_name), $fields, $params); + } + + /** + * @param AbstractCrudObject $subject + * @param string $connection_name + * @param array $fields + * @param array $params + */ + public function assertCanFetchConnection( + AbstractCrudObject $subject, + $connection_name, + array $fields = array(), + array $params = array()) { + + $result = $this->fetchConnection( + $subject, $connection_name, $fields, $params); + + $this->assertTrue( + $result instanceof Cursor + || $result instanceof AbstractObject); + } + + /** + * @param AbstractCrudObject $subject + * @param string $connection_name + * @param array $fields + * @param array $params + */ + public function assertCanFetchConnectionAsArray( + AbstractCrudObject $subject, + $connection_name, + array $fields = array(), + array $params = array()) { + + $result = $this->fetchConnection( + $subject, $connection_name, $fields, $params); + + $this->assertTrue(is_array($result)); + + foreach ($result as $object) { + if (!$object instanceof AbstractObject) { + $this->fail("Not an instance of AbstractObject"); + } + } + } + + /** + * @param AbstractCrudObject $object + * @param array $diff + * @return array + */ + private function extractDiffFromObject( + AbstractCrudObject $object, + array $diff) { + + $sub_diff = array(); + foreach ($object->getData() as $key => $val) { + if (array_key_exists($key, $diff)) { + $sub_diff[$key] = $val; + } + } + + return $sub_diff + array_combine( + array_keys($diff), + array_fill(0, count($diff), null)); + } + + /** + * @param AbstractCrudObject $subject + * @param array $diff Data to be changed in the object + */ + public function assertCanUpdate( + AbstractCrudObject $subject, + array $diff) { + + $this->assertNotEmpty($subject->{AbstractCrudObject::FIELD_ID}); + $mirror = $this->getEmptyClone($subject); + $mirror->read(); + $mirror->setData($diff); + $mirror->update(); + $this->assertNotEmpty($subject->id); + $mirror2 = $this->getEmptyClone($subject); + $mirror2->read(array_keys($diff)); + $this->assertEquals( + $this->extractDiffFromObject($mirror, $diff), + $this->extractDiffFromObject($mirror2, $diff)); + + $subject->read(array_keys($diff)); + } + + /** + * @param AbstractCrudObject $subject + */ + public function assertCannotUpdate(AbstractCrudObject $subject) { + $has_throw_exception = false; + try { + $subject->update(); + } catch (\Exception $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + + /** + * @param AbstractArchivableCrudObject $subject + * @param string $status + */ + private function assertArchivableCrudObjectStatus( + AbstractArchivableCrudObject $subject, $status) { + + $fields = array( + AbstractArchivableCrudObjectFields::CONFIGURED_STATUS, + AbstractArchivableCrudObjectFields::EFFECTIVE_STATUS, + ); + + $mirror = $this->getEmptyClone($subject); + $mirror->read($fields); + + foreach ($fields as $field) { + $this->assertEquals($mirror->{$field}, $status); + $subject->{$field} = $status; + } + } + + /** + * @param AbstractCrudObject $subject + */ + public function assertCanDelete(AbstractCrudObject $subject) { + $this->assertNotEmpty($subject->{AbstractCrudObject::FIELD_ID}); + $subject->deleteSelf(); + if ($subject instanceof AbstractArchivableCrudObject) { + $this->assertArchivableCrudObjectStatus( + $subject, AbstractArchivableCrudObject::STATUS_DELETED); + } + } + + /** + * @param AbstractCrudObject $subject + */ + public function assertCannotDelete(AbstractCrudObject $subject) { + $has_throw_exception = false; + try { + $subject->deleteSelf(); + } catch (\Exception $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + + /** + * @param AbstractArchivableCrudObject $subject + */ + public function assertCanArchive(AbstractArchivableCrudObject $subject) { + $this->assertNotEmpty($subject->{AbstractCrudObject::FIELD_ID}); + $subject->archiveSelf(); + if ($subject instanceof AbstractArchivableCrudObject) { + $this->assertArchivableCrudObjectStatus( + $subject, AbstractArchivableCrudObject::STATUS_ARCHIVED); + } + } + + /** + * @param array $response_content + */ + public function assertSuccessResponse(array $response_content) { + $this->assertTrue(is_array($response_content)); + $this->assertArrayHasKey('success', $response_content); + $this->assertTrue($response_content['success']); + } + + /** + * @param AdLabelAwareCrudObjectTrait|AbstractCrudObject $object + */ + public function assertCanBeLabeled(AbstractCrudObject $object) { + $label = new AdLabel(null, $this->getConfig()->accountId); + $label->{AdLabelFields::NAME} = $this->getConfig()->testRunId; + $label->create(); + + /** @var AdLabelAwareCrudObjectTrait|AbstractCrudObject $mirror */ + $mirror = $this->getEmptyClone($object); + $mirror->addAdLabels(array($label->{AdLabelFields::ID})); + + $mirror = $this->getEmptyClone($object); + $mirror->read(array('adlabels')); + $this->assertCount(1, $mirror->{'adlabels'}); + + $mirror = $this->getEmptyClone($object); + $mirror->removeAdLabels(array($label->{AdLabelFields::ID})); + $mirror->read(array('adlabels')); + $this->assertNull($mirror->{'adlabels'}); + + $label->deleteSelf(); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountGroupTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountGroupTest.php new file mode 100644 index 00000000..b9db65d5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountGroupTest.php @@ -0,0 +1,45 @@ +{AdAccountGroupFields::NAME} = $this->getConfig()->testRunId; + $this->assertCanCreate($group); + $this->assertCanRead($group); + $this->assertCanUpdate($group, array( + AdAccountGroupFields::NAME => $this->getConfig()->testRunId.' updated')); + + $this->assertCanFetchConnectionAsArray($group, 'getUsers'); + $this->assertCanFetchConnectionAsArray($group, 'getAdAccounts'); + + $this->assertCanDelete($group); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountTest.php new file mode 100644 index 00000000..6b030e62 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdAccountTest.php @@ -0,0 +1,165 @@ +adLabel = new AdLabel(null, $this->getConfig()->accountId); + $this->adLabel->{AdLabelFields::NAME} = $this->getConfig()->testRunId; + $this->adLabel->create(); + } + + public function tearDown() { + if ($this->adLabel !== null) { + $this->adLabel->deleteSelf(); + $this->adLabel = null; + } + + parent::tearDown(); + } + + public function testCrud() { + $account = new AdAccount($this->getConfig()->accountId); + + $this->assertCanRead($account); + $name = $account->read(array(AdAccountFields::NAME)) + ->{AdAccountFields::NAME}; + $this->assertCanUpdate( + $account, + array(AdAccountFields::NAME => $this->getConfig()->testRunId)); + + // Restore original account name + $account->{AdAccountFields::NAME} = $name; + $account->save(); + + $this->assertCannotDelete($account); + + $targeting = new TargetingSpecs(); + $targeting->setData(array( + TargetingSpecsFields::GEO_LOCATIONS => + array('countries' => array('US', 'JP')), + TargetingSpecsFields::GENDERS => array(1), + TargetingSpecsFields::AGE_MIN => 20, + TargetingSpecsFields::AGE_MAX => 24, + )); + + $creative = (new AdCreative())->setData(array( + AdCreativeFields::TITLE => 'My Test Creative', + AdCreativeFields::BODY => 'My Test Ad Creative Body', + AdCreativeFields::OBJECT_URL => 'https://www.facebook.com/facebook', + )); + + $targeting_params = array( + 'targeting_spec' => $targeting->exportData(), + ); + + $label_params = array( + 'ad_label_ids' => array( + $this->adLabel->{AdLabelFields::ID}, + ), + ); + + $this->assertCanFetchConnection($account, 'getActivities'); + $this->assertCanFetchConnection($account, 'getAdUsers'); + $this->assertCanFetchConnection($account, 'getCampaigns'); + $this->assertCanFetchConnection($account, 'getAdSets'); + $this->assertCanFetchConnection($account, 'getAds'); + $this->assertCanFetchConnection($account, 'getAdCreatives'); + $this->assertCanFetchConnection($account, 'getAdImages'); + $this->assertCanFetchConnection($account, 'getAdsPixels'); + $this->assertCanFetchConnection($account, 'getAdVideos'); + $this->assertCanFetchConnection($account, 'getBroadCategoryTargeting'); + $this->assertCanFetchConnection($account, 'getCustomAudiences'); + $this->assertCanFetchConnection($account, 'getConversionPixels'); + $this->assertCanFetchConnection($account, 'getPartnerCategories'); + $this->assertCanFetchConnection($account, 'getRateCards'); + $this->assertCanFetchConnection( + $account, + 'getReachEstimate', + array(), + array_merge( + $targeting_params, + array( + 'optimize_for' => OptimizationGoals::OFFSITE_CONVERSIONS, + ))); + + if (!$this->shouldSkipTest('no_reach_and_frequency')) { + $this->assertCanFetchConnection($account, 'getReachFrequencyPredictions'); + } + + $this->assertCanFetchConnection( + $account, 'getTargetingDescription', array(), $targeting_params); + + $this->assertCanFetchConnection($account, 'getTransactions'); + $this->assertCanFetchConnection($account, 'getAdPreviews', array(), array( + 'ad_format' => AdFormats::DESKTOP_FEED_STANDARD, + 'creative' => $creative->exportData(), + )); + $this->assertCanFetchConnection($account, 'getInsights'); + $this->assertCanFetchConnection($account, 'getInsightsAsync'); + $this->assertCanFetchConnection($account, 'getAgencies'); + $this->assertCanFetchConnection($account, 'getMinimumBudgets'); + $this->assertCanFetchConnection($account, 'getAdLabels'); + $this->assertCanFetchConnection( + $account, 'getCampaignsByLabel', array(), $label_params); + $this->assertCanFetchConnection( + $account, 'getAdSetsByLabel', array(), $label_params); + $this->assertCanFetchConnection( + $account, 'getAdsByLabel', array(), $label_params); + $this->assertCanFetchConnection( + $account, 'getAdCreativesByLabel', array(), $label_params); + + + if (!$this->getSkippableFeaturesManager() + ->isSkipKey('no_business_manager')) { + + $account->grantAgencyAcccess( + $this->getConfig()->secondaryBusinessId, + array(AdAccountRoles::GENERAL_USER)); + + $account->revokeAgencyAccess($this->getConfig()->secondaryBusinessId); + } + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdConversionPixelTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdConversionPixelTest.php new file mode 100644 index 00000000..e159b749 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdConversionPixelTest.php @@ -0,0 +1,48 @@ +getConfig()->accountId); + $conversionPixel->{AdConversionPixelFields::NAME} + = $this->getConfig()->testRunId; + $conversionPixel->{AdConversionPixelFields::TAG} = 'checkout'; + + $this->assertCanCreate($conversionPixel); + $this->assertCanRead($conversionPixel); + $this->assertCanUpdate( + $conversionPixel, + array( + AdConversionPixelFields::TAG => 'add_to_cart', + )); + $this->assertCanDelete($conversionPixel); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdCreativeTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdCreativeTest.php new file mode 100644 index 00000000..1b6b6431 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdCreativeTest.php @@ -0,0 +1,111 @@ +getConfig()->accountId); + $creative->{AdCreativeFields::TITLE} = 'My Test Ad'; + $creative->{AdCreativeFields::NAME} = 'My Test Ad'; + $creative->{AdCreativeFields::BODY} = 'My Test Ad Body'; + $creative->{AdCreativeFields::OBJECT_ID} = $this->getConfig()->pageId; + $this->assertCanCreate($creative); + $this->assertCanRead($creative); + $this->assertCanUpdate( + $creative, + array( + AdCreativeFields::NAME => 'My Test Ad '. $this->getConfig()->testRunId, + )); + $this->assertCanBeLabeled($creative); + $this->assertCanDelete($creative); + } + + public function testMultiProductObjectSpec() { + // Create a new AdCreative + $creative = new AdCreative(null, $this->getConfig()->accountId); + $creative->{AdCreativeFields::NAME} = 'Multi Product Ad Creative'; + + // Create a new ObjectStorySpec to create an unpublished post + $story = new ObjectStorySpec(); + $story->{ObjectStorySpecFields::PAGE_ID} = $this->getConfig()->pageId; + + // Create LinkData object representing data for a link page post + $link = new LinkData(); + $link->{LinkDataFields::LINK} = $this->getConfig()->appUrl; + $link->{LinkDataFields::CAPTION} = 'My Caption'; + + // Upload a test image to use in Attachments + $adImage = new AdImage(null, $this->getConfig()->accountId); + $adImage->{AdImageFields::FILENAME} = $this->getConfig()->testImagePath; + $adImage->save(); + + // Create 3 products as this will be a multi-product ad + $product1 = (new AttachmentData())->setData(array( + AttachmentDataFields::LINK => $this->getConfig()->appUrl.'p1', + AttachmentDataFields::IMAGE_HASH => $adImage->hash, + AttachmentDataFields::NAME => 'Product 1', + AttachmentDataFields::DESCRIPTION => '$100', + )); + + $product2 = (new AttachmentData())->setData(array( + AttachmentDataFields::LINK => $this->getConfig()->appUrl.'p2', + AttachmentDataFields::IMAGE_HASH => $adImage->hash, + AttachmentDataFields::NAME => 'Product 2', + AttachmentDataFields::DESCRIPTION => '$200', + )); + + $product3 = (new AttachmentData())->setData(array( + AttachmentDataFields::LINK => $this->getConfig()->appUrl.'p3', + AttachmentDataFields::IMAGE_HASH => $adImage->hash, + AttachmentDataFields::NAME => 'Product 3', + AttachmentDataFields::DESCRIPTION => '$300', + )); + + // Add the products into the child attachments + $link->{LinkDataFields::CHILD_ATTACHMENTS} = array( + $product1, + $product2, + $product3, + ); + + $story->{ObjectStorySpecFields::LINK_DATA} = $link; + $creative->{AdCreativeFields::OBJECT_STORY_SPEC} = $story; + + $this->assertCanCreate($creative); + $this->assertCanDelete($creative); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdImageTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdImageTest.php new file mode 100644 index 00000000..0df399ed --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdImageTest.php @@ -0,0 +1,61 @@ +getConfig()->accountId); + $image->{AdImageFields::FILENAME} = $this->getConfig()->testImagePath; + $this->assertCanCreate($image); + $this->assertCanRead($image); + $this->assertCannotUpdate($image); + $this->assertCanDelete($image); + } + + /** + * @expectedException \Exception + */ + public function testZipFileInNormalCreate() { + $image = new AdImage(null, $this->getConfig()->accountId); + $image->{AdImageFields::FILENAME} + = $this->getConfig()->testZippedImagesPath; + $image->create(); + } + + public function testBulkZipUpload() { + $images = AdImage::createFromZip( + $this->getConfig()->testZippedImagesPath, + $this->getConfig()->accountId); + $this->assertTrue(is_array($images)); + + foreach ($images as $image) { + $this->assertCanDelete($image); + } + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdLabelTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdLabelTest.php new file mode 100644 index 00000000..d18638df --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdLabelTest.php @@ -0,0 +1,44 @@ +getConfig()->accountId); + $label->{AdLabelFields::NAME} = $this->getConfig()->testRunId; + + $this->assertCanCreate($label); + $this->assertCanRead($label); + $this->assertCanUpdate( + $label, + array(AdLabelFields::NAME => $this->getConfig()->testRunId . ' updated')); + + $this->assertCanDelete($label); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdPreviewTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdPreviewTest.php new file mode 100644 index 00000000..509c538d --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdPreviewTest.php @@ -0,0 +1,212 @@ +{TargetingSpecsFields::GEO_LOCATIONS} + = array('countries' => array('US')); + + $this->campaign = new Campaign(null, $this->getConfig()->accountId); + $this->campaign->{CampaignFields::NAME} = $this->getConfig()->testRunId; + $this->campaign->create(); + + $this->adSet = new AdSet(null, $this->getConfig()->accountId); + $this->adSet->{AdSetFields::CAMPAIGN_ID} + = (int) $this->campaign->{AdSetFields::ID}; + $this->adSet->{AdSetFields::NAME} = $this->getConfig()->testRunId; + $this->adSet->{AdSetFields::DAILY_BUDGET} = '150'; + $this->adSet->{AdSetFields::START_TIME} + = (new \DateTime("+1 week"))->format(\DateTime::ISO8601); + $this->adSet->{AdSetFields::END_TIME} + = (new \DateTime("+2 week"))->format(\DateTime::ISO8601); + $this->adSet->{AdFields::TARGETING} = $targeting; + $this->adSet->{AdSetFields::OPTIMIZATION_GOAL} = OptimizationGoals::REACH; + $this->adSet->{AdSetFields::BILLING_EVENT} = BillingEvents::IMPRESSIONS; + $this->adSet->{AdSetFields::BID_AMOUNT} = 2; + $this->adSet->create(array( + AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED, + )); + + $this->adImage = new AdImage(null, $this->getConfig()->accountId); + $this->adImage->{AdImageFields::FILENAME} + = $this->getConfig()->testImagePath; + $this->adImage->save(); + + $this->adCreative = new AdCreative(null, $this->getConfig()->accountId); + $this->adCreative->{AdCreativeFields::TITLE} = 'My Test Ad'; + $this->adCreative->{AdCreativeFields::BODY} = 'My Test Ad Body'; + $this->adCreative->{AdCreativeFields::OBJECT_ID} + = $this->getConfig()->pageId; + $this->adCreative->{AdCreativeFields::IMAGE_HASH} + = $this->adImage->{AdImageFields::HASH}; + $this->adCreative->create(); + + $this->ad = new Ad(null, $this->getConfig()->accountId); + $this->ad->{AdFields::NAME} = $this->getConfig()->testRunId; + $this->ad->{AdFields::ADSET_ID} + = (int) $this->adSet->{AdSetFields::ID}; + $this->ad->{AdFields::CREATIVE} + = array('creative_id' => $this->adCreative->{AdCreativeFields::ID}); + $this->ad->create(array( + Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED, + )); + } + + public function tearDown() { + + if ($this->ad) { + $this->ad->deleteSelf(); + $this->ad = null; + } + + if ($this->adSet) { + $this->adSet->deleteSelf(); + $this->adSet = null; + } + + if ($this->campaign) { + $this->campaign->deleteSelf(); + $this->campaign = null; + } + + if ($this->adCreative) { + $this->adCreative->deleteSelf(); + $this->adCreative = null; + } + + if ($this->adImage) { + $this->adImage->deleteSelf(); + $this->adImage = null; + } + + parent::tearDown(); + } + + public function testAdPreviews() { + // Preview with actual creative + $previews = $this->adCreative->getAdPreviews( + array(), + array( + AdPreviewFields::AD_FORMAT => AdFormats::RIGHT_COLUMN_STANDARD + ) + ); + $this->assertNotEquals(0, $previews->count()); + $preview = $previews->offsetGet(0); + $this->assertRegExp( + '/iframe/', + $preview->{AdPreviewFields::BODY} + ); + + // Preview with actual adgroup + $previews = $this->ad->getAdPreviews( + array(), + array( + AdPreviewFields::AD_FORMAT => AdFormats::RIGHT_COLUMN_STANDARD + ) + ); + $this->assertNotEquals(0, $previews->count()); + $preview = $previews->offsetGet(0); + $this->assertRegExp( + '/iframe/', + $preview->{AdPreviewFields::BODY} + ); + + // Preview with creative specs + $account = new AdAccount($this->getConfig()->accountId); + $previews = $account->getAdPreviews( + array(), + array( + AdPreviewFields::CREATIVE => array( + AdCreativeFields::BODY => 'Testing the creative preview', + AdCreativeFields::OBJECT_ID => $this->getConfig()->pageId, + ), + AdPreviewFields::AD_FORMAT => AdFormats::RIGHT_COLUMN_STANDARD, + ) + ); + $this->assertNotEquals(0, $previews->count()); + $preview = $previews->offsetGet(0); + $this->assertRegExp( + '/iframe/', + $preview->{AdPreviewFields::BODY} + ); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdSetTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdSetTest.php new file mode 100644 index 00000000..836d1729 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdSetTest.php @@ -0,0 +1,93 @@ +campaign = new Campaign(null, $this->getConfig()->accountId); + $this->campaign->{CampaignFields::NAME} + = $this->getConfig()->testRunId; + $this->campaign->create(); + } + + public function tearDown() { + $this->campaign->deleteSelf(); + $this->campaign = null; + parent::tearDown(); + } + + public function testCrud() { + $targeting = new TargetingSpecs(); + $targeting->{TargetingSpecsFields::GEO_LOCATIONS} + = array('countries' => array('US')); + + $set = new AdSet(null, $this->getConfig()->accountId); + $set->{AdSetFields::CAMPAIGN_ID} + = $this->campaign->{CampaignFields::ID}; + $set->{AdSetFields::NAME} = $this->getConfig()->testRunId; + $set->{AdSetFields::OPTIMIZATION_GOAL} = OptimizationGoals::REACH; + $set->{AdSetFields::BILLING_EVENT} = BillingEvents::IMPRESSIONS; + $set->{AdSetFields::BID_AMOUNT} = 2; + $set->{AdSetFields::DAILY_BUDGET} = '150'; + $set->{AdSetFields::TARGETING} = $targeting; + $set->{AdSetFields::START_TIME} + = (new \DateTime("+1 week"))->format(\DateTime::ISO8601); + $set->{AdSetFields::END_TIME} + = (new \DateTime("+2 week"))->format(\DateTime::ISO8601); + + $this->assertCanCreate($set, array( + AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED, + )); + $this->assertCanRead($set); + $this->assertCanUpdate($set, array( + AdSetFields::NAME => $this->getConfig()->testRunId.' updated', + )); + $this->assertCanFetchConnection($set, 'getAds'); + $this->assertCanFetchConnection($set, 'getAdCreatives'); + $this->assertCanFetchConnection($set, 'getInsights'); + $this->assertCanFetchConnection($set, 'getInsightsAsync'); + + $this->assertCanBeLabeled($set); + $this->assertCanArchive($set); + + $this->assertCanDelete($set); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdTest.php new file mode 100644 index 00000000..38df24cb --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdTest.php @@ -0,0 +1,185 @@ +{TargetingSpecsFields::GEO_LOCATIONS} = array( + 'countries' => array('US'), + ); + + $this->campaign = new Campaign(null, $this->getConfig()->accountId); + $this->campaign->{CampaignFields::NAME} = $this->getConfig()->testRunId; + $this->campaign->create(); + + $this->adSet = new AdSet(null, $this->getConfig()->accountId); + $this->adSet->{AdSetFields::CAMPAIGN_ID} + = (int) $this->campaign->{AdSetFields::ID}; + $this->adSet->{AdSetFields::NAME} = $this->getConfig()->testRunId; + $this->adSet->{AdSetFields::DAILY_BUDGET} = '150'; + $this->adSet->{AdSetFields::START_TIME} + = (new \DateTime("+1 week"))->format(\DateTime::ISO8601); + $this->adSet->{AdSetFields::END_TIME} + = (new \DateTime("+2 week"))->format(\DateTime::ISO8601); + $this->adSet->{AdSetFields::TARGETING} = $targeting; + $this->adSet->{AdSetFields::OPTIMIZATION_GOAL} = OptimizationGoals::REACH; + $this->adSet->{AdSetFields::BILLING_EVENT} = BillingEvents::IMPRESSIONS; + $this->adSet->{AdSetFields::BID_AMOUNT} = 2; + $this->adSet->save(array( + AdSet::STATUS_PARAM_NAME => AdSet::STATUS_PAUSED, + )); + + $this->adImage = new AdImage(null, $this->getConfig()->accountId); + $this->adImage->{AdImageFields::FILENAME} + = $this->getConfig()->testImagePath; + $this->adImage->save(); + + $link = new LinkData(); + $link->{LinkDataFields::MESSAGE} = 'Message'; + $link->{LinkDataFields::IMAGE_HASH} = $this->adImage->{AdImageFields::HASH}; + $link->{LinkDataFields::LINK} = $this->getConfig()->appUrl; + + $story = new ObjectStorySpec(); + $story->{ObjectStorySpecFields::PAGE_ID} = $this->getConfig()->pageId; + $story->{ObjectStorySpecFields::LINK_DATA} = $link; + + $this->adCreative = new AdCreative(null, $this->getConfig()->accountId); + $this->adCreative->{AdCreativeFields::OBJECT_STORY_SPEC} = $story; + $this->adCreative->create(); + } + + public function tearDown() { + if ($this->adSet) { + $this->adSet->deleteSelf(); + $this->adSet = null; + } + + if ($this->campaign) { + $this->campaign->deleteSelf(); + $this->campaign = null; + } + + if ($this->adCreative) { + $this->adCreative->deleteSelf(); + $this->adCreative = null; + } + + if ($this->adImage) { + $this->adImage->deleteSelf(); + $this->adImage = null; + } + + parent::tearDown(); + } + + public function testCrudAccess() { + + $group = new Ad(null, $this->getConfig()->accountId); + $group->{AdFields::NAME} = $this->getConfig()->testRunId; + $group->{AdFields::ADSET_ID} + = (int) $this->adSet->{AdSetFields::ID}; + $group->{AdFields::CREATIVE} + = array('creative_id' => $this->adCreative->{AdCreativeFields::ID}); + + $this->assertCanCreate($group, array( + Ad::STATUS_PARAM_NAME => Ad::STATUS_PAUSED, + )); + $this->assertCanRead($group); + $this->assertCanUpdate($group, array( + AdFields::NAME => $this->getConfig()->testRunId.' updated', + )); + + $this->assertCanFetchConnection($group, 'getAdCreatives'); + $this->assertCanFetchConnection($group, 'getLeads'); + $this->assertCanFetchConnection($group, 'getTargetingDescription'); + $this->assertCanFetchConnection($group, 'getAdPreviews', + array(), + array('ad_format' => 'RIGHT_COLUMN_STANDARD')); + + if (!$this->shouldSkipTest('no_reach_and_frequency')) { + $this->assertCanFetchConnection($group, 'getReachEstimate'); + } + $this->assertCanFetchConnection($group, 'getClickTrackingTag'); + $this->assertCanFetchConnection($group, 'getInsights'); + $this->assertCanFetchConnection($group, 'getInsightsAsync'); + + $this->assertCanBeLabeled($group); + $this->assertCanArchive($group); + + $this->assertCanDelete($group); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdUserTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdUserTest.php new file mode 100644 index 00000000..5cfd7c8c --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdUserTest.php @@ -0,0 +1,52 @@ +getConfig()->accountId); + $ad_users = $ad_account->getAdUsers(); + + $this->assertGreaterThan(0, $ad_users->count()); + + $uid = (new AdUser('me'))->read()->{AdUserFields::ID}; + $found = false; + foreach ($ad_users as $ad_user) { + if ($ad_user->id === $uid) { + $this->assertCanFetchConnection($ad_user, 'getAdAccounts'); + $this->assertCanFetchConnection($ad_user, 'getAdAccountGroups'); + $found = true; + break; + } + } + + $this->assertTrue($found); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdVideoTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdVideoTest.php new file mode 100644 index 00000000..6a05eafe --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdVideoTest.php @@ -0,0 +1,52 @@ +getConfig()->accountId); + $video->{AdVideoFields::NAME} = $this->getConfig()->testRunId; + $video->{AdVideoFields::SOURCE} = $this->getConfig()->testVideoPath; + $this->assertCanCreate($video); + $this->assertCanRead($video); + $this->assertCanUpdate($video, array( + AdVideoFields::NAME => $this->getConfig()->testRunId.' updated', + )); + $this->assertCanDelete($video); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdsPixelTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdsPixelTest.php new file mode 100644 index 00000000..fcaf9951 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AdsPixelTest.php @@ -0,0 +1,166 @@ +getConfig()->accountId); + $pixels = $account->getAdsPixels(); + $pixel = null; + + if (!$pixels->count()) { + $pixel = new AdsPixel(null, $this->getConfig()->accountId); + $pixel->{AdsPixelsFields::NAME} = 'WCA Pixel'; + $this->assertCanCreate($pixel); + } else { + $pixel = $pixels->current(); + } + + $pixel = new AdsPixel(null, $this->getConfig()->accountId); + $pixel->{AdsPixelsFields::NAME} = $this->getConfig()->testRunId; + $this->assertCannotCreate($pixel); + } + + /** + * @return AdsPixel + */ + protected function getAccountPixel() { + $cursor = (new AdAccount($this->getConfig()->accountId))->getAdsPixels(); + $this->assertGreaterThanOrEqual(1, $cursor->count()); + + return $cursor->current(); + } + + /** + * @depends testCreate + */ + public function testCrud() { + $pixel = $this->getAccountPixel(); + + $this->assertCanRead($pixel, array( + AdsPixelsFields::NAME, + )); + + $name = $pixel->{AdsPixelsFields::NAME}; + + $this->assertCanUpdate( + $pixel, + array( + AdsPixelsFields::NAME => $this->getConfig()->testRunId.' updated', + )); + + $pixel->{AdsPixelsFields::NAME} = $name; + $pixel->update(); + + $this->assertCanFetchConnection($pixel, 'getAdAccounts', array(), array( + 'business' => $this->getConfig()->businessId, + )); + $this->assertCanFetchConnection($pixel, 'getAgencies'); + $this->assertCanFetchConnection($pixel, 'getStats', array(), array( + 'aggregation' => AdsPixelStatAggregations::EVENT, + )); + + $this->assertCannotDelete($pixel); + } + + /** + * @depends testCreate + */ + public function testShareWithAdAccount() { + $this->skipIf('no_business_manager'); + + if (!$this->getConfig()->secondaryBusinessId) { + $this->markTestSkipped('No secondary business provided in config'); + } + + if (!$this->getConfig()->secondaryAccountId) { + $this->markTestSkipped('No secondary ad account provided in config'); + } + + $account_id_int = (int) substr($this->getConfig()->secondaryAccountId, 4); + + $pixel = $this->getAccountPixel(); + + $pixel->sharePixelWithAdAccount( + $this->getConfig()->secondaryBusinessId, + $account_id_int); + + $pixel->unsharePixelWithAdAccount( + $this->getConfig()->secondaryBusinessId, + $account_id_int); + + } + + /** + * @depends testCreate + */ + public function testShareWithAgency() { + $this->skipIf('no_business_manager'); + + if (!$this->getConfig()->secondaryAccountId) { + $this->markTestSkipped('No secondary business provided in config'); + } + + $pixel = $this->getAccountPixel(); + + $business = new Business($this->getConfig()->businessId); + $cursor = $business->getAgencies(); + $cursor->setUseImplicitFetch(true); + + $agency_id = null; + foreach ($cursor as $agency) { + if ( + $agency->{AbstractCrudObject::FIELD_ID} + == $this->getConfig()->secondaryBusinessId + ) { + $agency_id = $agency->{AbstractCrudObject::FIELD_ID}; + } + } + + if ($agency_id === null) { + $this->markTestSkipped("Secondary business is not a valid agency"); + } + + $pixel->sharePixelWithAgency( + $this->getConfig()->businessId, + $this->getConfig()->secondaryBusinessId); + + $pixel->unsharePixelWithAgency( + $this->getConfig()->businessId, + $this->getConfig()->secondaryBusinessId); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AsyncJobInsightsTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AsyncJobInsightsTest.php new file mode 100644 index 00000000..f09ce85c --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/AsyncJobInsightsTest.php @@ -0,0 +1,56 @@ +getConfig()->accountId); + $job = $account->getInsightsAsync(); + $this->assertTrue($job instanceof AdReportRun); + $this->waitTillJobComplete($job); + $job->getInsights(); + } + + public function testFields() { + $account = new AdAccount($this->getConfig()->accountId); + $fields = array(AdAccountFields::ACCOUNT_ID); + $account->{AdAccountFields::ACCOUNT_ID} = $account->getSelf($fields)->{AdAccountFields::ACCOUNT_ID}; + $fields = array(AdsInsightsFields::ACCOUNT_ID); + $job = $account->getInsightsAsync($fields); + $this->assertTrue($job instanceof AdReportRun); + $this->waitTillJobComplete($job); + $result = $job->getInsights(); + $this->assertEquals( + $result[0]->{AdsInsightsFields::ACCOUNT_ID}, + $account->{AdAccountFields::ACCOUNT_ID}); + } + } diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/BusinessTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/BusinessTest.php new file mode 100644 index 00000000..ed5dca6a --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/BusinessTest.php @@ -0,0 +1,109 @@ +getConfig()->businessId); + $this->assertCanRead($business); + $this->assertCannotDelete($business); + + + $name = $business->read(array(BusinessFields::NAME)) + ->{BusinessFields::NAME}; + + $this->assertCanUpdate($business, array( + BusinessFields::NAME => "My Awesome Business" + )); + + $business->{BusinessFields::NAME} = $name; + $business->save(); + + + if ($this->getConfig()->secondaryPageId) { + $business->claimPage( + $this->getConfig()->secondaryPageId, + BusinessRoles::OWNER); + $business->deletePage($this->getConfig()->secondaryPageId); + } + + $business->inviteUserByEmail('test@example.com', BusinessRoles::EMPLOYEE); + $business->deleteUserByEmail('test@example.com'); + + $user = (new AdUser('me'))->read(array('id')); + $business->addUserPermissionById( + $user->{AdUserFields::ID}, + BusinessRoles::ADMIN); + + if ($this->getConfig()->secondaryAccountId) { + $business->claimAdAccount( + $this->getConfig()->secondaryAccountId, + BusinessRoles::AGENCY, + array(AdAccountRoles::ADMIN)); + $business->deleteAdAccount( + $this->getConfig()->secondaryAccountId); + } + + if ($this->getConfig()->secondaryAppId) { + $business->claimApp( + $this->getConfig()->secondaryAppId, + BusinessRoles::OWNER); + $business->deleteApp($this->getConfig()->secondaryAppId); + } + } + + public function testConnections() { + $business = new Business($this->getConfig()->businessId); + $this->assertCanFetchConnection($business, 'getAdAccounts'); + $this->assertCanFetchConnection($business, 'getUserPermissions'); + $this->assertCanFetchConnection($business, 'getProjects'); + $this->assertCanFetchConnection($business, 'getPages'); + $this->assertCanFetchConnection($business, 'getApps'); + $this->assertCanFetchConnection($business, 'getClients'); + $this->assertCanFetchConnection($business, 'getAgencies'); + $this->assertCanFetchConnection($business, 'getCreditCards'); + $this->assertCanFetchConnection($business, 'getExtendedCredits'); + $this->assertCanFetchConnection($business, 'getProductCatalogues'); + $this->assertCanFetchConnection($business, 'getSystemUsers'); + $this->assertCanFetchConnection($business, 'getAdsPixels'); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CampaignTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CampaignTest.php new file mode 100644 index 00000000..99cebd24 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CampaignTest.php @@ -0,0 +1,53 @@ +getConfig()->accountId); + $campaign->{CampaignFields::NAME} = $this->getConfig()->testRunId; + + $this->assertCanCreate($campaign); + $this->assertCanRead($campaign); + $this->assertCanUpdate( + $campaign, + array( + CampaignFields::NAME => $this->getConfig()->testRunId.' updated', + )); + $this->assertCanFetchConnection($campaign, 'getAdSets'); + $this->assertCanFetchConnection($campaign, 'getAds'); + $this->assertCanFetchConnection($campaign, 'getInsights'); + $this->assertCanFetchConnection($campaign, 'getInsightsAsync'); + + $this->assertCanBeLabeled($campaign); + $this->assertCanArchive($campaign); + + $this->assertCanDelete($campaign); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceMultikeyTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceMultikeyTest.php new file mode 100644 index 00000000..b259874d --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceMultikeyTest.php @@ -0,0 +1,127 @@ +getConfig()->accountId); + $params = array( + CustomAudienceFields::NAME => $this->getConfig()->testRunId, + CustomAudienceFields::SUBTYPE => CustomAudienceSubtypes::CUSTOM, + ); + $this->customaudience = $adaccount->createCustomAudience( + array(), + $params + ); + } + + public function tearDown() { + if ($this->customaudience) { + $this->customaudience->deleteSelf(); + } + } + + private function checkServerResponse( + CustomAudience $ca, + array $users, + array $schema, + $is_hashed, + $is_normalized) { + $add = $ca->addUsersMultiKey($users, $schema, $is_hashed, $is_normalized); + $this->assertClusterChangesResponse($ca, $users, $add); + $remove = $ca->removeUsersMultiKey($users, $schema, $is_hashed, $is_normalized); + $this->assertClusterChangesResponse($ca, $users, $remove); + } + + + protected function assertClusterChangesResponse( + CustomAudience $ca, array $users, $response) { + + $this->assertTrue(is_array($response)); + + $this->assertArrayHasKey('audience_id', $response); + $this->assertEquals( + $response['audience_id'], $ca->{CustomAudienceFields::ID}); + $this->assertArrayHasKey('num_received', $response); + $this->assertEquals($response['num_received'], count($users)); + $this->assertArrayHasKey('num_invalid_entries', $response); + $this->assertEquals($response['num_invalid_entries'], 0); + } + + public function testMultikeyCustomAudiences() { + $users = array( + array('abc123def', 'fname', 'lname', 'someone@example.com'), + array('abc234def', 'fname_new', 'lname_new', 'someone_new@example.com'), + ); + $schema = array( + CustomAudienceMultikeySchemaFields::EXTERN_ID, + CustomAudienceMultikeySchemaFields::FIRST_NAME, + CustomAudienceMultikeySchemaFields::LAST_NAME, + CustomAudienceMultikeySchemaFields::EMAIL, + ); + $is_hashed = false; + $is_normalized = false; + $this->checkServerResponse( + $this->customaudience, + $users, + $schema, + $is_hashed, + $is_normalized); + } + + public function testSinglekeyExternIDCustomAudiences() { + $users = array( + array('abc123def'), + array('abc234def'), + array('abc345def'), + array('abc456def'), + ); + $schema = array( + CustomAudienceMultikeySchemaFields::EXTERN_ID, + ); + $is_hashed = false; + $is_normalized = false; + $this->checkServerResponse( + $this->customaudience, + $users, + $schema, + $is_hashed, + $is_normalized); + } + +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceNormalizers/EmailNormalizerTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceNormalizers/EmailNormalizerTest.php new file mode 100644 index 00000000..9a1d2b0c --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceNormalizers/EmailNormalizerTest.php @@ -0,0 +1,58 @@ +emailNormalizer = new EmailNormalizer(); + } + + public function testNormalizeData() { + return array( + array( + "foo@fb.com\t\r\n\0\x0B.", + 'foo@fb.com', + ), + ); + } + + /** + * @dataProvider testNormalizeData + */ + public function testNormalize($input, $expected) { + $this->assertEquals( + $expected, + $this->emailNormalizer->normalize('email', $input)); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceTest.php new file mode 100644 index 00000000..df9883dd --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/CustomAudienceTest.php @@ -0,0 +1,101 @@ +assertTrue(is_array($response)); + + $this->assertArrayHasKey('audience_id', $response); + $this->assertEquals( + $response['audience_id'], $ca->{CustomAudienceFields::ID}); + $this->assertArrayHasKey('num_received', $response); + $this->assertEquals($response['num_received'], count($users)); + $this->assertArrayHasKey('num_invalid_entries', $response); + $this->assertEquals($response['num_invalid_entries'], 0); + } + + public function testCustomAudiences() { + $ca = new CustomAudience(null, $this->getConfig()->accountId); + $ca->{CustomAudienceFields::NAME} = $this->getConfig()->testRunId; + $ca->{CustomAudienceFields::SUBTYPE} = CustomAudienceSubtypes::CUSTOM; + + $this->assertCanCreate($ca); + + $this->assertCanRead($ca); + $this->assertCanUpdate( + $ca, + array( + CustomAudienceFields::NAME => $this->getConfig()->testRunId.' updated', + )); + + $users = array('someone@example.com'); + + $add = $ca->addUsers($users, CustomAudienceTypes::EMAIL); + $this->assertClusterChangesResponse($ca, $users, $add); + + $remove = $ca->removeUsers($users, CustomAudienceTypes::EMAIL); + $this->assertClusterChangesResponse($ca, $users, $remove); + + $optout = $ca->optOutUsers($users, CustomAudienceTypes::EMAIL); + $this->assertSuccessResponse($optout); + + $this->assertCanDelete($ca); + } + + /** + * @depends testCustomAudiences + */ + public function testAppIdsPayload() { + $ca = new CustomAudience(null, $this->getConfig()->accountId); + $ca->{CustomAudienceFields::NAME} = $this->getConfig()->testRunId; + $ca->{CustomAudienceFields::SUBTYPE} = CustomAudienceSubtypes::CUSTOM; + $ca->create(); + + $users = array($this->getApi()->call('/me')->getContent()['id']); + + $add = $ca->addUsers( + $users, CustomAudienceTypes::ID, array($this->getConfig()->appId)); + $this->assertClusterChangesResponse($ca, $users, $add); + + $remove = $ca->removeUsers( + $users, CustomAudienceTypes::ID, array($this->getConfig()->appId)); + $this->assertClusterChangesResponse($ca, $users, $remove); + + $optout = $ca->optOutUsers( + $users, CustomAudienceTypes::ID, array($this->getConfig()->appId)); + $this->assertSuccessResponse($optout); + + $ca->deleteSelf(); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/DynamicProductAdsAdvertTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/DynamicProductAdsAdvertTest.php new file mode 100644 index 00000000..4d2e8f90 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/DynamicProductAdsAdvertTest.php @@ -0,0 +1,255 @@ +getConfig()->accountId); + $this->adsPixel = $account->getAdsPixels()->current(); + if ($this->adsPixel === null) { + throw new \Exception('Ads Pixel is null'); + } + + $this->productCatalog = + new ProductCatalog(null, $this->getConfig()->businessId); + $this->productCatalog->setData(array( + ProductCatalogFields::NAME => $this->getConfig()->testRunId, + )); + $this->productCatalog->create(); + + $this->productSet = + new ProductSet(null, $this->productCatalog->{ProductCatalogFields::ID}); + $this->productSet->setData(array( + ProductSetFields::NAME => $this->getConfig()->testRunId, + ProductSetFields::FILTER => array( + 'retailer_id' => array( + 'is_any' => array('pid1', 'pid2') + ) + ) + )); + $this->productSet->create(); + + $this->productAudience + = new ProductAudience(null, $this->getConfig()->accountId); + $this->productAudience->setData(array( + ProductAudienceFields::NAME => $this->getConfig()->testRunId, + ProductAudienceFields::PRODUCT_SET_ID => + $this->productSet->{ProductSetFields::ID}, + ProductAudienceFields::PIXEL_ID => + $this->adsPixel->{AdsPixelsFields::ID}, + ProductAudienceFields::INCLUSIONS => array(array( + 'retention_seconds' => 86400, + 'rule' => array( + 'and' => array( + array('event' => array('eq'=>'ViewContent')), + array('userAgent' => array('i_contains'=>'iPhone')) + ) + ) + )), + )); + + $this->productAudience->create(); + } + + public function tearDown() { + if ($this->productSet) { + $this->productSet->deleteSelf(); + $this->productSet = null; + } + + if ($this->productCatalog) { + $this->productCatalog->deleteSelf(); + $this->productCatalog = null; + } + + if ($this->productAudience) { + $this->productAudience->deleteSelf(); + $this->productAudience = null; + } + + if ($this->campaign) { + $this->campaign->deleteSelf(); + $this->campaign = null; + } + + if ($this->adSet) { + $this->adSet->deleteSelf(); + $this->adSet = null; + } + + if ($this->ad) { + $this->ad->deleteSelf(); + $this->ad = null; + } + + if ($this->creative) { + $this->creative->deleteSelf(); + $this->creative = null; + } + + parent::tearDown(); + } + + public function testDynamicProductAdsCreation() { + $this->campaign = new Campaign(null, $this->getConfig()->accountId); + $this->campaign->setData(array( + CampaignFields::NAME => $this->getConfig()->testRunId, + CampaignFields::OBJECTIVE => AdObjectives::PRODUCT_CATALOG_SALES, + CampaignFields::PROMOTED_OBJECT => + array('product_catalog_id' => + $this->productCatalog->{ProductCatalogFields::ID}) + )); + $this->assertCanCreate($this->campaign); + + $targeting = new TargetingSpecs(); + $targeting->{TargetingSpecsFields::GEO_LOCATIONS} = + array('countries' => array('US')); + $targeting->{TargetingSpecsFields::DYNAMIC_AUDIENCE_IDS} = + array($this->productAudience->{ProductAudienceFields::ID}); + + $this->adSet = new AdSet(null, $this->getConfig()->accountId); + $this->adSet->setData(array( + AdSetFields::NAME => $this->getConfig()->testRunId, + AdSetFields::OPTIMIZATION_GOAL => OptimizationGoals::LINK_CLICKS, + AdSetFields::BILLING_EVENT => BillingEvents::IMPRESSIONS, + AdSetFields::BID_AMOUNT => 2, + AdSetFields::DAILY_BUDGET => 2000, + AdSetFields::CAMPAIGN_ID => + $this->campaign->{CampaignFields::ID}, + AdSetFields::TARGETING => $targeting, + AdsetFields::PROMOTED_OBJECT => + array( + 'product_set_id' => $this->productSet->{ProductSetFields::ID}, + ), + )); + $this->assertCanCreate($this->adSet); + + $template = new TemplateData(); + $template->setData(array( + TemplateDataFields::DESCRIPTION => '{{product.description}}', + TemplateDataFields::LINK => 'http://www.example.com/', + TemplateDataFields::MESSAGE => 'Test DPA Ad Message', + TemplateDataFields::NAME => '{{product.name | titleize}}', + TemplateDataFields::CALL_TO_ACTION => array( + 'type' => CallToActionTypes::SHOP_NOW + ), + )); + + $story = new ObjectStorySpec(); + $story->setData(array( + ObjectStorySpecFields::PAGE_ID => $this->getConfig()->pageId, + ObjectStorySpecFields::TEMPLATE_DATA => $template, + )); + + $this->creative = new AdCreative(null, $this->getConfig()->accountId); + $this->creative->setData(array( + AdCreativeFields::NAME => $this->getConfig()->testRunId, + AdCreativeFields::OBJECT_STORY_SPEC => $story, + AdCreativeFields::PRODUCT_SET_ID => + $this->productSet->{ProductSetFields::ID}, + )); + $this->assertCanCreate($this->creative); + + $this->ad = new Ad(null, $this->getConfig()->accountId); + $this->ad->setData(array( + AdFields::NAME => 'DPA Test Ad 1 '.$this->getConfig()->testRunId, + AdFields::ADSET_ID => $this->adSet->{AdSetFields::ID}, + AdFields::CREATIVE => + array('creative_id' => $this->creative->{AdCreativeFields::ID}), + )); + $this->assertCanCreate($this->ad); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/EmptyCrudObject.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/EmptyCrudObject.php new file mode 100644 index 00000000..c2bf816e --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/EmptyCrudObject.php @@ -0,0 +1,30 @@ +getConfig()->pageId); + $forms = $page->getLeadgenForms( + array(LeadgenFormFields::ID), + array('limit' => $limit)); + + $forms->setUseImplicitFetch(false); // Force-disable pagination + + /** @var LeadgenForm $form */ + foreach ($forms as $form) { + $leads = $form->getLeads(); + if ($leads->count() > 0) { + $this->leadId = $leads->current()->{LeadFields::ID}; + break; + } + } + + if ($this->leadId === null) { + $this->markTestSkipped(sprintf( + 'Leads can\'t be created through the API.' + .' The first %d leadgen forms of Page %s have no leads', + $limit, + (string)$this->getConfig()->pageId)); + } + } + + public function tearDown() { + $this->leadId = null; + + parent::tearDown(); + } + + public function testCrud() { + $lead = new Lead($this->leadId); + + $this->assertCannotCreate($lead); + $this->assertCanRead($lead); + $this->assertCannotUpdate($lead); + $this->assertCannotDelete($lead); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/LeadgenFormTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/LeadgenFormTest.php new file mode 100644 index 00000000..ce007ff4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/LeadgenFormTest.php @@ -0,0 +1,69 @@ +getConfig()->pageId); + $forms = $page->getLeadgenForms(); + + if ($forms->count() === 0) { + $this->markTestSkipped(sprintf( + 'LeadgenForms can\'t be created through the API.' + .' Page %s has no leadgen forms', + (string)$this->getConfig()->pageId)); + } + + $this->leadgenFormId = $forms->current()->{LeadgenFormFields::ID}; + } + + public function tearDown() { + $this->leadgenFormId = null; + + parent::tearDown(); + } + + public function testCrud() { + $form = new LeadgenForm($this->leadgenFormId); + + $this->assertCannotCreate($form); + $this->assertCanRead($form); + $this->assertCannotUpdate($form); + $this->assertCanFetchConnection($form, 'getLeads'); + $this->assertCannotDelete($form); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PageTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PageTest.php new file mode 100644 index 00000000..5a8f44b4 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PageTest.php @@ -0,0 +1,40 @@ +getConfig()->pageId); + + $this->assertCannotCreate($page); + $this->assertCanRead($page); + $this->assertCanFetchConnection($page, 'getLeadgenForms'); + + // Page editing is currently not supported in the SDK + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PartnerCategoryTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PartnerCategoryTest.php new file mode 100644 index 00000000..8a39a30b --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/PartnerCategoryTest.php @@ -0,0 +1,59 @@ +getConfig()->accountId); + $cursor = $account->getPartnerCategories(); + if (!$cursor->count()) { + $this->markTestSkipped(); + } + + /* @var $category AbstractCrudObject */ + $category = $cursor->current(); + + $this->assertTrue($category instanceof PartnerCategory); + $this->assertCanRead($category); + $this->assertCannotUpdate($category); + $this->assertCannotDelete($category); + $this->assertCannotCreate( + new PartnerCategory(null, $this->getConfig()->accountId)); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductAudienceTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductAudienceTest.php new file mode 100644 index 00000000..f3344ef0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductAudienceTest.php @@ -0,0 +1,130 @@ +account = new AdAccount($this->getConfig()->accountId); + + $cursor = $this->account->getAdsPixels(); + $this->adsPixel = $cursor->current(); + + $this->productCatalog = + new ProductCatalog(null, $this->getConfig()->businessId); + $this->productCatalog->setData(array( + ProductCatalogFields::NAME => $this->getConfig()->testRunId, + )); + $this->productCatalog->create(); + + $this->productSet = + new ProductSet(null, $this->productCatalog->{ProductCatalogFields::ID}); + $this->productSet->setData(array( + ProductSetFields::NAME => $this->getConfig()->testRunId, + ProductSetFields::FILTER => array( + 'retailer_id' => array( + 'is_any' => array('pid1', 'pid2') + ) + ) + )); + $this->productSet->create(); + } + + public function tearDown() { + if ($this->productSet) { + $this->productSet->deleteSelf(); + $this->productSet = null; + } + + if ($this->productCatalog) { + $this->productCatalog->deleteSelf(); + $this->productCatalog = null; + } + + parent::tearDown(); + } + + public function testCrudAccess() { + $audience_name = $this->getConfig()->testRunId; + $this->adsPixel->{AdsPixelsFields::ID}; + + $audience = new ProductAudience(null, $this->getConfig()->accountId); + $audience->setData(array( + ProductAudienceFields::NAME => $audience_name, + ProductAudienceFields::PRODUCT_SET_ID => + $this->productSet->{ProductSetFields::ID}, + ProductAudienceFields::PIXEL_ID => + $this->adsPixel->{AdsPixelsFields::ID}, + ProductAudienceFields::INCLUSIONS => array(array( + 'retention_seconds' => 86400, + 'rule' => array( + 'and' => array( + array('event' => array('eq'=>'ViewContent')), + array('userAgent' => array('i_contains'=>'iPhone')) + ) + ) + )), + )); + + $this->assertCanCreate($audience); + $this->assertCanRead($audience); + $this->assertCanUpdate($audience, array( + ProductAudienceFields::NAME => $audience_name.' updated', + )); + $this->assertCanDelete($audience); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductCatalogTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductCatalogTest.php new file mode 100644 index 00000000..bf6224a5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductCatalogTest.php @@ -0,0 +1,49 @@ +getConfig()->testRunId; + $catalog = new ProductCatalog(null, $this->getConfig()->businessId); + $catalog->setData(array( + ProductCatalogFields::NAME => $catalog_name, + )); + + $this->assertCanCreate($catalog); + $this->assertCanRead($catalog); + $this->assertCanUpdate($catalog, array( + ProductCatalogFields::NAME => $catalog_name.' updated', + )); + $this->assertCanFetchConnectionAsArray($catalog, 'getExternalEventSources'); + $this->assertCanFetchConnection($catalog, 'getProductSets'); + $this->assertCanFetchConnection($catalog, 'getProductFeeds'); + $this->assertCanDelete($catalog); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductFeedTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductFeedTest.php new file mode 100644 index 00000000..bf66b9d9 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductFeedTest.php @@ -0,0 +1,76 @@ +productCatalog + = new ProductCatalog(null, $this->getConfig()->businessId); + $this->productCatalog->setData(array( + ProductCatalogFields::NAME => $this->getConfig()->testRunId, + )); + $this->productCatalog->create(); + } + + public function tearDown() { + if ($this->productCatalog) { + $this->productCatalog->deleteSelf(); + $this->productCatalog = null; + } + + parent::tearDown(); + } + + public function testCrudAccess() { + $feed_name = $this->getConfig()->testRunId; + $feed = new ProductFeed(null, $this->productCatalog->id); + $feed->setData(array( + ProductFeedFields::FILE_NAME => 'my_product_feed.tsv', + ProductFeedFields::NAME => $feed_name, + )); + + $this->assertCanCreate($feed); + $this->assertCanRead($feed); + $this->assertCanUpdate($feed, array( + ProductFeedFields::NAME => $feed_name.' updated', + )); + $this->assertCanFetchConnection($feed, 'getProducts'); + $this->assertCanFetchConnection($feed, 'getUploads'); + $this->assertCanDelete($feed); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductSetTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductSetTest.php new file mode 100644 index 00000000..f8ac3c96 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProductSetTest.php @@ -0,0 +1,79 @@ +productCatalog + = new ProductCatalog(null, $this->getConfig()->businessId); + $this->productCatalog->setData(array( + ProductCatalogFields::NAME => $this->getConfig()->testRunId, + )); + $this->productCatalog->create(); + } + + public function tearDown() { + if ($this->productCatalog) { + $this->productCatalog->deleteSelf(); + $this->productCatalog = null; + } + + parent::tearDown(); + } + + public function testCrudAccess() { + $feed_name = $this->getConfig()->testRunId; + $product_set = new ProductSet(null, $this->productCatalog->id); + $product_set->setData(array( + ProductSetFields::NAME => $feed_name, + ProductSetFields::FILTER => array( + 'retailer_id' => array( + 'is_any' => array('pid1', 'pid2') + ) + ) + )); + + $this->assertCanCreate($product_set); + $this->assertCanRead($product_set); + $this->assertCanUpdate($product_set, array( + ProductSetFields::NAME => $feed_name.' updated', + )); + $this->assertCanFetchConnection($product_set, 'getProductGroups'); + $this->assertCanDelete($product_set); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProjectTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProjectTest.php new file mode 100644 index 00000000..05f89796 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ProjectTest.php @@ -0,0 +1,66 @@ +getConfig()->businessId); + $project->{ProjectFields::NAME} = 'Test Project'; + + $this->assertCanCreate($project); + $this->assertCanRead($project); + $this->assertCanUpdate($project, array( + ProjectFields::NAME => 'Updated Test Project Name' + )); + + $this->assertCanFetchConnection($project, 'getPages'); + $this->assertCanFetchConnection($project, 'getAdAccounts'); + $this->assertCanFetchConnection($project, 'getApps'); + + $project->addPage($this->getConfig()->pageId); + $project->deletePage($this->getConfig()->pageId); + + $project->adAdAccount($this->getConfig()->accountId); + $project->deleteAdAccount($this->getConfig()->accountId); + + $project->addApp($this->getConfig()->appId); + $project->deleteApp($this->getConfig()->appId); + + $this->assertCanDelete($project); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachEstimateTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachEstimateTest.php new file mode 100644 index 00000000..83e31358 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachEstimateTest.php @@ -0,0 +1,61 @@ +setData(array( + 'data' => array( + ReachEstimateFields::ESTIMATE_READY => true, + ), + )); + $this->assertTrue($reach_estimate->{ReachEstimateFields::ESTIMATE_READY}); + } + + public function testOnlyOuterData() { + $reach_estimate = new ReachEstimate(); + $reach_estimate->setData(array( + ReachEstimateFields::ESTIMATE_READY => true, + )); + $this->assertTrue($reach_estimate->{ReachEstimateFields::ESTIMATE_READY}); + } + + public function testInnerDataTakesPrecedenceOverOuterData() { + $reach_estimate = new ReachEstimate(); + $reach_estimate->setData(array( + ReachEstimateFields::ESTIMATE_READY => false, + 'data' => array( + ReachEstimateFields::ESTIMATE_READY => true, + ), + )); + $this->assertTrue($reach_estimate->{ReachEstimateFields::ESTIMATE_READY}); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachFrequencyPredictionTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachFrequencyPredictionTest.php new file mode 100644 index 00000000..610ea073 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ReachFrequencyPredictionTest.php @@ -0,0 +1,75 @@ +getConfig()->accountId); + + $targeting = new TargetingSpecs(); + $targeting->{TargetingSpecsFields::GEO_LOCATIONS} + = array('countries' => array('US')); + $targeting->{TargetingFields::AGE_MAX} = 35; + $targeting->{TargetingFields::AGE_MIN} = 20; + $targeting->{TargetingFields::GENDERS} = array(2); + $targeting->{TargetingFields::PUBLISHER_PLATFORMS} = array('facebook'); + $targeting->{TargetingFields::DEVICE_PLATFORMS} = array('desktop'); + $targeting->{TargetingFields::FACEBOOK_POSITIONS} = array('feed'); + + $prediction->setData(array( + RF::BUDGET => 3000000, + RF::TARGET_SPEC => $targeting, + RF::START_TIME => strtotime('midnight + 2 weeks'), + RF::END_TIME => strtotime('midnight + 3 weeks'), + RF::FREQUENCY_CAP => 4, + RF::DESTINATION_ID => $this->getConfig()->pageId, + RF::PREDICTION_MODE => ReachFrequencyPrediction::PREDICTION_MODE_REACH, + RF::OBJECTIVE => AdObjectives::POST_ENGAGEMENT, + RF::STORY_EVENT_TYPE => 128, + )); + + $this->assertCanCreate($prediction); + $this->assertCanDelete($prediction); + } + +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/AsyncClientTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/AsyncClientTest.php new file mode 100644 index 00000000..16219ca0 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/AsyncClientTest.php @@ -0,0 +1,58 @@ +getClient(); + $client2 = AsyncClient::getInstance()->getClient(); + + $this->assertEquals($client1, $client2); + } + + public function testCurlOptions() { + $async_client = AsyncClient::getInstance()->getClient(); + $expected_handler = HandlerStack::create(new CurlHandler([ + 'options' => [ + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => 60, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => true, + CURLOPT_CAINFO => Api::instance()->getHttpClient()->getCaBundlePath(), + ] + ])); + + $this->assertEquals($expected_handler, $async_client->getConfig()['handler']); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/BatchProcessorTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/BatchProcessorTest.php new file mode 100644 index 00000000..79d8060a --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/BatchProcessorTest.php @@ -0,0 +1,166 @@ +user_data = (new UserData())->setEmail('joe@eg.com'); + $this->event = (new Event()) + ->setEventName('Purchase') + ->setEventTime(time()) + ->setUserData($this->user_data); + $this->pixel_id = 'pixel-id-0'; + $this->test_event_code = 'test-code-1'; + $batch_size = 5; + $concurrent_requests = 2; + $this->batch_processor = new BatchProcessor($this->pixel_id, $batch_size, $concurrent_requests); + } + + protected function tearDown(): void { + m::close(); + } + + public function testProcessEvents() { + $expected_event_request_params = array( + 'events' => array_fill(0, 5, $this->event), + 'test_event_code' => $this->test_event_code, + ); + + $mock_event_request_async = m::mock('overload:FacebookAds\Object\ServerSide\EventRequestAsync'); + $mock_guzzle_promise = m::mock(); + + $mock_event_request_async + ->shouldReceive('__construct') + ->atLeast() + ->once() + ->with($this->pixel_id, $expected_event_request_params); + $mock_event_request_async + ->shouldReceive('execute') + ->atLeast() + ->once() + ->andReturn($mock_guzzle_promise); + $mock_guzzle_promise + ->shouldReceive('wait') + ->times(3); + $this->addToAssertionCount( + m::getContainer()->mockery_getExpectationCount() + ); + + $events = array_fill(0, 15, $this->event); + $this->batch_processor->processEvents( + array('test_event_code' => $this->test_event_code), + $events + ); + } + + public function testProcessEventsGenerator() { + $expected_event_request_params = array( + 'events' => array_fill(0, 5, $this->event), + 'test_event_code' => $this->test_event_code, + ); + + $mock_event_request_async = m::mock('overload:FacebookAds\Object\ServerSide\EventRequestAsync'); + $mock_guzzle_promise = m::mock(); + + $mock_event_request_async + ->shouldReceive('__construct') + ->atLeast() + ->once() + ->with($this->pixel_id, $expected_event_request_params); + $mock_event_request_async + ->shouldReceive('execute') + ->atLeast() + ->once() + ->andReturn($mock_guzzle_promise); + $mock_guzzle_promise + ->shouldReceive('wait') + ->times(3); + + $events = array_fill(0, 15, $this->event); + $generator = $this->batch_processor->processEventsGenerator( + array('test_event_code' => $this->test_event_code), + $events + ); + $iterations = 0; + foreach ($generator as $promises) { + $iterations += 1; + Promise\unwrap($promises); + } + + $this->assertEquals($iterations, 2); + } + + public function testProcessEventRequests() { + $mock_event_request_async = m::mock(); + $mock_guzzle_promise = m::mock(); + $expected_event_request_params = array_fill(0, 5, $mock_event_request_async); + + $mock_event_request_async + ->shouldReceive('execute') + ->times(5) + ->andReturn($mock_guzzle_promise); + $mock_guzzle_promise + ->shouldReceive('wait') + ->times(5); + $this->addToAssertionCount( + m::getContainer()->mockery_getExpectationCount() + ); + + $event_requests = array_fill(0, 5, $mock_event_request_async); + $this->batch_processor->processEventRequests($event_requests); + } + + public function testProcessEventRequestsGenerator() { + $mock_event_request_async = m::mock(); + $mock_guzzle_promise = m::mock(); + $expected_event_request_params = array_fill(0, 5, $mock_event_request_async); + + $mock_event_request_async + ->shouldReceive('execute') + ->times(5) + ->andReturn($mock_guzzle_promise); + $mock_guzzle_promise + ->shouldReceive('wait') + ->times(5); + + $event_requests = array_fill(0, 5, $mock_event_request_async); + $generator = $this->batch_processor->processEventRequestsGenerator($event_requests); + $iterations = 0; + foreach ($generator as $promises) { + $iterations += 1; + Promise\unwrap($promises); + } + + $this->assertEquals(3, $iterations); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ContentTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ContentTest.php new file mode 100644 index 00000000..91184107 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ContentTest.php @@ -0,0 +1,97 @@ + 'product-test', + 'quantity' => 10, + 'item_price' => 4.99, + 'title' => 'title-test', + 'description' => 'description-test', + 'brand' => 'brand-test', + 'category' => 'category-test', + 'delivery_category' => DeliveryCategory::CURBSIDE, + ); + + $content = (new Content()) + ->setProductId($expected['id']) + ->setQuantity($expected['quantity']) + ->setItemPrice($expected['item_price']) + ->setTitle($expected['title']) + ->setDescription($expected['description']) + ->setBrand($expected['brand']) + ->setCategory($expected['category']) + ->setDeliveryCategory($expected['delivery_category']); + + $this->assertEquals($content->normalize(), $expected); + } + + public function testContentConstructor() { + $initial = array( + 'product_id' => 'product-test', + 'quantity' => 10, + 'item_price' => 4.99, + 'title' => 'title-test', + 'description' => 'description-test', + 'brand' => 'brand-test', + 'category' => 'category-test', + 'delivery_category' => DeliveryCategory::CURBSIDE, + ); + $expected = array( + 'id' => $initial['product_id'], + 'quantity' => $initial['quantity'], + 'item_price' => $initial['item_price'], + 'title' => $initial['title'], + 'description' => $initial['description'], + 'brand' => $initial['brand'], + 'category' => $initial['category'], + 'delivery_category' => DeliveryCategory::CURBSIDE, + ); + $content = new Content($initial); + + $this->assertEquals($content->normalize(), $expected); + } + + public function testInvalidDeliveryCategory() { + $test_delivery_category = 'invalid_delivery_category'; + $content = (new Content())->setDeliveryCategory($test_delivery_category); + try { + $normalized_payload = $content->normalize(); + } catch (\Exception $exception) { + $threw_exception = true; + $expected_string = sprintf("Invalid delivery_category passed: %s", $test_delivery_category); + $this->assertStringContainsString($expected_string, $exception->getMessage()); + } + + $this->assertTrue($threw_exception); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/CustomDataTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/CustomDataTest.php new file mode 100644 index 00000000..b7731353 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/CustomDataTest.php @@ -0,0 +1,120 @@ + 'property1', + 'custom2' => 'property2' + ); + $content_state = array('title' => 'content-1'); + $content = new Content($content_state); + $state = array( + 'value' => 0.1, + 'currency' => 'usd', + 'content_name' => 'content-name-2', + 'content_category' => 'content-category-3', + 'content_ids' => array('id-1', 'id2'), + 'content_type' => 'content-type-4', + 'order_id' => 'order-id-5', + 'predicted_ltv' => 6.10, + 'num_items' => 7, + 'status' => 'status-8', + 'search_string' => 'search-string-9', + 'item_number' => 'item-number-10', + 'delivery_category' => DeliveryCategory::CURBSIDE, + ); + $expected = array_merge( + $state, + array('contents' => array($content_state)), + $custom_properties + ); + $builder = (new CustomData()) + ->setValue($state['value']) + ->setCurrency($state['currency']) + ->setContentName($state['content_name']) + ->setContentCategory($state['content_category']) + ->setContentIds($state['content_ids']) + ->setContents(array($content)) + ->setContentType($state['content_type']) + ->setOrderId($state['order_id']) + ->setPredictedLtv($state['predicted_ltv']) + ->setNumItems($state['num_items']) + ->setStatus($state['status']) + ->setSearchString($state['search_string']) + ->setItemNumber($state['item_number']) + ->setDeliveryCategory($state['delivery_category']) + ->setCustomProperties($custom_properties); + $this->assertEquals($expected, $builder->normalize()); + + $constructor = new CustomData(array( + 'value' => $state['value'], + 'currency' => $state['currency'], + 'content_name' => $state['content_name'], + 'content_category' => $state['content_category'], + 'content_ids' => $state['content_ids'], + 'contents' => array($content), + 'content_type' => $state['content_type'], + 'order_id' => $state['order_id'], + 'predicted_ltv' => $state['predicted_ltv'], + 'num_items' => $state['num_items'], + 'status' => $state['status'], + 'search_string' => $state['search_string'], + 'item_number' => $state['item_number'], + 'delivery_category' => $state['delivery_category'], + 'custom_properties' => $custom_properties + )); + $this->assertEquals($expected, $constructor->normalize()); + } + + public function testInvalidDeliveryCategory() { + $test_delivery_category = 'invalid_delivery_category'; + + $custom_data = (new CustomData())->setDeliveryCategory($test_delivery_category); + + try { + $normalized_payload = $custom_data->normalize(); + } catch (\Exception $exception) { + $has_throw_exception = true; + $expected_string = sprintf("Invalid delivery_category passed: %s",$test_delivery_category); + $this->assertStringContainsString($expected_string, $exception->getMessage()); + } + + $this->assertTrue($has_throw_exception); + } + + public function testZeroCustomDataValue() { + $custom_data = (new CustomData())->setValue(0.0); + + $normalized_payload = $custom_data->normalize(); + $this->assertEquals($normalized_payload['value'], 0); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestAsyncTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestAsyncTest.php new file mode 100644 index 00000000..e0bf6094 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestAsyncTest.php @@ -0,0 +1,97 @@ + 'my-event')); + $expected = array( + 'data' => array(array('event_name' => $event['event_name'])), + 'test_event_code' => 'test-event-code-0', + 'partner_agent' => 'partner-agent-1', + 'namespace_id' => 'namespace-id-2', + 'upload_id' => 'upload-id-3', + 'upload_tag' => 'upload-tag-4', + 'upload_source' => 'upload-source-5', + ); + $event_request_async = (new EventRequestAsync('pixel-id')) + ->setEvents(array($event)) + ->setTestEventCode($expected['test_event_code']) + ->setPartnerAgent($expected['partner_agent']) + ->setNamespaceId($expected['namespace_id']) + ->setUploadId($expected['upload_id']) + ->setUploadTag($expected['upload_tag']) + ->setUploadSource($expected['upload_source']); + + $this->assertEquals($expected, $event_request_async->normalize()); + } + + public function testConstructor() { + $event = new Event(array('event_name' => 'my-event')); + $expected_event = array('data' => [array('event_name' => $event['event_name'])]); + $state = array( + 'test_event_code' => 'test-event-code-0', + 'partner_agent' => 'partner-agent-1', + 'namespace_id' => 'namespace-id-2', + 'upload_id' => 'upload-id-3', + 'upload_tag' => 'upload-tag-4', + 'upload_source' => 'upload-source-5', + ); + $data = array_merge(array('events' => array($event)), $state); + $expected = array_merge($state, $expected_event); + $event_request_async = new EventRequestAsync('pixel-id', $data); + + $this->assertEquals($expected, $event_request_async->normalize()); + } + + public function testPromiseCancel() { + Api::init(null, null, 'access-token-123'); + $event_request_async = new EventRequestAsync('pixel-id-456', array( + 'test_event_code' => 'test-event-code-0', + 'events' => array(new Event(array('event_name' => 'my-event'))) + )); + $promise = $event_request_async->execute(); + $promise->cancel(); + + $this->assertEquals('rejected', $promise->getState()); + } + + public function testPromiseReject() { + Api::init(null, null, 'access-token-123'); + $event_request_async = new EventRequestAsync('pixel-id-456', array( + 'test_event_code' => 'test-event-code-0', + 'events' => array(new Event(array('event_name' => 'my-event'))) + )); + $promise = $event_request_async->execute(); + $promise->reject('some error'); + + $this->assertEquals('rejected', $promise->getState()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestTest.php new file mode 100644 index 00000000..e9044afd --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/EventRequestTest.php @@ -0,0 +1,234 @@ +expected_pixel_id = 'pixel-1000'; + $this->expected_url = 'https://graph.facebook.com/v' + . ApiConfig::APIVersion + . '/' + . $this->expected_pixel_id + . '/events'; + $this->expected_headers = array( + 'User-Agent' => 'fbbizsdk-php-v' . ApiConfig::SDKVersion, + 'Accept-Encoding' => '*', + ); + $this->expected_access_token = 'a-test-token'; + $this->expected_curl_options = array( + CURLOPT_CONNECTTIMEOUT => 10, + CURLOPT_TIMEOUT => 60, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HEADER => true, + CURLOPT_CAINFO => Util::getCaBundlePath(), + ); + HttpServiceClientConfig::getInstance()->setAccessToken(null); + HttpServiceClientConfig::getInstance()->setClient(null); + HttpServiceClientConfig::getInstance()->setAppsecret(null); + Api::init(null, null, null, false); + } + + protected function tearDown(): void { + m::close(); + } + + public function testBuilder() { + $event = new Event(array('event_name' => 'event-123')); + $expected = array( + 'data' => array(array('event_name' => $event['event_name'])), + 'test_event_code' => 'test-event-code-0', + 'partner_agent' => 'partner-agent-1', + 'namespace_id' => 'namespace-id-2', + 'upload_id' => 'upload-id-3', + 'upload_tag' => 'upload-tag-4', + 'upload_source' => 'upload-source-5', + ); + $event_request = (new EventRequest('pixel-id')) + ->setEvents(array($event)) + ->setTestEventCode($expected['test_event_code']) + ->setPartnerAgent($expected['partner_agent']) + ->setNamespaceId($expected['namespace_id']) + ->setUploadId($expected['upload_id']) + ->setUploadTag($expected['upload_tag']) + ->setUploadSource($expected['upload_source']); + + $this->assertEquals($expected, $event_request->normalize()); + } + + public function testConstructor() { + $event = new Event(array('event_name' => 'event-123')); + $expected_event = array('data' => [array('event_name' => $event['event_name'])]); + $state = array( + 'test_event_code' => 'test-event-code-0', + 'partner_agent' => 'partner-agent-1', + 'namespace_id' => 'namespace-id-2', + 'upload_id' => 'upload-id-3', + 'upload_tag' => 'upload-tag-4', + 'upload_source' => 'upload-source-5', + ); + $data = array_merge(array('events' => array($event)), $state); + $expected = array_merge($state, $expected_event); + $event_request = new EventRequest('pixel-id', $data); + + $this->assertEquals($expected, $event_request->normalize()); + } + + public function testDefaultHttpService() { + $mock_ads_pixel = m::mock('overload:FacebookAds\Object\AdsPixel'); + $mock_ads_pixel + ->shouldReceive('__construct') + ->once() + ->with($this->expected_pixel_id); + $event_response_contents = array('data' => array('events_received' => 1)); + $expected_event_response = new EventResponse($event_response_contents); + $create_response_mock = $this->createMock(AbstractObject::class); + $create_response_mock + ->expects($this->once()) + ->method('exportAllData') + ->willReturn($event_response_contents); + $event_request = new EventRequest($this->expected_pixel_id); + $event_request->setEvents(array(new Event(array('event_name' => 'event-123')))); + $mock_ads_pixel + ->shouldReceive('createEvent') + ->once() + ->with(array(), $event_request->normalize()) + ->andReturn($create_response_mock); + $actual_event_response = $event_request->execute(); + + $this->assertEquals($expected_event_response, $actual_event_response); + } + + public function testSetHttpClient() { + $appsecret = 'appsecret-012'; + Api::init(null, $appsecret, $this->expected_access_token, false); + $mock_client = m::mock('FacebookAdsTest\Object\ServerSide\TestHelpers\FakeHttpService'); + $expected_event_response = new EventResponse( + array( + 'data' => array('events_received' => 1) + ) + ); + $event_request = new EventRequest($this->expected_pixel_id); + $event_request->setEvents(array(new Event(array('event_name' => 'event-123')))); + $event_request->setHttpClient($mock_client); + $mock_client + ->shouldReceive('executeRequest') + ->once() + ->with( + $this->expected_url, + 'POST', + $this->expected_curl_options, + $this->expected_headers, + $this->normalize_and_merge($event_request, $this->expected_access_token, $appsecret) + ) + ->andReturn($expected_event_response); + $actual_event_response = $event_request->execute(); + + $this->assertEquals($expected_event_response, $actual_event_response); + } + + public function testSetHttpClientClientConfig() { + $mock_client = m::mock('FacebookAdsTest\Object\ServerSide\TestHelpers\FakeHttpService'); + $expected_event_response = new EventResponse( + array( + 'data' => array('events_received' => 1) + ) + ); + $event_request = new EventRequest($this->expected_pixel_id); + $event_request->setEvents(array(new Event(array('event_name' => 'event-123')))); + $mock_client + ->shouldReceive('executeRequest') + ->once() + ->with( + $this->expected_url, + 'POST', + $this->expected_curl_options, + $this->expected_headers, + $this->normalize_and_merge($event_request, $this->expected_access_token, null) + ) + ->andReturn($expected_event_response); + HttpServiceClientConfig::getInstance()->setClient($mock_client); + HttpServiceClientConfig::getInstance()->setAccessToken($this->expected_access_token); + $actual_event_response = $event_request->execute(); + + $this->assertEquals($expected_event_response, $actual_event_response); + } + + public function testEventRequestHttpClientOverridesClientConfig() { + $appsecret = 'appsecret-012'; + Api::init(null, 'a-different-app-secret', 'a-different-access-token', false); + $mock_used_client = m::mock('FacebookAdsTest\Object\ServerSide\TestHelpers\AnotherHttpService'); + $mock_unused_client = m::mock('FacebookAdsTest\Object\ServerSide\TestHelpers\AnotherHttpService'); + $expected_event_response = new EventResponse( + array( + 'data' => array('events_received' => 1) + ) + ); + $event_request = new EventRequest($this->expected_pixel_id); + $event_request->setEvents(array(new Event(array('event_name' => 'event-123')))); + $event_request->setHttpClient($mock_used_client); + $mock_used_client + ->shouldReceive('executeRequest') + ->once() + ->with( + $this->expected_url, + 'POST', + $this->expected_curl_options, + $this->expected_headers, + $this->normalize_and_merge($event_request, $this->expected_access_token, $appsecret) + ) + ->andReturn($expected_event_response); + HttpServiceClientConfig::getInstance()->setClient($mock_unused_client); + HttpServiceClientConfig::getInstance()->setAccessToken($this->expected_access_token); + HttpServiceClientConfig::getInstance()->setAppsecret($appsecret); + $actual_event_response = $event_request->execute(); + + $this->assertEquals($expected_event_response, $actual_event_response); + } + + // Test helper functions + + protected function normalize_and_merge($event_request, $access_token, $appsecret) { + $normalized_merged = $event_request->normalize(); + $normalized_merged['access_token'] = $access_token; + if ($appsecret != null) { + $normalized_merged['appsecret_proof'] = Util::getAppsecretProof($access_token, $appsecret); + } + return $normalized_merged; + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideEventTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideEventTest.php new file mode 100644 index 00000000..56064be3 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideEventTest.php @@ -0,0 +1,86 @@ +setEventName($testName) + ->setEventTime($testTime) + ->setEventSourceUrl($testUrl); + + $normalized_array = $event->normalize(); + $this->assertEquals($normalized_array['event_name'], $testName); + $this->assertEquals($normalized_array['event_time'], $testTime); + $this->assertEquals($normalized_array['event_source_url'], $testUrl); + } + + public function testEmptyLDUData(){ + $event = (new Event()) + ->setEventName('TestEvent') + ->setDataProcessingOptions([]); + + $normalized_array = $event->normalize(); + + $this->assertEquals($normalized_array['data_processing_options'], array()); + } + + public function testDefaultLDUData(){ + $event = (new Event()) + ->setEventName('TestEvent') + ->setDataProcessingOptions(['LDU']) + ->setDataProcessingOptionsCountry(0) + ->setDataProcessingOptionsState(0); + + $normalized_array = $event->normalize(); + + $this->assertEquals($normalized_array['data_processing_options'], array("LDU")); + $this->assertEquals($normalized_array['data_processing_options_state'], "0"); + $this->assertEquals($normalized_array['data_processing_options_country'], "0"); + } + + public function testValidLDUStateCountryData(){ + $event = (new Event()) + ->setEventName('TestEvent') + ->setDataProcessingOptions(['LDU']) + ->setDataProcessingOptionsCountry(1) + ->setDataProcessingOptionsState(1000); + + $normalized_array = $event->normalize(); + + $this->assertEquals($normalized_array['data_processing_options'], array("LDU")); + $this->assertEquals($normalized_array['data_processing_options_state'], "1000"); + $this->assertEquals($normalized_array['data_processing_options_country'], "1"); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideNormalizeTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideNormalizeTest.php new file mode 100644 index 00000000..486ac584 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideNormalizeTest.php @@ -0,0 +1,533 @@ +assertEquals( + $expected, + Normalizer::normalize('em', $input)); + } + + /** + * Test cases for Phone Normalization + */ + public function phoneNormalizeData() { + return array( + array( + '123-456-7890', + '1234567890', + ), + array( + '777 747 (3515)', + '7777473515', + ), + array( + '+442071838750', + '442071838750', + ), + array( + '44-12390821300A', + '4412390821300', + ) + ); + } + + /** + * @dataProvider phoneNormalizeData + */ + public function testPhoneNormalize($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('ph', $input)); + } + + /** + * Test cases for Postal Code Normalization + */ + public function postalCodeNormalizeData() { + return array( + array( + ' 98121', + '98121', + ), + array( + '98121-4892', + '98121', + ), + array( + 'NR9 5AL', + 'nr95al', + ), + array( + '98-121-4892', + '98', + ), + ); + } + + /** + * @dataProvider postalCodeNormalizeData + */ + public function testPostalCodeNormalize($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('zp', $input)); + } + + /** + * Test cases for City Normalization + */ + public function cityNormalizeData() { + return array( + array( + 'Menlo Park', + 'menlopark', + ), + array( + 'Seattle-98121', + 'seattle', + ), + array( + 'Washington D.C', + 'washingtondc', + ), + ); + } + + /** + * @dataProvider cityNormalizeData + */ + public function testCityNormalize($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('ct', $input)); + } + + /** + * Test cases for Country Normalization + */ + public function countryNormalizeData() { + return array( + array( + ' US ', + 'us', + ), + array( + '*****UU*****', // Can't validate, just normalizes + 'uu', + ), + ); + } + + /** + * @dataProvider countryNormalizeData + */ + public function testCountryNormalize($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('country', $input)); + } + + /** + * Test cases for Currency Normalization + */ + public function currencyNormalizeData() { + return array( + array( + ' ABC ', // Can't validate the data, just normalizes. + 'abc', + ), + array( + 'INR', + 'inr', + ), + ); + } + + /** + * @dataProvider currencyNormalizeData + */ + public function testCurrencyNormalize($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('currency', $input)); + } + + /** + * test for asserting valid exception is thrown for invalid (ISO)currency format + */ + public function testCurrencyException() { + $has_throw_exception = false; + try { + Normalizer::normalize('currency', 'Us Dollar'); + } catch (\Exception $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + + /** + * test for asserting valid exception is thrown for invalid (ISO)country format + */ + public function testCountryException() { + $has_throw_exception = false; + try { + Normalizer::normalize('country', 'United States of America'); + } catch (\Exception $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + + /** + * test for asserting valid exception is thrown for invalid Email format + */ + public function testEmailException() { + $has_throw_exception = false; + try { + Normalizer::normalize('em', '324342@@@@bar.com'); + } catch (\Exception $e) { + $has_throw_exception = true; + } + $this->assertTrue($has_throw_exception); + } + + public function f5firstData() { + return array( + array( + 'George', + 'georg', + ), + array( + 'John', + 'john', + ), + array( + '', + '', + ), + array( + null, + null, + ), + ); + } + + /** + * @dataProvider f5firstData + */ + public function testF5first($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('f5first', $input) + ); + } + + public function f5lastData() { + return array( + array( + 'Washington', + 'washi', + ), + array( + 'Adams', + 'adams', + ), + array( + '', + '', + ), + array( + null, + null, + ), + ); + } + + /** + * @dataProvider f5lastData + */ + public function testF5last($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('f5last', $input) + ); + } + + public function fiData() { + return array( + array( + 'GW', + 'g', + ), + array( + 'j', + 'j', + ), + array( + '', + '', + ), + array( + null, + null, + ), + ); + } + + /** + * @dataProvider fiData + */ + public function testFi($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('fi', $input) + ); + } + + public function dobdData() { + return array( + array( + '1', + '01', + ), + array( + '9', + '09', + ), + array( + '31', + '31', + ), + array( + '', + '', + ), + array( + null, + null, + ), + ); + } + + /** + * @dataProvider dobdData + */ + public function testDobd($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('dobd', $input) + ); + } + + public function testDobdException() { + $failure_cases = array( + '-1', + '0', + '32', + '2b', + 'ab', + ); + $exceptions_counter = 0; + $has_throw_exception = false; + foreach ($failure_cases as $case) { + try { + Normalizer::normalize('dobd', $case); + } catch (\Exception $e) { + $exceptions_counter += 1; + } + } + $this->assertEquals(count($failure_cases), $exceptions_counter); + } + + public function dobmData() { + return array( + array( + '1', + '01', + ), + array( + '5', + '05', + ), + array( + '12', + '12', + ), + array( + '', + '', + ), + array( + null, + null, + ), + ); + } + + /** + * @dataProvider dobmData + */ + public function testDobm($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('dobm', $input) + ); + } + + public function testDobmException() { + $failure_cases = array( + '-1', + '0', + '13', + '1a', + 'May', + 'oc', + ); + $exceptions_counter = 0; + $has_throw_exception = false; + foreach ($failure_cases as $case) { + try { + Normalizer::normalize('dobm', $case); + } catch (\Exception $e) { + $exceptions_counter += 1; + } + } + $this->assertEquals(count($failure_cases), $exceptions_counter); + } + + public function dobyData() { + return array( + array( + '1995', + '1995', + ), + array( + '9999', + '9999', + ), + array( + '1000', + '1000', + ), + array( + '', + '', + ), + array( + null, + null, + ), + ); + } + + /** + * @dataProvider dobyData + */ + public function testDoby($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('doby', $input) + ); + } + + public function testDobyException() { + $failure_cases = array( + '-1', + '0', + '20', + '12345', + 'nineteen-eighty', + ); + $exceptions_counter = 0; + $has_throw_exception = false; + foreach ($failure_cases as $case) { + try { + Normalizer::normalize('doby', $case); + } catch (\Exception $e) { + $exceptions_counter += 1; + } + } + $this->assertEquals(count($failure_cases), $exceptions_counter); + } + + /** + * Test cases for DeliveryCategory Normalization + */ + public function deliveryCategoryNormalizeData() { + return array( + array( + 'home_delivery', + 'home_delivery', + ), + array( + 'CURBSIDE', + 'curbside', + ), + array( + ' IN_STORE ', + 'in_store', + ), + ); + } + + /** + * @dataProvider deliveryCategoryNormalizeData + */ + public function testDeliveryCategoryNormalize($input, $expected) { + $this->assertEquals( + $expected, + Normalizer::normalize('delivery_category', $input)); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideUtilTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideUtilTest.php new file mode 100644 index 00000000..a3b664de --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/ServerSideUtilTest.php @@ -0,0 +1,121 @@ +assertEquals("HTTP_CLIENT_IP_VALUE", + Util::getIpAddress()); + } + + public function testNewEventTakesIpAddressFromHttpXForwardedFor() { + $_SERVER["HTTP_X_FORWARDED_FOR"] = "HTTP_X_FORWARDED_FOR_VALUE"; + $_SERVER["REMOTE_ADDR"] = "REMOTE_ADDR"; + $this->assertEquals("HTTP_X_FORWARDED_FOR_VALUE", + Util::getIpAddress()); + } + + public function testNewEventTakesIpAddressFromRemoteAddr() { + $_SERVER["REMOTE_ADDR"] = "REMOTE_ADDR_VALUE"; + $this->assertEquals("REMOTE_ADDR_VALUE", + Util::getIpAddress()); + } + + public function testNewEventHasUserAgent() { + $_SERVER["HTTP_USER_AGENT"] = "HTTP_USER_AGENT_VALUE"; + + $this->assertEquals("HTTP_USER_AGENT_VALUE", + Util::getHttpUserAgent()); + } + + public function testNewEventHasEventSourceUrlWithHttps() { + $_SERVER["HTTPS"] = "anyvalue"; + $_SERVER["HTTP_HOST"] = "www.pikachu.com"; + $_SERVER["REQUEST_URI"] = "/index.php"; + + $this->assertEquals("https://www.pikachu.com/index.php", Util::getRequestUri()); + } + + public function testNewEventHasEventSourceUrlWithHttp() { + $_SERVER["HTTPS"] = ""; + $_SERVER["HTTP_HOST"] = "www.pikachu.com"; + $_SERVER["REQUEST_URI"] = "/index.php"; + + + $this->assertEquals("http://www.pikachu.com/index.php", Util::getRequestUri()); + } + + public function testNewEventHasEventSourceUrlWithHttpsOff() { + $_SERVER["HTTPS"] = "off"; + $_SERVER["HTTP_HOST"] = "www.pikachu.com"; + $_SERVER["REQUEST_URI"] = "/index.php"; + + $this->assertEquals("http://www.pikachu.com/index.php", Util::getRequestUri()); + } + + + public function testNewEventHasFbc() { + $_COOKIE["_fbc"] = "_fbc_value"; + + $this->assertEquals("_fbc_value", Util::getFbc()); + } + + public function testNewEventHasFbp() { + $_COOKIE["_fbp"] = "_fbp_value"; + + $this->assertEquals("_fbp_value", Util::getFbp()); + } + + public function testGetCaBundlePath() { + $this->assertTrue(file_exists(Util::getCaBundlePath())); + } + + public function testGetAppsecretProof() { + $access_token = 'accesstoken0'; + $appsecret = 'appsecret1'; + $expected_appsecret_proof = hash_hmac( + 'sha256', + $access_token, + $appsecret + ); + + $this->assertEquals( + Util::getAppsecretProof($access_token, $appsecret), + $expected_appsecret_proof + ); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/TestHelpers/AnotherHttpService.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/TestHelpers/AnotherHttpService.php new file mode 100644 index 00000000..cfbc9bcc --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/ServerSide/TestHelpers/AnotherHttpService.php @@ -0,0 +1,32 @@ + 'email-0@test.com', + 'phone' => '1234567890', + 'gender' => 'f', + 'date_of_birth' => '01/01/2001', + 'last_name' => 'last_name-4', + 'first_name' => 'first_name-5', + 'city' => 'city', + 'state' => 'state', + 'country_code' => 'us', + 'zip_code' => '12345', + 'external_id' => 'external_id-10', + 'client_ip_address' => 'client_ip_address-11', + 'client_user_agent' => 'client_user_agent-12', + 'fbc' => 'fbc-13', + 'fbp' => 'fbp-14', + 'subscription_id' => 'subscription_id-15', + 'fb_login_id' => 'fb_login_id-16', + 'lead_id' => 'lead_id-17', + 'f5first' => 'f5fir', + 'f5last' => 'f5las', + 'fi' => 'f', + 'dobd' => '01', + 'dobm' => '01', + 'doby' => '2001' + ); + $expected = array( + 'em' => Util::hash($initial_state['email']), + 'ph' => Util::hash($initial_state['phone']), + 'ge' => Util::hash($initial_state['gender']), + 'db' => Util::hash($initial_state['date_of_birth']), + 'ln' => Util::hash($initial_state['last_name']), + 'fn' => Util::hash($initial_state['first_name']), + 'ct' => Util::hash($initial_state['city']), + 'st' => Util::hash($initial_state['state']), + 'country' => Util::hash($initial_state['country_code']), + 'zp' => Util::hash($initial_state['zip_code']), + 'external_id' => 'external_id-10', + 'client_ip_address' => 'client_ip_address-11', + 'client_user_agent' => 'client_user_agent-12', + 'fbc' => 'fbc-13', + 'fbp' => 'fbp-14', + 'subscription_id' => 'subscription_id-15', + 'fb_login_id' => 'fb_login_id-16', + 'lead_id' => 'lead_id-17', + 'f5first' => Util::hash($initial_state['f5first']), + 'f5last' => Util::hash($initial_state['f5last']), + 'fi' => Util::hash($initial_state['fi']), + 'dobd' => Util::hash($initial_state['dobd']), + 'dobm' => Util::hash($initial_state['dobm']), + 'doby' => Util::hash($initial_state['doby']) + ); + $builder = (new UserData()) + ->setEmail($initial_state['email']) + ->setPhone($initial_state['phone']) + ->setGender($initial_state['gender']) + ->setDateOfBirth($initial_state['date_of_birth']) + ->setLastName($initial_state['last_name']) + ->setFirstName($initial_state['first_name']) + ->setCity($initial_state['city']) + ->setState($initial_state['state']) + ->setCountryCode($initial_state['country_code']) + ->setZipCode($initial_state['zip_code']) + ->setExternalId($initial_state['external_id']) + ->setClientIpAddress($initial_state['client_ip_address']) + ->setClientUserAgent($initial_state['client_user_agent']) + ->setFbc($initial_state['fbc']) + ->setFbp($initial_state['fbp']) + ->setSubscriptionId($initial_state['subscription_id']) + ->setFbLoginId($initial_state['fb_login_id']) + ->setLeadId($initial_state['lead_id']) + ->setF5first($initial_state['f5first']) + ->setF5last($initial_state['f5last']) + ->setFi($initial_state['fi']) + ->setDobd($initial_state['dobd']) + ->setDobm($initial_state['dobm']) + ->setDoby($initial_state['doby']); + $this->assertEquals($expected, $builder->normalize()); + + $constructor = new UserData($initial_state); + $this->assertEquals($expected, $constructor->normalize()); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/TargetingSearchTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/TargetingSearchTest.php new file mode 100644 index 00000000..d3654f9b --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/Object/TargetingSearchTest.php @@ -0,0 +1,42 @@ +current(); + $this->assertTrue($result instanceof TargetingSearch); + $this->assertNotEmpty($result->key); + } +} diff --git a/vendor/facebook/php-business-sdk/test/FacebookAdsTest/SessionTest.php b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/SessionTest.php new file mode 100644 index 00000000..d70e8040 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/FacebookAdsTest/SessionTest.php @@ -0,0 +1,59 @@ +createSession(); + + $this->assertEquals( + static::VALUE_SESSION_APP_ID, $session->getAppId()); + $this->assertEquals( + static::VALUE_SESSION_APP_SECRET, $session->getAppSecret()); + $this->assertEquals( + static::VALUE_SESSION_ACCESS_TOKEN, $session->getAccessToken()); + } + + public function testAppSecretProof() { + $session = $this->createSession(); + $proof = $session->getAppSecretProof(); + + // Assert SHA-2 > 256 bits > 64 chars + $this->assertTrue(strlen($proof) == 64); + } +} diff --git a/vendor/facebook/php-business-sdk/test/config.php b/vendor/facebook/php-business-sdk/test/config.php new file mode 100644 index 00000000..ea9cd053 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/config.php @@ -0,0 +1,164 @@ + '', + + /** + * @var string App Secret + * @see https://developers.facebook.com/apps//dashboard/ + */ + 'app_secret' => '', + + /** + * @var string User Access Token + * @see https://developers.facebook.com/docs/facebook-login/access-tokens/ + */ + 'access_token' => '', + + /** + * @var string Numeric Facebook Business Manager id, espressed as string + */ + 'business_id' => '', + + /** + * @var string Numeric Facebook id, preceded by 'act_', espressed as string + * @see https://www.facebook.com/ads/manage/home/ + */ + 'act_id' => '', + + /** + * @var string PHP timezone compatible with the AdAccount timezone, override php.ini config + * @see http://php.net/manual/en/timezones.php + */ + 'act_timezone' => '', + + /** + * @var string Numeric Facebook id, espressed as string + * @see https://www.facebook.com/ads/manage/home/ + */ + 'page_id' => '', + + /** + * @var string Url of your app [Stream post URL security] + * Example: 'http://my.domain.com/' + * @see https://developers.facebook.com/docs/facebook-login/security/#surfacearea + */ + 'app_url' => '', + + /** + * @var string Numeric Instagram actor id, espressed as string + */ + 'instagram_actor_id' => '', + + // OPTIONAL INTEGRATION TESTS + + 'skip_if' => array( + + /** + * @var bool Skip tests that require an business manager + * @see https://developers.facebook.com/docs/marketing-api/businessmanager/ + */ + 'no_business_manager' => true, + + /** + * @var bool Skip tests that require an account with a valid payment method + * @see https://secure.facebook.com/ads/manage/funding.php + */ + 'no_payment_method' => true, + + /** + * @var bool Skip tests that require parnet categories whitelisting + * @see https://developers.facebook.com/docs/reference/ads-api/partnercategories + */ + 'no_partner_categories' => true, + + /** + * @var bool Skip tests that require video upload + */ + 'no_video_upload' => true, + + /** + * @var bool Skip tests that require reach and frequency whitelisting + */ + 'no_reach_and_frequency_whitelist' => true, + + /** + * @var bool Skip tests that require polling for async jobs execution + */ + 'no_async_jobs' => true, + + /** + * @var bool Skip tests that require an instagram actor + */ + 'no_instagram' => true, + ), + + // OPTIONAL CONFIGURATIONS + + /** + * @var string Override Facebook graph domain + * Example: try hitting beta.facebook.com + */ + 'graph_base_domain' => '', + + /** + * @var string Disable SSL verification between CA and host + * [Security] Do not change this unless you trust your network + */ + 'skip_ssl_verification' => false, + + /** + * @var string Filepath to which cUrl shell equivalents will be dumped + * Tip: access std streams with 'php://stdout' or 'php://stderr' + */ + 'curl_logger' => '', + + // OPTIONAL SECONDARY ENTITIES + // Do not set the same as primary. May incurr in lost permissions. + + /** + * @var string Ausiliary Business ID for permissions and sharing testing + */ + 'secondary_business_id' => '', + + /** + * @var string Ausiliary Account ID for permissions and sharing testing + */ + 'secondary_account_id' => '', + + /** + * @var string Ausiliary Page ID for permissions and sharing testing + */ + 'secondary_page_id' => '', + + /** + * @var string Ausiliary Page ID for permissions and sharing testing + */ + 'secondary_app_id' => '', +); diff --git a/vendor/facebook/php-business-sdk/test/init_integration.php b/vendor/facebook/php-business-sdk/test/init_integration.php new file mode 100644 index 00000000..ca29caec --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/init_integration.php @@ -0,0 +1,38 @@ +init(); + +return $bootstrap; diff --git a/vendor/facebook/php-business-sdk/test/init_unit.php b/vendor/facebook/php-business-sdk/test/init_unit.php new file mode 100644 index 00000000..8f05dee5 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/init_unit.php @@ -0,0 +1,36 @@ +init(); + +return $bootstrap; diff --git a/vendor/facebook/php-business-sdk/test/misc/image.png b/vendor/facebook/php-business-sdk/test/misc/image.png new file mode 100755 index 0000000000000000000000000000000000000000..0a38fad8a6a6322e1140bda0a49c38c9c69223df GIT binary patch literal 6620 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 NzP9nxswXeP{|Cb?_o)B? literal 0 HcmV?d00001 diff --git a/vendor/facebook/php-business-sdk/test/misc/images.zip b/vendor/facebook/php-business-sdk/test/misc/images.zip new file mode 100644 index 0000000000000000000000000000000000000000..d818e94e83db5a82d8bd9f9247ac2105adbcd91f GIT binary patch literal 12706 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 D7Tn$j literal 0 HcmV?d00001 diff --git a/vendor/facebook/php-business-sdk/test/misc/video.mp4 b/vendor/facebook/php-business-sdk/test/misc/video.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ec25a81e68167c05e8c5d1d7c2599e108e39d3cb GIT binary patch literal 175019 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 bx3T + + + ./FacebookAdsTest + ./FacebookAdsTest/Object + + + + + + + + + ../src + + ../src/FacebookAds/Http/Adapter/Curl/ + ../src/FacebookAds/Object/ + + + + diff --git a/vendor/facebook/php-business-sdk/test/phpunit.xml b/vendor/facebook/php-business-sdk/test/phpunit.xml new file mode 100644 index 00000000..17791d70 --- /dev/null +++ b/vendor/facebook/php-business-sdk/test/phpunit.xml @@ -0,0 +1,16 @@ + + + + ./FacebookAdsTest + + + + + + + + + ../src + + + diff --git a/vendor/firebase/php-jwt/README.md b/vendor/firebase/php-jwt/README.md index b1a7a3a2..9c8b5455 100644 --- a/vendor/firebase/php-jwt/README.md +++ b/vendor/firebase/php-jwt/README.md @@ -23,7 +23,7 @@ Example use \Firebase\JWT\JWT; $key = "example_key"; -$token = array( +$payload = array( "iss" => "http://example.org", "aud" => "http://example.com", "iat" => 1356999524, @@ -36,7 +36,7 @@ $token = array( * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40 * for a list of spec-compliant algorithms. */ -$jwt = JWT::encode($token, $key); +$jwt = JWT::encode($payload, $key); $decoded = JWT::decode($jwt, $key, array('HS256')); print_r($decoded); @@ -93,14 +93,14 @@ ehde/zUxo6UvS7UrBQIDAQAB -----END PUBLIC KEY----- EOD; -$token = array( +$payload = array( "iss" => "example.org", "aud" => "example.com", "iat" => 1356999524, "nbf" => 1357000000 ); -$jwt = JWT::encode($token, $privateKey, 'RS256'); +$jwt = JWT::encode($payload, $privateKey, 'RS256'); echo "Encode:\n" . print_r($jwt, true) . "\n"; $decoded = JWT::decode($jwt, $publicKey, array('RS256')); diff --git a/vendor/firebase/php-jwt/composer.json b/vendor/firebase/php-jwt/composer.json index b76ffd19..25d1cfa9 100644 --- a/vendor/firebase/php-jwt/composer.json +++ b/vendor/firebase/php-jwt/composer.json @@ -2,6 +2,10 @@ "name": "firebase/php-jwt", "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "php", + "jwt" + ], "authors": [ { "name": "Neuman Vong", @@ -24,6 +28,6 @@ } }, "require-dev": { - "phpunit/phpunit": " 4.8.35" + "phpunit/phpunit": ">=4.8 <=9" } } diff --git a/vendor/firebase/php-jwt/src/BeforeValidException.php b/vendor/firebase/php-jwt/src/BeforeValidException.php index a6ee2f7c..fdf82bd9 100644 --- a/vendor/firebase/php-jwt/src/BeforeValidException.php +++ b/vendor/firebase/php-jwt/src/BeforeValidException.php @@ -3,5 +3,4 @@ class BeforeValidException extends \UnexpectedValueException { - } diff --git a/vendor/firebase/php-jwt/src/ExpiredException.php b/vendor/firebase/php-jwt/src/ExpiredException.php index 3597370a..7f7d0568 100644 --- a/vendor/firebase/php-jwt/src/ExpiredException.php +++ b/vendor/firebase/php-jwt/src/ExpiredException.php @@ -3,5 +3,4 @@ class ExpiredException extends \UnexpectedValueException { - } diff --git a/vendor/firebase/php-jwt/src/JWK.php b/vendor/firebase/php-jwt/src/JWK.php new file mode 100644 index 00000000..1d273917 --- /dev/null +++ b/vendor/firebase/php-jwt/src/JWK.php @@ -0,0 +1,171 @@ + + * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD + * @link https://github.com/firebase/php-jwt + */ +class JWK +{ + /** + * Parse a set of JWK keys + * + * @param array $jwks The JSON Web Key Set as an associative array + * + * @return array An associative array that represents the set of keys + * + * @throws InvalidArgumentException Provided JWK Set is empty + * @throws UnexpectedValueException Provided JWK Set was invalid + * @throws DomainException OpenSSL failure + * + * @uses parseKey + */ + public static function parseKeySet(array $jwks) + { + $keys = array(); + + if (!isset($jwks['keys'])) { + throw new UnexpectedValueException('"keys" member must exist in the JWK Set'); + } + if (empty($jwks['keys'])) { + throw new InvalidArgumentException('JWK Set did not contain any keys'); + } + + foreach ($jwks['keys'] as $k => $v) { + $kid = isset($v['kid']) ? $v['kid'] : $k; + if ($key = self::parseKey($v)) { + $keys[$kid] = $key; + } + } + + if (0 === \count($keys)) { + throw new UnexpectedValueException('No supported algorithms found in JWK Set'); + } + + return $keys; + } + + /** + * Parse a JWK key + * + * @param array $jwk An individual JWK + * + * @return resource|array An associative array that represents the key + * + * @throws InvalidArgumentException Provided JWK is empty + * @throws UnexpectedValueException Provided JWK was invalid + * @throws DomainException OpenSSL failure + * + * @uses createPemFromModulusAndExponent + */ + private static function parseKey(array $jwk) + { + if (empty($jwk)) { + throw new InvalidArgumentException('JWK must not be empty'); + } + if (!isset($jwk['kty'])) { + throw new UnexpectedValueException('JWK must contain a "kty" parameter'); + } + + switch ($jwk['kty']) { + case 'RSA': + if (\array_key_exists('d', $jwk)) { + throw new UnexpectedValueException('RSA private keys are not supported'); + } + if (!isset($jwk['n']) || !isset($jwk['e'])) { + throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"'); + } + + $pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']); + $publicKey = \openssl_pkey_get_public($pem); + if (false === $publicKey) { + throw new DomainException( + 'OpenSSL error: ' . \openssl_error_string() + ); + } + return $publicKey; + default: + // Currently only RSA is supported + break; + } + } + + /** + * Create a public key represented in PEM format from RSA modulus and exponent information + * + * @param string $n The RSA modulus encoded in Base64 + * @param string $e The RSA exponent encoded in Base64 + * + * @return string The RSA public key represented in PEM format + * + * @uses encodeLength + */ + private static function createPemFromModulusAndExponent($n, $e) + { + $modulus = JWT::urlsafeB64Decode($n); + $publicExponent = JWT::urlsafeB64Decode($e); + + $components = array( + 'modulus' => \pack('Ca*a*', 2, self::encodeLength(\strlen($modulus)), $modulus), + 'publicExponent' => \pack('Ca*a*', 2, self::encodeLength(\strlen($publicExponent)), $publicExponent) + ); + + $rsaPublicKey = \pack( + 'Ca*a*a*', + 48, + self::encodeLength(\strlen($components['modulus']) + \strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. + $rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $rsaPublicKey = \chr(0) . $rsaPublicKey; + $rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey; + + $rsaPublicKey = \pack( + 'Ca*a*', + 48, + self::encodeLength(\strlen($rsaOID . $rsaPublicKey)), + $rsaOID . $rsaPublicKey + ); + + $rsaPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + \chunk_split(\base64_encode($rsaPublicKey), 64) . + '-----END PUBLIC KEY-----'; + + return $rsaPublicKey; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @param int $length + * @return string + */ + private static function encodeLength($length) + { + if ($length <= 0x7F) { + return \chr($length); + } + + $temp = \ltrim(\pack('N', $length), \chr(0)); + + return \pack('Ca*', 0x80 | \strlen($temp), $temp); + } +} diff --git a/vendor/firebase/php-jwt/src/JWT.php b/vendor/firebase/php-jwt/src/JWT.php index 22a67e32..4860028b 100644 --- a/vendor/firebase/php-jwt/src/JWT.php +++ b/vendor/firebase/php-jwt/src/JWT.php @@ -1,6 +1,7 @@ array('openssl', 'SHA256'), 'HS256' => array('hash_hmac', 'SHA256'), - 'HS512' => array('hash_hmac', 'SHA512'), 'HS384' => array('hash_hmac', 'SHA384'), + 'HS512' => array('hash_hmac', 'SHA512'), 'RS256' => array('openssl', 'SHA256'), 'RS384' => array('openssl', 'SHA384'), 'RS512' => array('openssl', 'SHA512'), @@ -49,11 +54,11 @@ class JWT /** * Decodes a JWT string into a PHP object. * - * @param string $jwt The JWT - * @param string|array $key The key, or map of keys. - * If the algorithm used is asymmetric, this is the public key - * @param array $allowed_algs List of supported verification algorithms - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * @param string $jwt The JWT + * @param string|array|resource $key The key, or map of keys. + * If the algorithm used is asymmetric, this is the public key + * @param array $allowed_algs List of supported verification algorithms + * Supported algorithms are 'ES256', 'HS256', 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * * @return object The JWT's payload as a PHP object * @@ -68,13 +73,13 @@ class JWT */ public static function decode($jwt, $key, array $allowed_algs = array()) { - $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp; + $timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp; if (empty($key)) { throw new InvalidArgumentException('Key may not be empty'); } - $tks = explode('.', $jwt); - if (count($tks) != 3) { + $tks = \explode('.', $jwt); + if (\count($tks) != 3) { throw new UnexpectedValueException('Wrong number of segments'); } list($headb64, $bodyb64, $cryptob64) = $tks; @@ -93,10 +98,15 @@ public static function decode($jwt, $key, array $allowed_algs = array()) if (empty(static::$supported_algs[$header->alg])) { throw new UnexpectedValueException('Algorithm not supported'); } - if (!in_array($header->alg, $allowed_algs)) { + if (!\in_array($header->alg, $allowed_algs)) { throw new UnexpectedValueException('Algorithm not allowed'); } - if (is_array($key) || $key instanceof \ArrayAccess) { + if ($header->alg === 'ES256') { + // OpenSSL expects an ASN.1 DER sequence for ES256 signatures + $sig = self::signatureToDER($sig); + } + + if (\is_array($key) || $key instanceof \ArrayAccess) { if (isset($header->kid)) { if (!isset($key[$header->kid])) { throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key'); @@ -112,11 +122,11 @@ public static function decode($jwt, $key, array $allowed_algs = array()) throw new SignatureInvalidException('Signature verification failed'); } - // Check if the nbf if it is defined. This is the time that the + // Check the nbf if it is defined. This is the time that the // token can actually be used. If it's not yet that time, abort. if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) { throw new BeforeValidException( - 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf) + 'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf) ); } @@ -125,7 +135,7 @@ public static function decode($jwt, $key, array $allowed_algs = array()) // correctly used the nbf claim). if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) { throw new BeforeValidException( - 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat) + 'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat) ); } @@ -144,7 +154,7 @@ public static function decode($jwt, $key, array $allowed_algs = array()) * @param string $key The secret key. * If the algorithm used is asymmetric, this is the private key * @param string $alg The signing algorithm. - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * Supported algorithms are 'ES256', 'HS256', 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * @param mixed $keyId * @param array $head An array with header elements to attach * @@ -159,18 +169,18 @@ public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $he if ($keyId !== null) { $header['kid'] = $keyId; } - if ( isset($head) && is_array($head) ) { - $header = array_merge($head, $header); + if (isset($head) && \is_array($head)) { + $header = \array_merge($head, $header); } $segments = array(); $segments[] = static::urlsafeB64Encode(static::jsonEncode($header)); $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload)); - $signing_input = implode('.', $segments); + $signing_input = \implode('.', $segments); $signature = static::sign($signing_input, $key, $alg); $segments[] = static::urlsafeB64Encode($signature); - return implode('.', $segments); + return \implode('.', $segments); } /** @@ -179,7 +189,7 @@ public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $he * @param string $msg The message to sign * @param string|resource $key The secret key * @param string $alg The signing algorithm. - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * Supported algorithms are 'ES256', 'HS256', 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * * @return string An encrypted message * @@ -191,15 +201,18 @@ public static function sign($msg, $key, $alg = 'HS256') throw new DomainException('Algorithm not supported'); } list($function, $algorithm) = static::$supported_algs[$alg]; - switch($function) { + switch ($function) { case 'hash_hmac': - return hash_hmac($algorithm, $msg, $key, true); + return \hash_hmac($algorithm, $msg, $key, true); case 'openssl': $signature = ''; - $success = openssl_sign($msg, $signature, $key, $algorithm); + $success = \openssl_sign($msg, $signature, $key, $algorithm); if (!$success) { throw new DomainException("OpenSSL unable to sign data"); } else { + if ($alg === 'ES256') { + $signature = self::signatureFromDER($signature, 256); + } return $signature; } } @@ -225,9 +238,9 @@ private static function verify($msg, $signature, $key, $alg) } list($function, $algorithm) = static::$supported_algs[$alg]; - switch($function) { + switch ($function) { case 'openssl': - $success = openssl_verify($msg, $signature, $key, $algorithm); + $success = \openssl_verify($msg, $signature, $key, $algorithm); if ($success === 1) { return true; } elseif ($success === 0) { @@ -235,19 +248,19 @@ private static function verify($msg, $signature, $key, $alg) } // returns 1 on success, 0 on failure, -1 on error. throw new DomainException( - 'OpenSSL error: ' . openssl_error_string() + 'OpenSSL error: ' . \openssl_error_string() ); case 'hash_hmac': default: - $hash = hash_hmac($algorithm, $msg, $key, true); - if (function_exists('hash_equals')) { - return hash_equals($signature, $hash); + $hash = \hash_hmac($algorithm, $msg, $key, true); + if (\function_exists('hash_equals')) { + return \hash_equals($signature, $hash); } - $len = min(static::safeStrlen($signature), static::safeStrlen($hash)); + $len = \min(static::safeStrlen($signature), static::safeStrlen($hash)); $status = 0; for ($i = 0; $i < $len; $i++) { - $status |= (ord($signature[$i]) ^ ord($hash[$i])); + $status |= (\ord($signature[$i]) ^ \ord($hash[$i])); } $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash)); @@ -266,23 +279,23 @@ private static function verify($msg, $signature, $key, $alg) */ public static function jsonDecode($input) { - if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) { + if (\version_compare(PHP_VERSION, '5.4.0', '>=') && !(\defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) { /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you * to specify that large ints (like Steam Transaction IDs) should be treated as * strings, rather than the PHP default behaviour of converting them to floats. */ - $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING); + $obj = \json_decode($input, false, 512, JSON_BIGINT_AS_STRING); } else { /** Not all servers will support that, however, so for older versions we must * manually detect large ints in the JSON string and quote them (thus converting *them to strings) before decoding, hence the preg_replace() call. */ - $max_int_length = strlen((string) PHP_INT_MAX) - 1; - $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input); - $obj = json_decode($json_without_bigints); + $max_int_length = \strlen((string) PHP_INT_MAX) - 1; + $json_without_bigints = \preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input); + $obj = \json_decode($json_without_bigints); } - if (function_exists('json_last_error') && $errno = json_last_error()) { + if ($errno = \json_last_error()) { static::handleJsonError($errno); } elseif ($obj === null && $input !== 'null') { throw new DomainException('Null result with non-null input'); @@ -301,8 +314,8 @@ public static function jsonDecode($input) */ public static function jsonEncode($input) { - $json = json_encode($input); - if (function_exists('json_last_error') && $errno = json_last_error()) { + $json = \json_encode($input); + if ($errno = \json_last_error()) { static::handleJsonError($errno); } elseif ($json === 'null' && $input !== null) { throw new DomainException('Null result with non-null input'); @@ -319,12 +332,12 @@ public static function jsonEncode($input) */ public static function urlsafeB64Decode($input) { - $remainder = strlen($input) % 4; + $remainder = \strlen($input) % 4; if ($remainder) { $padlen = 4 - $remainder; - $input .= str_repeat('=', $padlen); + $input .= \str_repeat('=', $padlen); } - return base64_decode(strtr($input, '-_', '+/')); + return \base64_decode(\strtr($input, '-_', '+/')); } /** @@ -336,7 +349,7 @@ public static function urlsafeB64Decode($input) */ public static function urlsafeB64Encode($input) { - return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); + return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_')); } /** @@ -365,15 +378,135 @@ private static function handleJsonError($errno) /** * Get the number of bytes in cryptographic strings. * - * @param string + * @param string $str * * @return int */ private static function safeStrlen($str) { - if (function_exists('mb_strlen')) { - return mb_strlen($str, '8bit'); + if (\function_exists('mb_strlen')) { + return \mb_strlen($str, '8bit'); } - return strlen($str); + return \strlen($str); + } + + /** + * Convert an ECDSA signature to an ASN.1 DER sequence + * + * @param string $sig The ECDSA signature to convert + * @return string The encoded DER object + */ + private static function signatureToDER($sig) + { + // Separate the signature into r-value and s-value + list($r, $s) = \str_split($sig, (int) (\strlen($sig) / 2)); + + // Trim leading zeros + $r = \ltrim($r, "\x00"); + $s = \ltrim($s, "\x00"); + + // Convert r-value and s-value from unsigned big-endian integers to + // signed two's complement + if (\ord($r[0]) > 0x7f) { + $r = "\x00" . $r; + } + if (\ord($s[0]) > 0x7f) { + $s = "\x00" . $s; + } + + return self::encodeDER( + self::ASN1_SEQUENCE, + self::encodeDER(self::ASN1_INTEGER, $r) . + self::encodeDER(self::ASN1_INTEGER, $s) + ); + } + + /** + * Encodes a value into a DER object. + * + * @param int $type DER tag + * @param string $value the value to encode + * @return string the encoded object + */ + private static function encodeDER($type, $value) + { + $tag_header = 0; + if ($type === self::ASN1_SEQUENCE) { + $tag_header |= 0x20; + } + + // Type + $der = \chr($tag_header | $type); + + // Length + $der .= \chr(\strlen($value)); + + return $der . $value; + } + + /** + * Encodes signature from a DER object. + * + * @param string $der binary signature in DER format + * @param int $keySize the number of bits in the key + * @return string the signature + */ + private static function signatureFromDER($der, $keySize) + { + // OpenSSL returns the ECDSA signatures as a binary ASN.1 DER SEQUENCE + list($offset, $_) = self::readDER($der); + list($offset, $r) = self::readDER($der, $offset); + list($offset, $s) = self::readDER($der, $offset); + + // Convert r-value and s-value from signed two's compliment to unsigned + // big-endian integers + $r = \ltrim($r, "\x00"); + $s = \ltrim($s, "\x00"); + + // Pad out r and s so that they are $keySize bits long + $r = \str_pad($r, $keySize / 8, "\x00", STR_PAD_LEFT); + $s = \str_pad($s, $keySize / 8, "\x00", STR_PAD_LEFT); + + return $r . $s; + } + + /** + * Reads binary DER-encoded data and decodes into a single object + * + * @param string $der the binary data in DER format + * @param int $offset the offset of the data stream containing the object + * to decode + * @return array [$offset, $data] the new offset and the decoded object + */ + private static function readDER($der, $offset = 0) + { + $pos = $offset; + $size = \strlen($der); + $constructed = (\ord($der[$pos]) >> 5) & 0x01; + $type = \ord($der[$pos++]) & 0x1f; + + // Length + $len = \ord($der[$pos++]); + if ($len & 0x80) { + $n = $len & 0x1f; + $len = 0; + while ($n-- && $pos < $size) { + $len = ($len << 8) | \ord($der[$pos++]); + } + } + + // Value + if ($type == self::ASN1_BIT_STRING) { + $pos++; // Skip the first contents octet (padding indicator) + $data = \substr($der, $pos, $len - 1); + $pos += $len - 1; + } elseif (!$constructed) { + $data = \substr($der, $pos, $len); + $pos += $len; + } else { + $data = null; + } + + return array($pos, $data); } } diff --git a/vendor/firebase/php-jwt/src/SignatureInvalidException.php b/vendor/firebase/php-jwt/src/SignatureInvalidException.php index 27332b21..87cb34df 100644 --- a/vendor/firebase/php-jwt/src/SignatureInvalidException.php +++ b/vendor/firebase/php-jwt/src/SignatureInvalidException.php @@ -3,5 +3,4 @@ class SignatureInvalidException extends \UnexpectedValueException { - } diff --git a/vendor/google/auth/.editorconfig b/vendor/google/auth/.editorconfig deleted file mode 100644 index 6bc23e62..00000000 --- a/vendor/google/auth/.editorconfig +++ /dev/null @@ -1,18 +0,0 @@ -# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true -charset = utf-8 - -# Get rid of whitespace to avoid diffs with a bunch of EOL changes -trim_trailing_whitespace = true - -# Unix-style newlines with a newline ending every file -[*] -end_of_line = lf -insert_final_newline = true - -# PHP-Files -[*.php] -indent_style = space -indent_size = 4 diff --git a/vendor/google/auth/.gitignore b/vendor/google/auth/.gitignore deleted file mode 100644 index 1cb030a2..00000000 --- a/vendor/google/auth/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*~ -vendor -composer.lock diff --git a/vendor/google/auth/.php_cs b/vendor/google/auth/.php_cs deleted file mode 100644 index d5d4f5a5..00000000 --- a/vendor/google/auth/.php_cs +++ /dev/null @@ -1,54 +0,0 @@ -exclude('vendor') - ->in(__DIR__); - -// Return a Code Sniffing configuration using -// all sniffers needed for PSR-2 -// and additionally: -// - Remove leading slashes in use clauses. -// - PHP single-line arrays should not have trailing comma. -// - Single-line whitespace before closing semicolon are prohibited. -// - Remove unused use statements in the PHP source code -// - Ensure Concatenation to have at least one whitespace around -// - Remove trailing whitespace at the end of blank lines. -return Symfony\CS\Config\Config::create() - ->level(Symfony\CS\FixerInterface::PSR2_LEVEL) - ->fixers([ - 'remove_leading_slash_use', - 'single_array_no_trailing_comma', - 'spaces_before_semicolon', - 'unused_use', - 'concat_with_spaces', - 'whitespacy_lines', - 'ordered_use', - 'single_quote', - 'duplicate_semicolon', - 'extra_empty_lines', - 'phpdoc_no_package', - 'phpdoc_scalar', - 'no_empty_lines_after_phpdocs' - ]) - ->finder($finder); diff --git a/vendor/google/auth/.travis.yml b/vendor/google/auth/.travis.yml deleted file mode 100644 index 8c1b058a..00000000 --- a/vendor/google/auth/.travis.yml +++ /dev/null @@ -1,32 +0,0 @@ -language: php - -branches: - only: [master] - -sudo: false - -php: - - 5.4 - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - 7.2 - -env: - - - - COMPOSER_ARGS="--prefer-lowest" -matrix: - include: - - php: "7.2" - env: RUN_CS_FIXER=true - -before_script: - - composer update $COMPOSER_ARGS - -script: - - if [ "${RUN_CS_FIXER}" = "true" ]; then - vendor/bin/php-cs-fixer fix --dry-run --diff --config-file=.php_cs .; - else - vendor/bin/phpunit; - fi diff --git a/vendor/google/auth/CHANGELOG.md b/vendor/google/auth/CHANGELOG.md index de5f41e5..2a7be7fd 100644 --- a/vendor/google/auth/CHANGELOG.md +++ b/vendor/google/auth/CHANGELOG.md @@ -1,3 +1,140 @@ +## 1.14.3 (10/16/2020) + + * [fix]: add expires_at to GCECredentials (#314) + +## 1.14.2 (10/14/2020) + +* [fix]: Better FetchAuthTokenCache and getLastReceivedToken (#311) + +## 1.14.1 (10/05/2020) + +* [fix]: variable typo (#310) + +## 1.14.0 (10/02/2020) + +* [feat]: Add support for default scopes (#306) + +## 1.13.0 (9/18/2020) + +* [feat]: Add service account identity support to GCECredentials (#304) + +## 1.12.0 (8/31/2020) + +* [feat]: Add QuotaProject option to getMiddleware (#296) +* [feat]: Add caching for calls to GCECredentials::onGce (#301) +* [feat]: Add updateMetadata function to token cache (#298) +* [fix]: Use quota_project_id instead of quota_project (#299) + +## 1.11.1 (7/27/2020) + +* [fix]: catch ConnectException in GCE check (#294) +* [docs]: Adds [reference docs](https://googleapis.github.io/google-auth-library-php/master) + +## 1.11.0 (7/22/2020) + +* [feat]: Check cache expiration (#291) +* [fix]: OAuth2 cache key when audience is set (#291) + +## 1.10.0 (7/8/2020) + +* [feat]: Add support for Guzzle 7 (#256) +* [fix]: Remove SDK warning (#283) +* [chore]: Switch to github pages deploy action (#284) + +## 1.9.0 (5/14/2020) + +* [feat] Add quotaProject param for extensible client options support (#277) +* [feat] Add signingKeyId param for jwt signing (#270) +* [docs] Misc documentation improvements (#268, #278, #273) +* [chore] Switch from Travis to Github Actions (#273) + +## 1.8.0 (3/26/2020) + +* [feat] Add option to throw exception in AccessToken::verify(). (#265) +* [feat] Add support for x-goog-user-project. (#254) +* [feat] Add option to specify issuer in AccessToken::verify(). (#267) +* [feat] Add getProjectId to credentials types where project IDs can be determined. (#230) + +## 1.7.1 (02/12/2020) + +* [fix] Invalid character in iap cert cache key (#263) +* [fix] Typo in exception for package name (#262) + +## 1.7.0 (02/11/2020) + +* [feat] Add ID token to auth token methods. (#248) +* [feat] Add support for ES256 in `AccessToken::verify`. (#255) +* [fix] Let namespace match the file structure. (#258) +* [fix] Construct RuntimeException. (#257) +* [tests] Update tests for PHP 7.4 compatibility. (#253) +* [chore] Add a couple more things to `.gitattributes`. (#252) + +## 1.6.1 (10/29/2019) + +* [fix] Handle DST correctly for cache item expirations. (#246) + +## 1.6.0 (10/01/2019) + +* [feat] Add utility for verifying and revoking access tokens. (#243) +* [docs] Fix README console terminology. (#242) +* [feat] Support custom scopes with GCECredentials. (#239) +* [fix] Fix phpseclib existence check. (#237) + +## 1.5.2 (07/22/2019) + +* [fix] Move loadItems call out of `SysVCacheItemPool` constructor. (#229) +* [fix] Add `Metadata-Flavor` header to initial GCE metadata call. (#232) + +## 1.5.1 (04/16/2019) + +* [fix] Moved `getClientName()` from `Google\Auth\FetchAuthTokenInterface` + to `Google\Auth\SignBlobInterface`, and removed `getClientName()` from + `InsecureCredentials` and `UserRefreshCredentials`. (#223) + +## 1.5.0 (04/15/2019) + +### Changes + + * Add support for signing strings with a Credentials instance. (#221) + * [Docs] Describe the arrays returned by fetchAuthToken. (#216) + * [Testing] Fix failing tests (#217) + * Update GitHub issue templates (#214, #213) + +## 1.4.0 (09/17/2018) + +### Changes + + * Add support for insecure credentials (#208) + +## 1.3.3 (08/27/2018) + +### Changes + + * Add retry and increase timeout for GCE credentials (#195) + * [Docs] Fix spelling (#204) + * Update token url (#206) + +## 1.3.2 (07/23/2018) + +### Changes + + * Only emits a warning for gcloud credentials (#202) + +## 1.3.1 (07/19/2018) + +### Changes + + * Added a warning for 3 legged OAuth credentials (#199) + * [Code cleanup] Removed useless else after return (#193) + +## 1.3.0 (06/04/2018) + +### Changes + + * Fixes usage of deprecated env var for GAE Flex (#189) + * fix - guzzlehttp/psr7 dependency version definition (#190) + * Added SystemV shared memory based CacheItemPool (#191) + ## 1.2.1 (24/01/2018) ### Changes diff --git a/vendor/google/auth/CODE_OF_CONDUCT.md b/vendor/google/auth/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..46b2a08e --- /dev/null +++ b/vendor/google/auth/CODE_OF_CONDUCT.md @@ -0,0 +1,43 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, +and in the interest of fostering an open and welcoming community, +we pledge to respect all people who contribute through reporting issues, +posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project +a harassment-free experience for everyone, +regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, +such as physical or electronic +addresses, without explicit permission +* Other unethical or unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. +By adopting this Code of Conduct, +project maintainers commit themselves to fairly and consistently +applying these principles to every aspect of managing this project. +Project maintainers who do not follow or enforce the Code of Conduct +may be permanently removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior +may be reported by opening an issue +or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, +available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) diff --git a/vendor/google/auth/CONTRIBUTING.md b/vendor/google/auth/CONTRIBUTING.md deleted file mode 100644 index 0cfb74b6..00000000 --- a/vendor/google/auth/CONTRIBUTING.md +++ /dev/null @@ -1,73 +0,0 @@ -# How to become a contributor and submit your own code - -## Contributor License Agreements - -We'd love to accept your sample apps and patches! Before we can take them, we -have to jump a couple of legal hurdles. - -Please fill out either the individual or corporate Contributor License Agreement -(CLA). - - * If you are an individual writing original source code and you're sure you - own the intellectual property, then you'll need to sign an [individual CLA] - (http://code.google.com/legal/individual-cla-v1.0.html). - * If you work for a company that wants to allow you to contribute your work, - then you'll need to sign a [corporate CLA] - (http://code.google.com/legal/corporate-cla-v1.0.html). - -Follow either of the two links above to access the appropriate CLA and -instructions for how to sign and return it. Once we receive it, we'll be able to -accept your pull requests. - -## Issue reporting - -* Check that the issue has not already been reported. -* Check that the issue has not already been fixed in the latest code - (a.k.a. `master`). -* Be clear, concise and precise in your description of the problem. -* Open an issue with a descriptive title and a summary in grammatically correct, - complete sentences. -* Include any relevant code to the issue summary. - -## Pull requests - -* Read [how to properly contribute to open source projects on Github][2]. -* Fork the project. -* Use a topic/feature branch to easily amend a pull request later, if necessary. -* Write [good commit messages][3]. -* Use the same coding conventions as the rest of the project. -* Commit and push until you are happy with your contribution. -* Make sure to add tests for it. This is important so I don't break it - in a future version unintentionally. -* Add an entry to the [Changelog](CHANGELOG.md) accordingly. See [changelog entry format](#changelog-entry-format). -* Please try not to mess with the Rakefile, version, or history. If you want to - have your own version, or is otherwise necessary, that is fine, but please - isolate to its own commit so I can cherry-pick around it. -* Make sure the test suite is passing and the code you wrote doesn't produce - phpunit or phplint offenses. -* [Squash related commits together][5]. -* Open a [pull request][4] that relates to *only* one subject with a clear title - and description in grammatically correct, complete sentences. - -### Changelog entry format - -Here are a few examples: - -``` -* ADC Support for User Refresh Tokens (@tbetbetbe[]) -* [#16](https://github.com/google/google-auth-library-php/issues/16): ADC Support for User Refresh Tokens ([@tbetbetbe][]) -``` - -* Mark it up in [Markdown syntax][6]. -* The entry line should start with `* ` (an asterisk and a space). -* If the change has a related GitHub issue (e.g. a bug fix for a reported issue), put a link to the issue as `[#16](https://github.com/google/google-auth-library-php/issues/16): `. -* Describe the brief of the change. The sentence should end with a punctuation. -* At the end of the entry, add an implicit link to your GitHub user page as `([@username][])`. -* If this is your first contribution to google-auth-library-php project, add a link definition for the implicit link to the bottom of the changelog as `[@username]: https://github.com/username`. - -[1]: https://github.com/google/google-auth-php-library/issues -[2]: http://gun.io/blog/how-to-github-fork-branch-and-pull-request -[3]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html -[4]: https://help.github.com/articles/using-pull-requests -[5]: http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html -[6]: http://daringfireball.net/projects/markdown/syntax diff --git a/vendor/google/auth/README.md b/vendor/google/auth/README.md index d102382a..37f335a1 100644 --- a/vendor/google/auth/README.md +++ b/vendor/google/auth/README.md @@ -2,6 +2,7 @@

Homepage
http://www.github.com/google/google-auth-library-php
+
Reference Docs
https://googleapis.github.io/google-auth-library-php/master/
Authors
Tim Emiola
Stanley Cheung
@@ -47,7 +48,7 @@ you're building an application that uses Google Compute Engine. #### Download your Service Account Credentials JSON file To use `Application Default Credentials`, You first need to download a set of -JSON credentials for your project. Go to **APIs & Auth** > **Credentials** in +JSON credentials for your project. Go to **APIs & Services** > **Credentials** in the [Google Developers Console][developer console] and select **Service account** from the **Add credentials** dropdown. @@ -121,9 +122,85 @@ $client = new Client([ // create subscriber $subscriber = ApplicationDefaultCredentials::getSubscriber($scopes); $client->getEmitter()->attach($subscriber); +``` + +#### Call using an ID Token +If your application is running behind Cloud Run, or using Cloud Identity-Aware +Proxy (IAP), you will need to fetch an ID token to access your application. For +this, use the static method `getIdTokenMiddleware` on +`ApplicationDefaultCredentials`. + +```php +use Google\Auth\ApplicationDefaultCredentials; +use GuzzleHttp\Client; +use GuzzleHttp\HandlerStack; + +// specify the path to your application credentials +putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json'); + +// Provide the ID token audience. This can be a Client ID associated with an IAP application, +// Or the URL associated with a CloudRun App +// $targetAudience = 'IAP_CLIENT_ID.apps.googleusercontent.com'; +// $targetAudience = 'https://service-1234-uc.a.run.app'; +$targetAudience = 'YOUR_ID_TOKEN_AUDIENCE'; + +// create middleware +$middleware = ApplicationDefaultCredentials::getIdTokenMiddleware($targetAudience); +$stack = HandlerStack::create(); +$stack->push($middleware); + +// create the HTTP client +$client = new Client([ + 'handler' => $stack, + 'auth' => 'google_auth', + // Cloud Run, IAP, or custom resource URL + 'base_uri' => 'https://YOUR_PROTECTED_RESOURCE', +]); +// make the request +$response = $client->get('/'); + +// show the result! +print_r((string) $response->getBody()); ``` +For invoking Cloud Run services, your service account will need the +[`Cloud Run Invoker`](https://cloud.google.com/run/docs/authenticating/service-to-service) +IAM permission. + +For invoking Cloud Identity-Aware Proxy, you will need to pass the Client ID +used when you set up your protected resource as the target audience. See how to +[secure your IAP app with signed headers](https://cloud.google.com/iap/docs/signed-headers-howto). + +#### Verifying JWTs + +If you are [using Google ID tokens to authenticate users][google-id-tokens], use +the `Google\Auth\AccessToken` class to verify the ID token: + +```php +use Google\Auth\AccessToken; + +$auth = new AccessToken(); +$auth->verify($idToken); +``` + +If your app is running behind [Google Identity-Aware Proxy][iap-id-tokens] +(IAP), you can verify the ID token coming from the IAP server by pointing to the +appropriate certificate URL for IAP. This is because IAP signs the ID +tokens with a different key than the Google Identity service: + +```php +use Google\Auth\AccessToken; + +$auth = new AccessToken(); +$auth->verify($idToken, [ + 'certsLocation' => AccessToken::IAP_CERT_URL +]); +``` + +[google-id-tokens]: https://developers.google.com/identity/sign-in/web/backend-auth +[iap-id-tokens]: https://cloud.google.com/iap/docs/signed-headers-howto + ## License This library is licensed under Apache 2.0. Full license text is @@ -143,7 +220,7 @@ about the client or APIs on [StackOverflow](http://stackoverflow.com). [google-apis-php-client]: https://github.com/google/google-api-php-client [application default credentials]: https://developers.google.com/accounts/docs/application-default-credentials -[contributing]: https://github.com/google/google-auth-library-php/tree/master/CONTRIBUTING.md +[contributing]: https://github.com/google/google-auth-library-php/tree/master/.github/CONTRIBUTING.md [copying]: https://github.com/google/google-auth-library-php/tree/master/COPYING [Guzzle]: https://github.com/guzzle/guzzle [Guzzle 5]: http://docs.guzzlephp.org/en/5.3 diff --git a/vendor/google/auth/autoload.php b/vendor/google/auth/autoload.php index f5473378..1e13827f 100644 --- a/vendor/google/auth/autoload.php +++ b/vendor/google/auth/autoload.php @@ -23,7 +23,7 @@ function oauth2client_php_autoload($className) } if (count($classPath) > 3) { // Maximum class file path depth in this project is 3. - $classPath = array_slice($classPath, 0, 3); + $classPath = array_slice($classPath, 0, 3); } $filePath = dirname(__FILE__) . '/src/' . implode('/', $classPath) . '.php'; if (file_exists($filePath)) { diff --git a/vendor/google/auth/composer.json b/vendor/google/auth/composer.json index 0e136062..5205dc42 100644 --- a/vendor/google/auth/composer.json +++ b/vendor/google/auth/composer.json @@ -5,23 +5,36 @@ "keywords": ["google", "oauth2", "authentication"], "homepage": "http://github.com/google/google-auth-library-php", "license": "Apache-2.0", + "support": { + "docs": "https://googleapis.github.io/google-auth-library-php/master/" + }, "require": { "php": ">=5.4", "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "~5.3.1|~6.0", - "guzzlehttp/psr7": "~1.2", + "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", + "guzzlehttp/psr7": "^1.2", "psr/http-message": "^1.0", "psr/cache": "^1.0" }, "require-dev": { "guzzlehttp/promises": "0.1.1|^1.3", - "friendsofphp/php-cs-fixer": "^1.11", + "squizlabs/php_codesniffer": "^3.5", "phpunit/phpunit": "^4.8.36|^5.7", - "sebastian/comparator": ">=1.2.3" + "sebastian/comparator": ">=1.2.3", + "phpseclib/phpseclib": "^2", + "kelvinmo/simplejwt": "^0.2.5" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." }, "autoload": { "psr-4": { "Google\\Auth\\": "src" } + }, + "autoload-dev": { + "psr-4": { + "Google\\Auth\\Tests\\": "tests" + } } } diff --git a/vendor/google/auth/phpunit.xml.dist b/vendor/google/auth/phpunit.xml.dist deleted file mode 100644 index bace58bb..00000000 --- a/vendor/google/auth/phpunit.xml.dist +++ /dev/null @@ -1,16 +0,0 @@ - - - - - tests - - - - - src - - src/ - - - - diff --git a/vendor/google/auth/src/AccessToken.php b/vendor/google/auth/src/AccessToken.php new file mode 100644 index 00000000..1352e935 --- /dev/null +++ b/vendor/google/auth/src/AccessToken.php @@ -0,0 +1,479 @@ +httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + $this->cache = $cache ?: new MemoryCacheItemPool(); + } + + /** + * Verifies an id token and returns the authenticated apiLoginTicket. + * Throws an exception if the id token is not valid. + * The audience parameter can be used to control which id tokens are + * accepted. By default, the id token must have been issued to this OAuth2 client. + * + * @param string $token The JSON Web Token to be verified. + * @param array $options [optional] Configuration options. + * @param string $options.audience The indended recipient of the token. + * @param string $options.issuer The intended issuer of the token. + * @param string $options.cacheKey The cache key of the cached certs. Defaults to + * the sha1 of $certsLocation if provided, otherwise is set to + * "federated_signon_certs_v3". + * @param string $options.certsLocation The location (remote or local) from which + * to retrieve certificates, if not cached. This value should only be + * provided in limited circumstances in which you are sure of the + * behavior. + * @param bool $options.throwException Whether the function should throw an + * exception if the verification fails. This is useful for + * determining the reason verification failed. + * @return array|bool the token payload, if successful, or false if not. + * @throws InvalidArgumentException If certs could not be retrieved from a local file. + * @throws InvalidArgumentException If received certs are in an invalid format. + * @throws InvalidArgumentException If the cert alg is not supported. + * @throws RuntimeException If certs could not be retrieved from a remote location. + * @throws UnexpectedValueException If the token issuer does not match. + * @throws UnexpectedValueException If the token audience does not match. + */ + public function verify($token, array $options = []) + { + $audience = isset($options['audience']) + ? $options['audience'] + : null; + $issuer = isset($options['issuer']) + ? $options['issuer'] + : null; + $certsLocation = isset($options['certsLocation']) + ? $options['certsLocation'] + : self::FEDERATED_SIGNON_CERT_URL; + $cacheKey = isset($options['cacheKey']) + ? $options['cacheKey'] + : $this->getCacheKeyFromCertLocation($certsLocation); + $throwException = isset($options['throwException']) + ? $options['throwException'] + : false; // for backwards compatibility + + // Check signature against each available cert. + $certs = $this->getCerts($certsLocation, $cacheKey, $options); + $alg = $this->determineAlg($certs); + if (!in_array($alg, ['RS256', 'ES256'])) { + throw new InvalidArgumentException( + 'unrecognized "alg" in certs, expected ES256 or RS256' + ); + } + try { + if ($alg == 'RS256') { + return $this->verifyRs256($token, $certs, $audience, $issuer); + } + return $this->verifyEs256($token, $certs, $audience, $issuer); + } catch (ExpiredException $e) { // firebase/php-jwt 3+ + } catch (\ExpiredException $e) { // firebase/php-jwt 2 + } catch (SignatureInvalidException $e) { // firebase/php-jwt 3+ + } catch (\SignatureInvalidException $e) { // firebase/php-jwt 2 + } catch (InvalidTokenException $e) { // simplejwt + } catch (DomainException $e) { + } catch (InvalidArgumentException $e) { + } catch (UnexpectedValueException $e) { + } + + if ($throwException) { + throw $e; + } + + return false; + } + + /** + * Identifies the expected algorithm to verify by looking at the "alg" key + * of the provided certs. + * + * @param array $certs Certificate array according to the JWK spec (see + * https://tools.ietf.org/html/rfc7517). + * @return string The expected algorithm, such as "ES256" or "RS256". + */ + private function determineAlg(array $certs) + { + $alg = null; + foreach ($certs as $cert) { + if (empty($cert['alg'])) { + throw new InvalidArgumentException( + 'certs expects "alg" to be set' + ); + } + $alg = $alg ?: $cert['alg']; + + if ($alg != $cert['alg']) { + throw new InvalidArgumentException( + 'More than one alg detected in certs' + ); + } + } + return $alg; + } + + /** + * Verifies an ES256-signed JWT. + * + * @param string $token The JSON Web Token to be verified. + * @param array $certs Certificate array according to the JWK spec (see + * https://tools.ietf.org/html/rfc7517). + * @param string|null $audience If set, returns false if the provided + * audience does not match the "aud" claim on the JWT. + * @param string|null $issuer If set, returns false if the provided + * issuer does not match the "iss" claim on the JWT. + * @return array|bool the token payload, if successful, or false if not. + */ + private function verifyEs256($token, array $certs, $audience = null, $issuer = null) + { + $this->checkSimpleJwt(); + + $jwkset = new KeySet(); + foreach ($certs as $cert) { + $jwkset->add(KeyFactory::create($cert, 'php')); + } + + // Validate the signature using the key set and ES256 algorithm. + $jwt = $this->callSimpleJwtDecode([$token, $jwkset, 'ES256']); + $payload = $jwt->getClaims(); + + if (isset($payload['aud'])) { + if ($audience && $payload['aud'] != $audience) { + throw new UnexpectedValueException('Audience does not match'); + } + } + + // @see https://cloud.google.com/iap/docs/signed-headers-howto#verifying_the_jwt_payload + $issuer = $issuer ?: self::IAP_ISSUER; + if (!isset($payload['iss']) || $payload['iss'] !== $issuer) { + throw new UnexpectedValueException('Issuer does not match'); + } + + return $payload; + } + + /** + * Verifies an RS256-signed JWT. + * + * @param string $token The JSON Web Token to be verified. + * @param array $certs Certificate array according to the JWK spec (see + * https://tools.ietf.org/html/rfc7517). + * @param string|null $audience If set, returns false if the provided + * audience does not match the "aud" claim on the JWT. + * @param string|null $issuer If set, returns false if the provided + * issuer does not match the "iss" claim on the JWT. + * @return array|bool the token payload, if successful, or false if not. + */ + private function verifyRs256($token, array $certs, $audience = null, $issuer = null) + { + $this->checkAndInitializePhpsec(); + $keys = []; + foreach ($certs as $cert) { + if (empty($cert['kid'])) { + throw new InvalidArgumentException( + 'certs expects "kid" to be set' + ); + } + if (empty($cert['n']) || empty($cert['e'])) { + throw new InvalidArgumentException( + 'RSA certs expects "n" and "e" to be set' + ); + } + $rsa = new RSA(); + $rsa->loadKey([ + 'n' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [ + $cert['n'], + ]), 256), + 'e' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [ + $cert['e'] + ]), 256), + ]); + + // create an array of key IDs to certs for the JWT library + $keys[$cert['kid']] = $rsa->getPublicKey(); + } + + $payload = $this->callJwtStatic('decode', [ + $token, + $keys, + ['RS256'] + ]); + + if (property_exists($payload, 'aud')) { + if ($audience && $payload->aud != $audience) { + throw new UnexpectedValueException('Audience does not match'); + } + } + + // support HTTP and HTTPS issuers + // @see https://developers.google.com/identity/sign-in/web/backend-auth + $issuers = $issuer ? [$issuer] : [self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS]; + if (!isset($payload->iss) || !in_array($payload->iss, $issuers)) { + throw new UnexpectedValueException('Issuer does not match'); + } + + return (array) $payload; + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * + * @param string|array $token The token (access token or a refresh token) that should be revoked. + * @param array $options [optional] Configuration options. + * @return bool Returns True if the revocation was successful, otherwise False. + */ + public function revoke($token, array $options = []) + { + if (is_array($token)) { + if (isset($token['refresh_token'])) { + $token = $token['refresh_token']; + } else { + $token = $token['access_token']; + } + } + + $body = Psr7\stream_for(http_build_query(['token' => $token])); + $request = new Request('POST', self::OAUTH2_REVOKE_URI, [ + 'Cache-Control' => 'no-store', + 'Content-Type' => 'application/x-www-form-urlencoded', + ], $body); + + $httpHandler = $this->httpHandler; + + $response = $httpHandler($request, $options); + + return $response->getStatusCode() == 200; + } + + /** + * Gets federated sign-on certificates to use for verifying identity tokens. + * Returns certs as array structure, where keys are key ids, and values + * are PEM encoded certificates. + * + * @param string $location The location from which to retrieve certs. + * @param string $cacheKey The key under which to cache the retrieved certs. + * @param array $options [optional] Configuration options. + * @return array + * @throws InvalidArgumentException If received certs are in an invalid format. + */ + private function getCerts($location, $cacheKey, array $options = []) + { + $cacheItem = $this->cache->getItem($cacheKey); + $certs = $cacheItem ? $cacheItem->get() : null; + + $gotNewCerts = false; + if (!$certs) { + $certs = $this->retrieveCertsFromLocation($location, $options); + + $gotNewCerts = true; + } + + if (!isset($certs['keys'])) { + if ($location !== self::IAP_CERT_URL) { + throw new InvalidArgumentException( + 'federated sign-on certs expects "keys" to be set' + ); + } + throw new InvalidArgumentException( + 'certs expects "keys" to be set' + ); + } + + // Push caching off until after verifying certs are in a valid format. + // Don't want to cache bad data. + if ($gotNewCerts) { + $cacheItem->expiresAt(new DateTime('+1 hour')); + $cacheItem->set($certs); + $this->cache->save($cacheItem); + } + + return $certs['keys']; + } + + /** + * Retrieve and cache a certificates file. + * + * @param $url string location + * @param array $options [optional] Configuration options. + * @return array certificates + * @throws InvalidArgumentException If certs could not be retrieved from a local file. + * @throws RuntimeException If certs could not be retrieved from a remote location. + */ + private function retrieveCertsFromLocation($url, array $options = []) + { + // If we're retrieving a local file, just grab it. + if (strpos($url, 'http') !== 0) { + if (!file_exists($url)) { + throw new InvalidArgumentException(sprintf( + 'Failed to retrieve verification certificates from path: %s.', + $url + )); + } + + return json_decode(file_get_contents($url), true); + } + + $httpHandler = $this->httpHandler; + $response = $httpHandler(new Request('GET', $url), $options); + + if ($response->getStatusCode() == 200) { + return json_decode((string) $response->getBody(), true); + } + + throw new RuntimeException(sprintf( + 'Failed to retrieve verification certificates: "%s".', + $response->getBody()->getContents() + ), $response->getStatusCode()); + } + + private function checkAndInitializePhpsec() + { + // @codeCoverageIgnoreStart + if (!class_exists('phpseclib\Crypt\RSA')) { + throw new RuntimeException('Please require phpseclib/phpseclib v2 to use this utility.'); + } + // @codeCoverageIgnoreEnd + + $this->setPhpsecConstants(); + } + + private function checkSimpleJwt() + { + // @codeCoverageIgnoreStart + if (!class_exists('SimpleJWT\JWT')) { + throw new RuntimeException('Please require kelvinmo/simplejwt ^0.2 to use this utility.'); + } + // @codeCoverageIgnoreEnd + } + + /** + * phpseclib calls "phpinfo" by default, which requires special + * whitelisting in the AppEngine VM environment. This function + * sets constants to bypass the need for phpseclib to check phpinfo + * + * @see phpseclib/Math/BigInteger + * @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85 + * @codeCoverageIgnore + */ + private function setPhpsecConstants() + { + if (filter_var(getenv('GAE_VM'), FILTER_VALIDATE_BOOLEAN)) { + if (!defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + } + if (!defined('CRYPT_RSA_MODE')) { + define('CRYPT_RSA_MODE', RSA::MODE_OPENSSL); + } + } + } + + /** + * Provide a hook to mock calls to the JWT static methods. + * + * @param string $method + * @param array $args + * @return mixed + */ + protected function callJwtStatic($method, array $args = []) + { + $class = class_exists('Firebase\JWT\JWT') + ? 'Firebase\JWT\JWT' + : 'JWT'; + return call_user_func_array([$class, $method], $args); + } + + /** + * Provide a hook to mock calls to the JWT static methods. + * + * @param array $args + * @return mixed + */ + protected function callSimpleJwtDecode(array $args = []) + { + return call_user_func_array(['SimpleJWT\JWT', 'decode'], $args); + } + + /** + * Generate a cache key based on the cert location using sha1 with the + * exception of using "federated_signon_certs_v3" to preserve BC. + * + * @param string $certsLocation + * @return string + */ + private function getCacheKeyFromCertLocation($certsLocation) + { + $key = $certsLocation === self::FEDERATED_SIGNON_CERT_URL + ? 'federated_signon_certs_v3' + : sha1($certsLocation); + + return 'google_auth_certs_cache|' . $key; + } +} diff --git a/vendor/google/auth/src/ApplicationDefaultCredentials.php b/vendor/google/auth/src/ApplicationDefaultCredentials.php index 6465bdcb..6e04c3c3 100644 --- a/vendor/google/auth/src/ApplicationDefaultCredentials.php +++ b/vendor/google/auth/src/ApplicationDefaultCredentials.php @@ -20,8 +20,13 @@ use DomainException; use Google\Auth\Credentials\AppIdentityCredentials; use Google\Auth\Credentials\GCECredentials; +use Google\Auth\Credentials\ServiceAccountCredentials; +use Google\Auth\HttpHandler\HttpClientCache; +use Google\Auth\HttpHandler\HttpHandlerFactory; use Google\Auth\Middleware\AuthTokenMiddleware; use Google\Auth\Subscriber\AuthTokenSubscriber; +use GuzzleHttp\Client; +use InvalidArgumentException; use Psr\Cache\CacheItemPoolInterface; /** @@ -41,23 +46,25 @@ * * This allows it to be used as follows with GuzzleHttp\Client: * - * use Google\Auth\ApplicationDefaultCredentials; - * use GuzzleHttp\Client; - * use GuzzleHttp\HandlerStack; + * ``` + * use Google\Auth\ApplicationDefaultCredentials; + * use GuzzleHttp\Client; + * use GuzzleHttp\HandlerStack; * - * $middleware = ApplicationDefaultCredentials::getMiddleware( - * 'https://www.googleapis.com/auth/taskqueue' - * ); - * $stack = HandlerStack::create(); - * $stack->push($middleware); + * $middleware = ApplicationDefaultCredentials::getMiddleware( + * 'https://www.googleapis.com/auth/taskqueue' + * ); + * $stack = HandlerStack::create(); + * $stack->push($middleware); * - * $client = new Client([ - * 'handler' => $stack, - * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', - * 'auth' => 'google_auth' // authorize all requests - * ]); + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'auth' => 'google_auth' // authorize all requests + * ]); * - * $res = $client->get('myproject/taskqueues/myqueue'); + * $res = $client->get('myproject/taskqueues/myqueue'); + * ``` */ class ApplicationDefaultCredentials { @@ -69,13 +76,12 @@ class ApplicationDefaultCredentials * this does not fallback to the compute engine defaults. * * @param string|array scope the scope of the access request, expressed - * either as an Array or as a space-delimited String. + * either as an Array or as a space-delimited String. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present - * @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface - * + * @param CacheItemPoolInterface $cache A cache implementation, may be + * provided if you have one already available for use. * @return AuthTokenSubscriber - * * @throws DomainException if no implementation can be obtained. */ public static function getSubscriber( @@ -97,63 +103,177 @@ public static function getSubscriber( * this does not fallback to the compute engine defaults. * * @param string|array scope the scope of the access request, expressed - * either as an Array or as a space-delimited String. + * either as an Array or as a space-delimited String. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present - * @param CacheItemPoolInterface $cache - * + * @param CacheItemPoolInterface $cache A cache implementation, may be + * provided if you have one already available for use. + * @param string $quotaProject specifies a project to bill for access + * charges associated with the request. * @return AuthTokenMiddleware - * * @throws DomainException if no implementation can be obtained. */ public static function getMiddleware( $scope = null, callable $httpHandler = null, array $cacheConfig = null, - CacheItemPoolInterface $cache = null + CacheItemPoolInterface $cache = null, + $quotaProject = null ) { - $creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache); + $creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache, $quotaProject); return new AuthTokenMiddleware($creds, $httpHandler); } /** - * Obtains the default FetchAuthTokenInterface implementation to use - * in this environment. + * Obtains an AuthTokenMiddleware which will fetch an access token to use in + * the Authorization header. The middleware is configured with the default + * FetchAuthTokenInterface implementation to use in this environment. * * If supplied, $scope is used to in creating the credentials instance if * this does not fallback to the Compute Engine defaults. * - * @param string|array scope the scope of the access request, expressed - * either as an Array or as a space-delimited String. + * @param string|array $scope the scope of the access request, expressed + * either as an Array or as a space-delimited String. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present - * @param CacheItemPoolInterface $cache + * @param CacheItemPoolInterface $cache A cache implementation, may be + * provided if you have one already available for use. + * @param string $quotaProject specifies a project to bill for access + * charges associated with the request. + * @param string|array $defaultScope The default scope to use if no + * user-defined scopes exist, expressed either as an Array or as a + * space-delimited string. * * @return CredentialsLoader - * * @throws DomainException if no implementation can be obtained. */ public static function getCredentials( $scope = null, callable $httpHandler = null, array $cacheConfig = null, - CacheItemPoolInterface $cache = null + CacheItemPoolInterface $cache = null, + $quotaProject = null, + $defaultScope = null ) { $creds = null; $jsonKey = CredentialsLoader::fromEnv() ?: CredentialsLoader::fromWellKnownFile(); + $anyScope = $scope ?: $defaultScope; + + if (!$httpHandler) { + if (!($client = HttpClientCache::getHttpClient())) { + $client = new Client(); + HttpClientCache::setHttpClient($client); + } + + $httpHandler = HttpHandlerFactory::build($client); + } if (!is_null($jsonKey)) { - $creds = CredentialsLoader::makeCredentials($scope, $jsonKey); + if ($quotaProject) { + $jsonKey['quota_project_id'] = $quotaProject; + } + $creds = CredentialsLoader::makeCredentials( + $scope, + $jsonKey, + $defaultScope + ); } elseif (AppIdentityCredentials::onAppEngine() && !GCECredentials::onAppEngineFlexible()) { - $creds = new AppIdentityCredentials($scope); - } elseif (GCECredentials::onGce($httpHandler)) { - $creds = new GCECredentials(); + $creds = new AppIdentityCredentials($anyScope); + } elseif (self::onGce($httpHandler, $cacheConfig, $cache)) { + $creds = new GCECredentials(null, $anyScope, null, $quotaProject); + } + + if (is_null($creds)) { + throw new DomainException(self::notFound()); + } + if (!is_null($cache)) { + $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache); + } + return $creds; + } + + /** + * Obtains an AuthTokenMiddleware which will fetch an ID token to use in the + * Authorization header. The middleware is configured with the default + * FetchAuthTokenInterface implementation to use in this environment. + * + * If supplied, $targetAudience is used to set the "aud" on the resulting + * ID token. + * + * @param string $targetAudience The audience for the ID token. + * @param callable $httpHandler callback which delivers psr7 request + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache A cache implementation, may be + * provided if you have one already available for use. + * @return AuthTokenMiddleware + * @throws DomainException if no implementation can be obtained. + */ + public static function getIdTokenMiddleware( + $targetAudience, + callable $httpHandler = null, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache); + + return new AuthTokenMiddleware($creds, $httpHandler); + } + + /** + * Obtains the default FetchAuthTokenInterface implementation to use + * in this environment, configured with a $targetAudience for fetching an ID + * token. + * + * @param string $targetAudience The audience for the ID token. + * @param callable $httpHandler callback which delivers psr7 request + * @param array $cacheConfig configuration for the cache when it's present + * @param CacheItemPoolInterface $cache A cache implementation, may be + * provided if you have one already available for use. + * @return CredentialsLoader + * @throws DomainException if no implementation can be obtained. + * @throws InvalidArgumentException if JSON "type" key is invalid + */ + public static function getIdTokenCredentials( + $targetAudience, + callable $httpHandler = null, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $creds = null; + $jsonKey = CredentialsLoader::fromEnv() + ?: CredentialsLoader::fromWellKnownFile(); + + if (!$httpHandler) { + if (!($client = HttpClientCache::getHttpClient())) { + $client = new Client(); + HttpClientCache::setHttpClient($client); + } + + $httpHandler = HttpHandlerFactory::build($client); + } + + if (!is_null($jsonKey)) { + if (!array_key_exists('type', $jsonKey)) { + throw new \InvalidArgumentException('json key is missing the type field'); + } + + if ($jsonKey['type'] == 'authorized_user') { + throw new InvalidArgumentException('ID tokens are not supported for end user credentials'); + } + + if ($jsonKey['type'] != 'service_account') { + throw new InvalidArgumentException('invalid value in the type field'); + } + + $creds = new ServiceAccountCredentials(null, $jsonKey, null, $targetAudience); + } elseif (self::onGce($httpHandler, $cacheConfig, $cache)) { + $creds = new GCECredentials(null, null, $targetAudience); } if (is_null($creds)) { - throw new \DomainException(self::notFound()); + throw new DomainException(self::notFound()); } if (!is_null($cache)) { $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache); @@ -170,4 +290,19 @@ private static function notFound() return $msg; } + + private static function onGce( + callable $httpHandler = null, + array $cacheConfig = null, + CacheItemPoolInterface $cache = null + ) { + $gceCacheConfig = []; + foreach (['lifetime', 'prefix'] as $key) { + if (isset($cacheConfig['gce_' . $key])) { + $gceCacheConfig[$key] = $cacheConfig['gce_' . $key]; + } + } + + return (new GCECache($gceCacheConfig, $cache))->onGce($httpHandler); + } } diff --git a/vendor/google/auth/src/Cache/Item.php b/vendor/google/auth/src/Cache/Item.php index d5ce1a5e..069eafc3 100644 --- a/vendor/google/auth/src/Cache/Item.php +++ b/vendor/google/auth/src/Cache/Item.php @@ -35,7 +35,7 @@ final class Item implements CacheItemInterface private $value; /** - * @var \DateTime + * @var \DateTime|null */ private $expiration; @@ -81,7 +81,7 @@ public function isHit() return true; } - return new \DateTime() < $this->expiration; + return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp(); } /** @@ -126,9 +126,9 @@ public function expiresAt($expiration) public function expiresAfter($time) { if (is_int($time)) { - $this->expiration = new \DateTime("now + $time seconds"); + $this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S")); } elseif ($time instanceof \DateInterval) { - $this->expiration = (new \DateTime())->add($time); + $this->expiration = $this->currentTime()->add($time); } elseif ($time === null) { $this->expiration = $time; } else { @@ -182,4 +182,9 @@ private function isValidExpiration($expiration) return false; } + + protected function currentTime() + { + return new \DateTime('now', new \DateTimeZone('UTC')); + } } diff --git a/vendor/google/auth/src/Cache/SysVCacheItemPool.php b/vendor/google/auth/src/Cache/SysVCacheItemPool.php new file mode 100644 index 00000000..1834cf1b --- /dev/null +++ b/vendor/google/auth/src/Cache/SysVCacheItemPool.php @@ -0,0 +1,241 @@ +options = $options + [ + 'variableKey' => self::VAR_KEY, + 'proj' => self::DEFAULT_PROJ, + 'memsize' => self::DEFAULT_MEMSIZE, + 'perm' => self::DEFAULT_PERM + ]; + $this->items = []; + $this->deferredItems = []; + $this->sysvKey = ftok(__FILE__, $this->options['proj']); + } + + public function getItem($key) + { + $this->loadItems(); + return current($this->getItems([$key])); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []) + { + $this->loadItems(); + $items = []; + foreach ($keys as $key) { + $items[$key] = $this->hasItem($key) ? + clone $this->items[$key] : + new Item($key); + } + return $items; + } + + /** + * {@inheritdoc} + */ + public function hasItem($key) + { + $this->loadItems(); + return isset($this->items[$key]) && $this->items[$key]->isHit(); + } + + /** + * {@inheritdoc} + */ + public function clear() + { + $this->items = []; + $this->deferredItems = []; + return $this->saveCurrentItems(); + } + + /** + * {@inheritdoc} + */ + public function deleteItem($key) + { + return $this->deleteItems([$key]); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys) + { + if (!$this->hasLoadedItems) { + $this->loadItems(); + } + + foreach ($keys as $key) { + unset($this->items[$key]); + } + return $this->saveCurrentItems(); + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item) + { + if (!$this->hasLoadedItems) { + $this->loadItems(); + } + + $this->items[$item->getKey()] = $item; + return $this->saveCurrentItems(); + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item) + { + $this->deferredItems[$item->getKey()] = $item; + return true; + } + + /** + * {@inheritdoc} + */ + public function commit() + { + foreach ($this->deferredItems as $item) { + if ($this->save($item) === false) { + return false; + } + } + $this->deferredItems = []; + return true; + } + + /** + * Save the current items. + * + * @return bool true when success, false upon failure + */ + private function saveCurrentItems() + { + $shmid = shm_attach( + $this->sysvKey, + $this->options['memsize'], + $this->options['perm'] + ); + if ($shmid !== false) { + $ret = shm_put_var( + $shmid, + $this->options['variableKey'], + $this->items + ); + shm_detach($shmid); + return $ret; + } + return false; + } + + /** + * Load the items from the shared memory. + * + * @return bool true when success, false upon failure + */ + private function loadItems() + { + $shmid = shm_attach( + $this->sysvKey, + $this->options['memsize'], + $this->options['perm'] + ); + if ($shmid !== false) { + $data = @shm_get_var($shmid, $this->options['variableKey']); + if (!empty($data)) { + $this->items = $data; + } else { + $this->items = []; + } + shm_detach($shmid); + $this->hasLoadedItems = true; + return true; + } + return false; + } +} diff --git a/vendor/google/auth/src/Credentials/AppIdentityCredentials.php b/vendor/google/auth/src/Credentials/AppIdentityCredentials.php index d0ba7031..829344d0 100644 --- a/vendor/google/auth/src/Credentials/AppIdentityCredentials.php +++ b/vendor/google/auth/src/Credentials/AppIdentityCredentials.php @@ -24,6 +24,8 @@ */ use google\appengine\api\app_identity\AppIdentityService; use Google\Auth\CredentialsLoader; +use Google\Auth\ProjectIdProviderInterface; +use Google\Auth\SignBlobInterface; /** * AppIdentityCredentials supports authorization on Google App Engine. @@ -31,38 +33,53 @@ * It can be used to authorize requests using the AuthTokenMiddleware or * AuthTokenSubscriber, but will only succeed if being run on App Engine: * - * use Google\Auth\Credentials\AppIdentityCredentials; - * use Google\Auth\Middleware\AuthTokenMiddleware; - * use GuzzleHttp\Client; - * use GuzzleHttp\HandlerStack; + * Example: + * ``` + * use Google\Auth\Credentials\AppIdentityCredentials; + * use Google\Auth\Middleware\AuthTokenMiddleware; + * use GuzzleHttp\Client; + * use GuzzleHttp\HandlerStack; * - * $gae = new AppIdentityCredentials('https://www.googleapis.com/auth/books'); - * $middleware = new AuthTokenMiddleware($gae); - * $stack = HandlerStack::create(); - * $stack->push($middleware); + * $gae = new AppIdentityCredentials('https://www.googleapis.com/auth/books'); + * $middleware = new AuthTokenMiddleware($gae); + * $stack = HandlerStack::create(); + * $stack->push($middleware); * - * $client = new Client([ - * 'handler' => $stack, - * 'base_uri' => 'https://www.googleapis.com/books/v1', - * 'auth' => 'google_auth' - * ]); + * $client = new Client([ + * 'handler' => $stack, + * 'base_uri' => 'https://www.googleapis.com/books/v1', + * 'auth' => 'google_auth' + * ]); * - * $res = $client->get('volumes?q=Henry+David+Thoreau&country=US'); + * $res = $client->get('volumes?q=Henry+David+Thoreau&country=US'); + * ``` */ -class AppIdentityCredentials extends CredentialsLoader +class AppIdentityCredentials extends CredentialsLoader implements + SignBlobInterface, + ProjectIdProviderInterface { /** * Result of fetchAuthToken. * - * @array + * @var array */ protected $lastReceivedToken; /** * Array of OAuth2 scopes to be requested. + * + * @var array */ private $scope; + /** + * @var string + */ + private $clientName; + + /** + * @param array $scope One or more scopes. + */ public function __construct($scope = array()) { $this->scope = $scope; @@ -73,7 +90,7 @@ public function __construct($scope = array()) * SERVER_SOFTWARE environment variable (prod) or the APPENGINE_RUNTIME * environment variable (dev). * - * @return true if this an App Engine Instance, false otherwise + * @return bool true if this an App Engine Instance, false otherwise */ public static function onAppEngine() { @@ -98,28 +115,17 @@ public static function onAppEngine() * the GuzzleHttp\ClientInterface instance passed in will not be used. * * @param callable $httpHandler callback which delivers psr7 request - * - * @return array the auth metadata: - * array(2) { - * ["access_token"]=> - * string(3) "xyz" - * ["expiration_time"]=> - * string(10) "1444339905" - * } - * - * @throws \Exception + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expiration_time (string) */ public function fetchAuthToken(callable $httpHandler = null) { - if (!self::onAppEngine()) { - return array(); - } - - if (!class_exists('google\appengine\api\app_identity\AppIdentityService')) { - throw new \Exception( - 'This class must be run in App Engine, or you must include the AppIdentityService ' - . 'mock class defined in tests/mocks/AppIdentityService.php' - ); + try { + $this->checkAppEngineContext(); + } catch (\Exception $e) { + return []; } // AppIdentityService expects an array when multiple scopes are supplied @@ -131,6 +137,61 @@ public function fetchAuthToken(callable $httpHandler = null) return $token; } + /** + * Sign a string using AppIdentityService. + * + * @param string $stringToSign The string to sign. + * @param bool $forceOpenSsl [optional] Does not apply to this credentials + * type. + * @return string The signature, base64-encoded. + * @throws \Exception If AppEngine SDK or mock is not available. + */ + public function signBlob($stringToSign, $forceOpenSsl = false) + { + $this->checkAppEngineContext(); + + return base64_encode(AppIdentityService::signForApp($stringToSign)['signature']); + } + + /** + * Get the project ID from AppIdentityService. + * + * Returns null if AppIdentityService is unavailable. + * + * @param callable $httpHandler Not used by this type. + * @return string|null + */ + public function getProjectId(callable $httpHander = null) + { + try { + $this->checkAppEngineContext(); + } catch (\Exception $e) { + return null; + } + + return AppIdentityService::getApplicationId(); + } + + /** + * Get the client name from AppIdentityService. + * + * Subsequent calls to this method will return a cached value. + * + * @param callable $httpHandler Not used in this implementation. + * @return string + * @throws \Exception If AppEngine SDK or mock is not available. + */ + public function getClientName(callable $httpHandler = null) + { + $this->checkAppEngineContext(); + + if (!$this->clientName) { + $this->clientName = AppIdentityService::getServiceAccountName(); + } + + return $this->clientName; + } + /** * @return array|null */ @@ -156,4 +217,14 @@ public function getCacheKey() { return ''; } + + private function checkAppEngineContext() + { + if (!self::onAppEngine() || !class_exists('google\appengine\api\app_identity\AppIdentityService')) { + throw new \Exception( + 'This class must be run in App Engine, or you must include the AppIdentityService ' + . 'mock class defined in tests/mocks/AppIdentityService.php' + ); + } + } } diff --git a/vendor/google/auth/src/Credentials/GCECredentials.php b/vendor/google/auth/src/Credentials/GCECredentials.php index 43115290..e985e3ca 100644 --- a/vendor/google/auth/src/Credentials/GCECredentials.php +++ b/vendor/google/auth/src/Credentials/GCECredentials.php @@ -18,11 +18,18 @@ namespace Google\Auth\Credentials; use Google\Auth\CredentialsLoader; +use Google\Auth\GetQuotaProjectInterface; +use Google\Auth\HttpHandler\HttpClientCache; use Google\Auth\HttpHandler\HttpHandlerFactory; +use Google\Auth\Iam; +use Google\Auth\ProjectIdProviderInterface; +use Google\Auth\SignBlobInterface; use GuzzleHttp\Exception\ClientException; +use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Exception\ServerException; use GuzzleHttp\Psr7\Request; +use InvalidArgumentException; /** * GCECredentials supports authorization on Google Compute Engine. @@ -48,9 +55,15 @@ * * $res = $client->get('myproject/taskqueues/myqueue'); */ -class GCECredentials extends CredentialsLoader +class GCECredentials extends CredentialsLoader implements + SignBlobInterface, + ProjectIdProviderInterface, + GetQuotaProjectInterface { + // phpcs:disable const cacheKey = 'GOOGLE_AUTH_PHP_GCE'; + // phpcs:enable + /** * The metadata IP address on appengine instances. * @@ -64,11 +77,39 @@ class GCECredentials extends CredentialsLoader */ const TOKEN_URI_PATH = 'v1/instance/service-accounts/default/token'; + /** + * The metadata path of the default id token. + */ + const ID_TOKEN_URI_PATH = 'v1/instance/service-accounts/default/identity'; + + /** + * The metadata path of the client ID. + */ + const CLIENT_ID_URI_PATH = 'v1/instance/service-accounts/default/email'; + + /** + * The metadata path of the project ID. + */ + const PROJECT_ID_URI_PATH = 'v1/project/project-id'; + /** * The header whose presence indicates GCE presence. */ const FLAVOR_HEADER = 'Metadata-Flavor'; + /** + * Note: the explicit `timeout` and `tries` below is a workaround. The underlying + * issue is that resolving an unknown host on some networks will take + * 20-30 seconds; making this timeout short fixes the issue, but + * could lead to false negatives in the event that we are on GCE, but + * the metadata resolution was particularly slow. The latter case is + * "unlikely" since the expected 4-nines time is about 0.5 seconds. + * This allows us to limit the total ping maximum timeout to 1.5 seconds + * for developer desktop scenarios. + */ + const MAX_COMPUTE_PING_TRIES = 3; + const COMPUTE_PING_CONNECTION_TIMEOUT_S = 0.5; + /** * Flag used to ensure that the onGCE test is only done once;. * @@ -88,27 +129,175 @@ class GCECredentials extends CredentialsLoader */ protected $lastReceivedToken; + /** + * @var string|null + */ + private $clientName; + + /** + * @var string|null + */ + private $projectId; + + /** + * @var Iam|null + */ + private $iam; + + /** + * @var string + */ + private $tokenUri; + + /** + * @var string + */ + private $targetAudience; + + /** + * @var string|null + */ + private $quotaProject; + + /** + * @var string|null + */ + private $serviceAccountIdentity; + + /** + * @param Iam $iam [optional] An IAM instance. + * @param string|array $scope [optional] the scope of the access request, + * expressed either as an array or as a space-delimited string. + * @param string $targetAudience [optional] The audience for the ID token. + * @param string $quotaProject [optional] Specifies a project to bill for access + * charges associated with the request. + * @param string $serviceAccountIdentity [optional] Specify a service + * account identity name to use instead of "default". + */ + public function __construct( + Iam $iam = null, + $scope = null, + $targetAudience = null, + $quotaProject = null, + $serviceAccountIdentity = null + ) { + $this->iam = $iam; + + if ($scope && $targetAudience) { + throw new InvalidArgumentException( + 'Scope and targetAudience cannot both be supplied' + ); + } + + $tokenUri = self::getTokenUri($serviceAccountIdentity); + if ($scope) { + if (is_string($scope)) { + $scope = explode(' ', $scope); + } + + $scope = implode(',', $scope); + + $tokenUri = $tokenUri . '?scopes='. $scope; + } elseif ($targetAudience) { + $tokenUri = self::getIdTokenUri($serviceAccountIdentity); + $tokenUri = $tokenUri . '?audience='. $targetAudience; + $this->targetAudience = $targetAudience; + } + + $this->tokenUri = $tokenUri; + $this->quotaProject = $quotaProject; + $this->serviceAccountIdentity = $serviceAccountIdentity; + } + /** * The full uri for accessing the default token. * + * @param string $serviceAccountIdentity [optional] Specify a service + * account identity name to use instead of "default". + * @return string + */ + public static function getTokenUri($serviceAccountIdentity = null) + { + $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + $base .= self::TOKEN_URI_PATH; + + if ($serviceAccountIdentity) { + return str_replace( + '/default/', + '/' . $serviceAccountIdentity . '/', + $base + ); + } + return $base; + } + + /** + * The full uri for accessing the default service account. + * + * @param string $serviceAccountIdentity [optional] Specify a service + * account identity name to use instead of "default". + * @return string + */ + public static function getClientNameUri($serviceAccountIdentity = null) + { + $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + $base .= self::CLIENT_ID_URI_PATH; + + if ($serviceAccountIdentity) { + return str_replace( + '/default/', + '/' . $serviceAccountIdentity . '/', + $base + ); + } + + return $base; + } + + /** + * The full uri for accesesing the default identity token. + * + * @param string $serviceAccountIdentity [optional] Specify a service + * account identity name to use instead of "default". * @return string */ - public static function getTokenUri() + private static function getIdTokenUri($serviceAccountIdentity = null) { $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + $base .= self::ID_TOKEN_URI_PATH; - return $base . self::TOKEN_URI_PATH; + if ($serviceAccountIdentity) { + return str_replace( + '/default/', + '/' . $serviceAccountIdentity . '/', + $base + ); + } + + return $base; + } + + /** + * The full uri for accessing the default project ID. + * + * @return string + */ + private static function getProjectIdUri() + { + $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + + return $base . self::PROJECT_ID_URI_PATH; } /** * Determines if this an App Engine Flexible instance, by accessing the - * GAE_VM environment variable. + * GAE_INSTANCE environment variable. * - * @return true if this an App Engine Flexible Instance, false otherwise + * @return bool true if this an App Engine Flexible Instance, false otherwise */ public static function onAppEngineFlexible() { - return isset($_SERVER['GAE_VM']) && 'true' === $_SERVER['GAE_VM']; + return substr(getenv('GAE_INSTANCE'), 0, 4) === 'aef-'; } /** @@ -117,37 +306,41 @@ public static function onAppEngineFlexible() * If $httpHandler is not specified a the default HttpHandler is used. * * @param callable $httpHandler callback which delivers psr7 request - * - * @return true if this a GCEInstance false otherwise + * @return bool True if this a GCEInstance, false otherwise */ public static function onGce(callable $httpHandler = null) { - if (is_null($httpHandler)) { - $httpHandler = HttpHandlerFactory::build(); - } + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + $checkUri = 'http://' . self::METADATA_IP; - try { - // Comment from: oauth2client/client.py - // - // Note: the explicit `timeout` below is a workaround. The underlying - // issue is that resolving an unknown host on some networks will take - // 20-30 seconds; making this timeout short fixes the issue, but - // could lead to false negatives in the event that we are on GCE, but - // the metadata resolution was particularly slow. The latter case is - // "unlikely". - $resp = $httpHandler( - new Request('GET', $checkUri), - ['timeout' => 0.3] - ); + for ($i = 1; $i <= self::MAX_COMPUTE_PING_TRIES; $i++) { + try { + // Comment from: oauth2client/client.py + // + // Note: the explicit `timeout` below is a workaround. The underlying + // issue is that resolving an unknown host on some networks will take + // 20-30 seconds; making this timeout short fixes the issue, but + // could lead to false negatives in the event that we are on GCE, but + // the metadata resolution was particularly slow. The latter case is + // "unlikely". + $resp = $httpHandler( + new Request( + 'GET', + $checkUri, + [self::FLAVOR_HEADER => 'Google'] + ), + ['timeout' => self::COMPUTE_PING_CONNECTION_TIMEOUT_S] + ); - return $resp->getHeaderLine(self::FLAVOR_HEADER) == 'Google'; - } catch (ClientException $e) { - return false; - } catch (ServerException $e) { - return false; - } catch (RequestException $e) { - return false; + return $resp->getHeaderLine(self::FLAVOR_HEADER) == 'Google'; + } catch (ClientException $e) { + } catch (ServerException $e) { + } catch (RequestException $e) { + } catch (ConnectException $e) { + } } + return false; } /** @@ -158,38 +351,44 @@ public static function onGce(callable $httpHandler = null) * * @param callable $httpHandler callback which delivers psr7 request * - * @return array the response + * @return array A set of auth related metadata, based on the token type. + * + * Access tokens have the following keys: + * - access_token (string) + * - expires_in (int) + * - token_type (string) + * ID tokens have the following keys: + * - id_token (string) * * @throws \Exception */ public function fetchAuthToken(callable $httpHandler = null) { - if (is_null($httpHandler)) { - $httpHandler = HttpHandlerFactory::build(); - } + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + if (!$this->hasCheckedOnGce) { $this->isOnGce = self::onGce($httpHandler); + $this->hasCheckedOnGce = true; } if (!$this->isOnGce) { return array(); // return an empty array with no access token } - $resp = $httpHandler( - new Request( - 'GET', - self::getTokenUri(), - [self::FLAVOR_HEADER => 'Google'] - ) - ); - $body = (string)$resp->getBody(); - // Assume it's JSON; if it's not throw an exception - if (null === $json = json_decode($body, true)) { + $response = $this->getFromMetadata($httpHandler, $this->tokenUri); + + if ($this->targetAudience) { + return ['id_token' => $response]; + } + + if (null === $json = json_decode($response, true)) { throw new \Exception('Invalid JSON response'); } + $json['expires_at'] = time() + $json['expires_in']; + // store this so we can retrieve it later $this->lastReceivedToken = $json; - $this->lastReceivedToken['expires_at'] = time() + $json['expires_in']; return $json; } @@ -216,4 +415,128 @@ public function getLastReceivedToken() return null; } + + /** + * Get the client name from GCE metadata. + * + * Subsequent calls will return a cached value. + * + * @param callable $httpHandler callback which delivers psr7 request + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + if ($this->clientName) { + return $this->clientName; + } + + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + if (!$this->hasCheckedOnGce) { + $this->isOnGce = self::onGce($httpHandler); + $this->hasCheckedOnGce = true; + } + + if (!$this->isOnGce) { + return ''; + } + + $this->clientName = $this->getFromMetadata( + $httpHandler, + self::getClientNameUri($this->serviceAccountIdentity) + ); + + return $this->clientName; + } + + /** + * Sign a string using the default service account private key. + * + * This implementation uses IAM's signBlob API. + * + * @see https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/signBlob SignBlob + * + * @param string $stringToSign The string to sign. + * @param bool $forceOpenSsl [optional] Does not apply to this credentials + * type. + * @return string + */ + public function signBlob($stringToSign, $forceOpenSsl = false) + { + $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + // Providing a signer is useful for testing, but it's undocumented + // because it's not something a user would generally need to do. + $signer = $this->iam ?: new Iam($httpHandler); + + $email = $this->getClientName($httpHandler); + + $previousToken = $this->getLastReceivedToken(); + $accessToken = $previousToken + ? $previousToken['access_token'] + : $this->fetchAuthToken($httpHandler)['access_token']; + + return $signer->signBlob($email, $accessToken, $stringToSign); + } + + /** + * Fetch the default Project ID from compute engine. + * + * Returns null if called outside GCE. + * + * @param callable $httpHandler Callback which delivers psr7 request + * @return string|null + */ + public function getProjectId(callable $httpHandler = null) + { + if ($this->projectId) { + return $this->projectId; + } + + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + if (!$this->hasCheckedOnGce) { + $this->isOnGce = self::onGce($httpHandler); + $this->hasCheckedOnGce = true; + } + + if (!$this->isOnGce) { + return null; + } + + $this->projectId = $this->getFromMetadata($httpHandler, self::getProjectIdUri()); + return $this->projectId; + } + + /** + * Fetch the value of a GCE metadata server URI. + * + * @param callable $httpHandler An HTTP Handler to deliver PSR7 requests. + * @param string $uri The metadata URI. + * @return string + */ + private function getFromMetadata(callable $httpHandler, $uri) + { + $resp = $httpHandler( + new Request( + 'GET', + $uri, + [self::FLAVOR_HEADER => 'Google'] + ) + ); + + return (string) $resp->getBody(); + } + + /** + * Get the quota project used for this API request + * + * @return string|null + */ + public function getQuotaProject() + { + return $this->quotaProject; + } } diff --git a/vendor/google/auth/src/Credentials/IAMCredentials.php b/vendor/google/auth/src/Credentials/IAMCredentials.php index 0d2a37d1..5f055d84 100644 --- a/vendor/google/auth/src/Credentials/IAMCredentials.php +++ b/vendor/google/auth/src/Credentials/IAMCredentials.php @@ -43,11 +43,13 @@ public function __construct($selector, $token) { if (!is_string($selector)) { throw new \InvalidArgumentException( - 'selector must be a string'); + 'selector must be a string' + ); } if (!is_string($token)) { throw new \InvalidArgumentException( - 'token must be a string'); + 'token must be a string' + ); } $this->selector = $selector; diff --git a/vendor/google/auth/src/Credentials/InsecureCredentials.php b/vendor/google/auth/src/Credentials/InsecureCredentials.php new file mode 100644 index 00000000..dae894fa --- /dev/null +++ b/vendor/google/auth/src/Credentials/InsecureCredentials.php @@ -0,0 +1,70 @@ + '' + ]; + + /** + * Fetches the auth token. In this case it returns an empty string. + * + * @param callable $httpHandler + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + */ + public function fetchAuthToken(callable $httpHandler = null) + { + return $this->token; + } + + /** + * Returns the cache key. In this case it returns a null value, disabling + * caching. + * + * @return string|null + */ + public function getCacheKey() + { + return null; + } + + /** + * Fetches the last received token. In this case, it returns the same empty string + * auth token. + * + * @return array + */ + public function getLastReceivedToken() + { + return $this->token; + } +} diff --git a/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php b/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php index db391ecf..e12f6c67 100644 --- a/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php +++ b/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php @@ -18,7 +18,12 @@ namespace Google\Auth\Credentials; use Google\Auth\CredentialsLoader; +use Google\Auth\GetQuotaProjectInterface; use Google\Auth\OAuth2; +use Google\Auth\ProjectIdProviderInterface; +use Google\Auth\ServiceAccountSignerTrait; +use Google\Auth\SignBlobInterface; +use InvalidArgumentException; /** * ServiceAccountCredentials supports authorization using a Google service @@ -53,8 +58,13 @@ * * $res = $client->get('myproject/taskqueues/myqueue'); */ -class ServiceAccountCredentials extends CredentialsLoader +class ServiceAccountCredentials extends CredentialsLoader implements + GetQuotaProjectInterface, + SignBlobInterface, + ProjectIdProviderInterface { + use ServiceAccountSignerTrait; + /** * The OAuth2 instance used to conduct authorization. * @@ -62,6 +72,23 @@ class ServiceAccountCredentials extends CredentialsLoader */ protected $auth; + /** + * The quota project associated with the JSON credentials + * + * @var string + */ + protected $quotaProject; + + /* + * @var string|null + */ + protected $projectId; + + /* + * @var array|null + */ + private $lastReceivedJwtAccessToken; + /** * Create a new ServiceAccountCredentials. * @@ -71,11 +98,13 @@ class ServiceAccountCredentials extends CredentialsLoader * as an associative array * @param string $sub an email address account to impersonate, in situations when * the service account has been delegated domain wide access. + * @param string $targetAudience The audience for the ID token. */ public function __construct( $scope, $jsonKey, - $sub = null + $sub = null, + $targetAudience = null ) { if (is_string($jsonKey)) { if (!file_exists($jsonKey)) { @@ -88,11 +117,25 @@ public function __construct( } if (!array_key_exists('client_email', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the client_email field'); + 'json key is missing the client_email field' + ); } if (!array_key_exists('private_key', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the private_key field'); + 'json key is missing the private_key field' + ); + } + if (array_key_exists('quota_project_id', $jsonKey)) { + $this->quotaProject = (string) $jsonKey['quota_project_id']; + } + if ($scope && $targetAudience) { + throw new InvalidArgumentException( + 'Scope and targetAudience cannot both be supplied' + ); + } + $additionalClaims = []; + if ($targetAudience) { + $additionalClaims = ['target_audience' => $targetAudience]; } $this->auth = new OAuth2([ 'audience' => self::TOKEN_CREDENTIAL_URI, @@ -102,13 +145,22 @@ public function __construct( 'signingKey' => $jsonKey['private_key'], 'sub' => $sub, 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI, + 'additionalClaims' => $additionalClaims, ]); + + $this->projectId = isset($jsonKey['project_id']) + ? $jsonKey['project_id'] + : null; } /** * @param callable $httpHandler * - * @return array + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expires_in (int) + * - token_type (string) */ public function fetchAuthToken(callable $httpHandler = null) { @@ -133,7 +185,24 @@ public function getCacheKey() */ public function getLastReceivedToken() { - return $this->auth->getLastReceivedToken(); + // If self-signed JWTs are being used, fetch the last received token + // from memory. Else, fetch it from OAuth2 + return $this->useSelfSignedJwt() + ? $this->lastReceivedJwtAccessToken + : $this->auth->getLastReceivedToken(); + } + + /** + * Get the project ID from the service account keyfile. + * + * Returns null if the project ID does not exist in the keyfile. + * + * @param callable $httpHandler Not used by this credentials type. + * @return string|null + */ + public function getProjectId(callable $httpHandler = null) + { + return $this->projectId; } /** @@ -142,7 +211,6 @@ public function getLastReceivedToken() * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request - * * @return array updated metadata hashmap */ public function updateMetadata( @@ -151,8 +219,7 @@ public function updateMetadata( callable $httpHandler = null ) { // scope exists. use oauth implementation - $scope = $this->auth->getScope(); - if (!is_null($scope)) { + if (!$this->useSelfSignedJwt()) { return parent::updateMetadata($metadata, $authUri, $httpHandler); } @@ -163,7 +230,14 @@ public function updateMetadata( ); $jwtCreds = new ServiceAccountJwtAccessCredentials($credJson); - return $jwtCreds->updateMetadata($metadata, $authUri, $httpHandler); + $updatedMetadata = $jwtCreds->updateMetadata($metadata, $authUri, $httpHandler); + + if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) { + // Keep self-signed JWTs in memory as the last received token + $this->lastReceivedJwtAccessToken = $lastReceivedToken; + } + + return $updatedMetadata; } /** @@ -174,4 +248,32 @@ public function setSub($sub) { $this->auth->setSub($sub); } + + /** + * Get the client name from the keyfile. + * + * In this case, it returns the keyfile's client_email key. + * + * @param callable $httpHandler Not used by this credentials type. + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + return $this->auth->getIssuer(); + } + + /** + * Get the quota project used for this API request + * + * @return string|null + */ + public function getQuotaProject() + { + return $this->quotaProject; + } + + private function useSelfSignedJwt() + { + return is_null($this->auth->getScope()); + } } diff --git a/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php b/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php index 28cc7096..ac1147fc 100644 --- a/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php +++ b/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php @@ -18,7 +18,11 @@ namespace Google\Auth\Credentials; use Google\Auth\CredentialsLoader; +use Google\Auth\GetQuotaProjectInterface; use Google\Auth\OAuth2; +use Google\Auth\ProjectIdProviderInterface; +use Google\Auth\ServiceAccountSignerTrait; +use Google\Auth\SignBlobInterface; /** * Authenticates requests using Google's Service Account credentials via @@ -29,8 +33,13 @@ * console (via 'Generate new Json Key'). It is not part of any OAuth2 * flow, rather it creates a JWT and sends that as a credential. */ -class ServiceAccountJwtAccessCredentials extends CredentialsLoader +class ServiceAccountJwtAccessCredentials extends CredentialsLoader implements + GetQuotaProjectInterface, + SignBlobInterface, + ProjectIdProviderInterface { + use ServiceAccountSignerTrait; + /** * The OAuth2 instance used to conduct authorization. * @@ -38,6 +47,11 @@ class ServiceAccountJwtAccessCredentials extends CredentialsLoader */ protected $auth; + /** + * The quota project associated with the JSON credentials + */ + protected $quotaProject; + /** * Create a new ServiceAccountJwtAccessCredentials. * @@ -57,11 +71,16 @@ public function __construct($jsonKey) } if (!array_key_exists('client_email', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the client_email field'); + 'json key is missing the client_email field' + ); } if (!array_key_exists('private_key', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the private_key field'); + 'json key is missing the private_key field' + ); + } + if (array_key_exists('quota_project_id', $jsonKey)) { + $this->quotaProject = (string) $jsonKey['quota_project_id']; } $this->auth = new OAuth2([ 'issuer' => $jsonKey['client_email'], @@ -69,6 +88,10 @@ public function __construct($jsonKey) 'signingAlgorithm' => 'RS256', 'signingKey' => $jsonKey['private_key'], ]); + + $this->projectId = isset($jsonKey['project_id']) + ? $jsonKey['project_id'] + : null; } /** @@ -77,7 +100,6 @@ public function __construct($jsonKey) * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request - * * @return array updated metadata hashmap */ public function updateMetadata( @@ -99,7 +121,9 @@ public function updateMetadata( * * @param callable $httpHandler * - * @return array|void + * @return array|void A set of auth related metadata, containing the + * following keys: + * - access_token (string) */ public function fetchAuthToken(callable $httpHandler = null) { @@ -110,6 +134,9 @@ public function fetchAuthToken(callable $httpHandler = null) $access_token = $this->auth->toJwt(); + // Set the self-signed access token in OAuth2 for getLastReceivedToken + $this->auth->setAccessToken($access_token); + return array('access_token' => $access_token); } @@ -128,4 +155,40 @@ public function getLastReceivedToken() { return $this->auth->getLastReceivedToken(); } + + /** + * Get the project ID from the service account keyfile. + * + * Returns null if the project ID does not exist in the keyfile. + * + * @param callable $httpHandler Not used by this credentials type. + * @return string|null + */ + public function getProjectId(callable $httpHandler = null) + { + return $this->projectId; + } + + /** + * Get the client name from the keyfile. + * + * In this case, it returns the keyfile's client_email key. + * + * @param callable $httpHandler Not used by this credentials type. + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + return $this->auth->getIssuer(); + } + + /** + * Get the quota project used for this API request + * + * @return string|null + */ + public function getQuotaProject() + { + return $this->quotaProject; + } } diff --git a/vendor/google/auth/src/Credentials/UserRefreshCredentials.php b/vendor/google/auth/src/Credentials/UserRefreshCredentials.php index 6c7e5cfa..b17ce5fc 100644 --- a/vendor/google/auth/src/Credentials/UserRefreshCredentials.php +++ b/vendor/google/auth/src/Credentials/UserRefreshCredentials.php @@ -18,6 +18,7 @@ namespace Google\Auth\Credentials; use Google\Auth\CredentialsLoader; +use Google\Auth\GetQuotaProjectInterface; use Google\Auth\OAuth2; /** @@ -31,7 +32,7 @@ * * @see [Application Default Credentials](http://goo.gl/mkAHpZ) */ -class UserRefreshCredentials extends CredentialsLoader +class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjectInterface { /** * The OAuth2 instance used to conduct authorization. @@ -40,6 +41,11 @@ class UserRefreshCredentials extends CredentialsLoader */ protected $auth; + /** + * The quota project associated with the JSON credentials + */ + protected $quotaProject; + /** * Create a new UserRefreshCredentials. * @@ -63,15 +69,18 @@ public function __construct( } if (!array_key_exists('client_id', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the client_id field'); + 'json key is missing the client_id field' + ); } if (!array_key_exists('client_secret', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the client_secret field'); + 'json key is missing the client_secret field' + ); } if (!array_key_exists('refresh_token', $jsonKey)) { throw new \InvalidArgumentException( - 'json key is missing the refresh_token field'); + 'json key is missing the refresh_token field' + ); } $this->auth = new OAuth2([ 'clientId' => $jsonKey['client_id'], @@ -80,12 +89,21 @@ public function __construct( 'scope' => $scope, 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI, ]); + if (array_key_exists('quota_project_id', $jsonKey)) { + $this->quotaProject = (string) $jsonKey['quota_project_id']; + } } /** * @param callable $httpHandler * - * @return array + * @return array A set of auth related metadata, containing the following + * keys: + * - access_token (string) + * - expires_in (int) + * - scope (string) + * - token_type (string) + * - id_token (string) */ public function fetchAuthToken(callable $httpHandler = null) { @@ -107,4 +125,14 @@ public function getLastReceivedToken() { return $this->auth->getLastReceivedToken(); } + + /** + * Get the quota project used for this API request + * + * @return string|null + */ + public function getQuotaProject() + { + return $this->quotaProject; + } } diff --git a/vendor/google/auth/src/CredentialsLoader.php b/vendor/google/auth/src/CredentialsLoader.php index a21f0058..9b7f4c41 100644 --- a/vendor/google/auth/src/CredentialsLoader.php +++ b/vendor/google/auth/src/CredentialsLoader.php @@ -17,20 +17,23 @@ namespace Google\Auth; +use Google\Auth\Credentials\InsecureCredentials; use Google\Auth\Credentials\ServiceAccountCredentials; use Google\Auth\Credentials\UserRefreshCredentials; +use GuzzleHttp\ClientInterface; /** * CredentialsLoader contains the behaviour used to locate and find default * credentials files on the file system. */ -abstract class CredentialsLoader implements FetchAuthTokenInterface +abstract class CredentialsLoader implements + FetchAuthTokenInterface, + UpdateMetadataInterface { - const TOKEN_CREDENTIAL_URI = 'https://www.googleapis.com/oauth2/v4/token'; + const TOKEN_CREDENTIAL_URI = 'https://oauth2.googleapis.com/token'; const ENV_VAR = 'GOOGLE_APPLICATION_CREDENTIALS'; const WELL_KNOWN_PATH = 'gcloud/application_default_credentials.json'; const NON_WINDOWS_WELL_KNOWN_PATH_BASE = '.config'; - const AUTH_METADATA_KEY = 'authorization'; /** * @param string $cause @@ -53,6 +56,24 @@ private static function isOnWindows() return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; } + /** + * Returns the currently available major Guzzle version. + * + * @return int + */ + private static function getGuzzleMajorVersion() + { + if (defined('GuzzleHttp\ClientInterface::MAJOR_VERSION')) { + return ClientInterface::MAJOR_VERSION; + } + + if (defined('GuzzleHttp\ClientInterface::VERSION')) { + return (int) substr(ClientInterface::VERSION, 0, 1); + } + + throw new \Exception('Version not supported'); + } + /** * Load a JSON key from the path specified in the environment. * @@ -60,7 +81,7 @@ private static function isOnWindows() * variable GOOGLE_APPLICATION_CREDENTIALS. Return null if * GOOGLE_APPLICATION_CREDENTIALS is not specified. * - * @return array JSON key | null + * @return array|null JSON key | null */ public static function fromEnv() { @@ -80,12 +101,13 @@ public static function fromEnv() * Load a JSON key from a well known path. * * The well known path is OS dependent: - * - windows: %APPDATA%/gcloud/application_default_credentials.json - * - others: $HOME/.config/gcloud/application_default_credentials.json * - * If the file does not exists, this returns null. + * * windows: %APPDATA%/gcloud/application_default_credentials.json + * * others: $HOME/.config/gcloud/application_default_credentials.json + * + * If the file does not exist, this returns null. * - * @return array JSON key | null + * @return array|null JSON key | null */ public static function fromWellKnownFile() { @@ -107,34 +129,43 @@ public static function fromWellKnownFile() * Create a new Credentials instance. * * @param string|array $scope the scope of the access request, expressed - * either as an Array or as a space-delimited String. + * either as an Array or as a space-delimited String. * @param array $jsonKey the JSON credentials. + * @param string|array $defaultScope The default scope to use if no + * user-defined scopes exist, expressed either as an Array or as a + * space-delimited string. * * @return ServiceAccountCredentials|UserRefreshCredentials */ - public static function makeCredentials($scope, array $jsonKey) - { + public static function makeCredentials( + $scope, + array $jsonKey, + $defaultScope = null + ) { if (!array_key_exists('type', $jsonKey)) { throw new \InvalidArgumentException('json key is missing the type field'); } if ($jsonKey['type'] == 'service_account') { + // Do not pass $defaultScope to ServiceAccountCredentials return new ServiceAccountCredentials($scope, $jsonKey); - } elseif ($jsonKey['type'] == 'authorized_user') { - return new UserRefreshCredentials($scope, $jsonKey); - } else { - throw new \InvalidArgumentException('invalid value in the type field'); } + + if ($jsonKey['type'] == 'authorized_user') { + $anyScope = $scope ?: $defaultScope; + return new UserRefreshCredentials($anyScope, $jsonKey); + } + + throw new \InvalidArgumentException('invalid value in the type field'); } /** * Create an authorized HTTP Client from an instance of FetchAuthTokenInterface. * * @param FetchAuthTokenInterface $fetcher is used to fetch the auth token - * @param array $httpClientOptoins (optional) Array of request options to apply. + * @param array $httpClientOptions (optional) Array of request options to apply. * @param callable $httpHandler (optional) http client to fetch the token. * @param callable $tokenCallback (optional) function to be called when a new token is fetched. - * * @return \GuzzleHttp\Client */ public static function makeHttpClient( @@ -143,41 +174,47 @@ public static function makeHttpClient( callable $httpHandler = null, callable $tokenCallback = null ) { - $version = \GuzzleHttp\ClientInterface::VERSION; - - switch ($version[0]) { - case '5': - $client = new \GuzzleHttp\Client($httpClientOptions); - $client->setDefaultOption('auth', 'google_auth'); - $subscriber = new Subscriber\AuthTokenSubscriber( - $fetcher, - $httpHandler, - $tokenCallback - ); - $client->getEmitter()->attach($subscriber); - return $client; - case '6': - $middleware = new Middleware\AuthTokenMiddleware( - $fetcher, - $httpHandler, - $tokenCallback - ); - $stack = \GuzzleHttp\HandlerStack::create(); - $stack->push($middleware); - - return new \GuzzleHttp\Client([ - 'handler' => $stack, - 'auth' => 'google_auth', - ] + $httpClientOptions); - default: - throw new \Exception('Version not supported'); + if (self::getGuzzleMajorVersion() === 5) { + $client = new \GuzzleHttp\Client($httpClientOptions); + $client->setDefaultOption('auth', 'google_auth'); + $subscriber = new Subscriber\AuthTokenSubscriber( + $fetcher, + $httpHandler, + $tokenCallback + ); + $client->getEmitter()->attach($subscriber); + return $client; } + + $middleware = new Middleware\AuthTokenMiddleware( + $fetcher, + $httpHandler, + $tokenCallback + ); + $stack = \GuzzleHttp\HandlerStack::create(); + $stack->push($middleware); + + return new \GuzzleHttp\Client([ + 'handler' => $stack, + 'auth' => 'google_auth', + ] + $httpClientOptions); + } + + /** + * Create a new instance of InsecureCredentials. + * + * @return InsecureCredentials + */ + public static function makeInsecureCredentials() + { + return new InsecureCredentials(); } /** * export a callback function which updates runtime metadata. * * @return array updateMetadata function + * @deprecated */ public function getUpdateMetadataFunc() { @@ -190,7 +227,6 @@ public function getUpdateMetadataFunc() * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request - * * @return array updated metadata hashmap */ public function updateMetadata( @@ -198,6 +234,10 @@ public function updateMetadata( $authUri = null, callable $httpHandler = null ) { + if (isset($metadata[self::AUTH_METADATA_KEY])) { + // Auth metadata has already been set + return $metadata; + } $result = $this->fetchAuthToken($httpHandler); if (!isset($result['access_token'])) { return $metadata; diff --git a/vendor/google/auth/src/FetchAuthTokenCache.php b/vendor/google/auth/src/FetchAuthTokenCache.php index 5b8e01b0..5dfad60c 100644 --- a/vendor/google/auth/src/FetchAuthTokenCache.php +++ b/vendor/google/auth/src/FetchAuthTokenCache.php @@ -23,7 +23,12 @@ * A class to implement caching for any object implementing * FetchAuthTokenInterface */ -class FetchAuthTokenCache implements FetchAuthTokenInterface +class FetchAuthTokenCache implements + FetchAuthTokenInterface, + GetQuotaProjectInterface, + SignBlobInterface, + ProjectIdProviderInterface, + UpdateMetadataInterface { use CacheTrait; @@ -42,6 +47,11 @@ class FetchAuthTokenCache implements FetchAuthTokenInterface */ private $cache; + /** + * @param FetchAuthTokenInterface $fetcher A credentials fetcher + * @param array $cacheConfig Configuration for the cache + * @param CacheItemPoolInterface $cache + */ public function __construct( FetchAuthTokenInterface $fetcher, array $cacheConfig = null, @@ -62,30 +72,18 @@ public function __construct( * from the supplied fetcher. * * @param callable $httpHandler callback which delivers psr7 request - * * @return array the response - * * @throws \Exception */ public function fetchAuthToken(callable $httpHandler = null) { - // Use the cached value if its available. - // - // TODO: correct caching; update the call to setCachedValue to set the expiry - // to the value returned with the auth token. - // - // TODO: correct caching; enable the cache to be cleared. - $cacheKey = $this->fetcher->getCacheKey(); - $cached = $this->getCachedValue($cacheKey); - if (!empty($cached)) { - return ['access_token' => $cached]; + if ($cached = $this->fetchAuthTokenFromCache()) { + return $cached; } $auth_token = $this->fetcher->fetchAuthToken($httpHandler); - if (isset($auth_token['access_token'])) { - $this->setCachedValue($cacheKey, $auth_token['access_token']); - } + $this->saveAuthTokenInCache($auth_token); return $auth_token; } @@ -105,4 +103,161 @@ public function getLastReceivedToken() { return $this->fetcher->getLastReceivedToken(); } + + /** + * Get the client name from the fetcher. + * + * @param callable $httpHandler An HTTP handler to deliver PSR7 requests. + * @return string + */ + public function getClientName(callable $httpHandler = null) + { + return $this->fetcher->getClientName($httpHandler); + } + + /** + * Sign a blob using the fetcher. + * + * @param string $stringToSign The string to sign. + * @param bool $forceOpenSsl Require use of OpenSSL for local signing. Does + * not apply to signing done using external services. **Defaults to** + * `false`. + * @return string The resulting signature. + * @throws \RuntimeException If the fetcher does not implement + * `Google\Auth\SignBlobInterface`. + */ + public function signBlob($stringToSign, $forceOpenSsl = false) + { + if (!$this->fetcher instanceof SignBlobInterface) { + throw new \RuntimeException( + 'Credentials fetcher does not implement ' . + 'Google\Auth\SignBlobInterface' + ); + } + + return $this->fetcher->signBlob($stringToSign, $forceOpenSsl); + } + + /** + * Get the quota project used for this API request from the credentials + * fetcher. + * + * @return string|null + */ + public function getQuotaProject() + { + if ($this->fetcher instanceof GetQuotaProjectInterface) { + return $this->fetcher->getQuotaProject(); + } + } + + /* + * Get the Project ID from the fetcher. + * + * @param callable $httpHandler Callback which delivers psr7 request + * @return string|null + * @throws \RuntimeException If the fetcher does not implement + * `Google\Auth\ProvidesProjectIdInterface`. + */ + public function getProjectId(callable $httpHandler = null) + { + if (!$this->fetcher instanceof ProjectIdProviderInterface) { + throw new \RuntimeException( + 'Credentials fetcher does not implement ' . + 'Google\Auth\ProvidesProjectIdInterface' + ); + } + + return $this->fetcher->getProjectId($httpHandler); + } + + /** + * Updates metadata with the authorization token. + * + * @param array $metadata metadata hashmap + * @param string $authUri optional auth uri + * @param callable $httpHandler callback which delivers psr7 request + * @return array updated metadata hashmap + * @throws \RuntimeException If the fetcher does not implement + * `Google\Auth\UpdateMetadataInterface`. + */ + public function updateMetadata( + $metadata, + $authUri = null, + callable $httpHandler = null + ) { + if (!$this->fetcher instanceof UpdateMetadataInterface) { + throw new \RuntimeException( + 'Credentials fetcher does not implement ' . + 'Google\Auth\UpdateMetadataInterface' + ); + } + + $cached = $this->fetchAuthTokenFromCache($authUri); + if ($cached) { + // Set the access token in the `Authorization` metadata header so + // the downstream call to updateMetadata know they don't need to + // fetch another token. + if (isset($cached['access_token'])) { + $metadata[self::AUTH_METADATA_KEY] = [ + 'Bearer ' . $cached['access_token'] + ]; + } + } + + $newMetadata = $this->fetcher->updateMetadata( + $metadata, + $authUri, + $httpHandler + ); + + if (!$cached && $token = $this->fetcher->getLastReceivedToken()) { + $this->saveAuthTokenInCache($token, $authUri); + } + + return $newMetadata; + } + + private function fetchAuthTokenFromCache($authUri = null) + { + // Use the cached value if its available. + // + // TODO: correct caching; update the call to setCachedValue to set the expiry + // to the value returned with the auth token. + // + // TODO: correct caching; enable the cache to be cleared. + + // if $authUri is set, use it as the cache key + $cacheKey = $authUri + ? $this->getFullCacheKey($authUri) + : $this->fetcher->getCacheKey(); + + $cached = $this->getCachedValue($cacheKey); + if (is_array($cached)) { + if (empty($cached['expires_at'])) { + // If there is no expiration data, assume token is not expired. + // (for JwtAccess and ID tokens) + return $cached; + } + if (time() < $cached['expires_at']) { + // access token is not expired + return $cached; + } + } + + return null; + } + + private function saveAuthTokenInCache($authToken, $authUri = null) + { + if (isset($authToken['access_token']) || + isset($authToken['id_token'])) { + // if $authUri is set, use it as the cache key + $cacheKey = $authUri + ? $this->getFullCacheKey($authUri) + : $this->fetcher->getCacheKey(); + + $this->setCachedValue($cacheKey, $authToken); + } + } } diff --git a/vendor/google/auth/src/FetchAuthTokenInterface.php b/vendor/google/auth/src/FetchAuthTokenInterface.php index e3d8d28b..4bf4d27f 100644 --- a/vendor/google/auth/src/FetchAuthTokenInterface.php +++ b/vendor/google/auth/src/FetchAuthTokenInterface.php @@ -26,7 +26,6 @@ interface FetchAuthTokenInterface * Fetches the auth tokens based on the current state. * * @param callable $httpHandler callback which delivers psr7 request - * * @return array a hash of auth tokens */ public function fetchAuthToken(callable $httpHandler = null); diff --git a/vendor/google/auth/src/GCECache.php b/vendor/google/auth/src/GCECache.php new file mode 100644 index 00000000..82123ecd --- /dev/null +++ b/vendor/google/auth/src/GCECache.php @@ -0,0 +1,92 @@ +cache = $cache; + $this->cacheConfig = array_merge([ + 'lifetime' => 1500, + 'prefix' => '', + ], (array) $cacheConfig); + } + + /** + * Caches the result of onGce so the metadata server is not called multiple + * times. + * + * @param callable $httpHandler callback which delivers psr7 request + * @return bool True if this a GCEInstance, false otherwise + */ + public function onGce(callable $httpHandler = null) + { + if (is_null($this->cache)) { + return GCECredentials::onGce($httpHandler); + } + + $cacheKey = self::GCE_CACHE_KEY; + $onGce = $this->getCachedValue($cacheKey); + + if (is_null($onGce)) { + $onGce = GCECredentials::onGce($httpHandler); + $this->setCachedValue($cacheKey, $onGce); + } + + return $onGce; + } +} diff --git a/vendor/google/auth/tests/Middleware/SimpleMiddlewareTest.php b/vendor/google/auth/src/GetQuotaProjectInterface.php similarity index 56% rename from vendor/google/auth/tests/Middleware/SimpleMiddlewareTest.php rename to vendor/google/auth/src/GetQuotaProjectInterface.php index 61807aa5..517f062e 100644 --- a/vendor/google/auth/tests/Middleware/SimpleMiddlewareTest.php +++ b/vendor/google/auth/src/GetQuotaProjectInterface.php @@ -1,6 +1,6 @@ onlyGuzzle6(); - - $this->mockRequest = - $this - ->getMockBuilder('GuzzleHttp\Psr7\Request') - ->disableOriginalConstructor() - ->getMock(); - } - - public function testTest() - { - } + public function getQuotaProject(); } diff --git a/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php b/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php index b43fc22f..18ba0277 100644 --- a/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php +++ b/vendor/google/auth/src/HttpHandler/Guzzle5HttpHandler.php @@ -45,7 +45,6 @@ public function __construct(ClientInterface $client) * * @param RequestInterface $request * @param array $options - * * @return ResponseInterface */ public function __invoke(RequestInterface $request, array $options = []) @@ -62,7 +61,6 @@ public function __invoke(RequestInterface $request, array $options = []) * * @param RequestInterface $request * @param array $options - * * @return Promise */ public function async(RequestInterface $request, array $options = []) diff --git a/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php b/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php index 6dfe9a8f..aaa7b438 100644 --- a/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php +++ b/vendor/google/auth/src/HttpHandler/Guzzle6HttpHandler.php @@ -1,5 +1,19 @@ httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + } + + /** + * Sign a string using the IAM signBlob API. + * + * Note that signing using IAM requires your service account to have the + * `iam.serviceAccounts.signBlob` permission, part of the "Service Account + * Token Creator" IAM role. + * + * @param string $email The service account email. + * @param string $accessToken An access token from the service account. + * @param string $stringToSign The string to be signed. + * @param array $delegates [optional] A list of service account emails to + * add to the delegate chain. If omitted, the value of `$email` will + * be used. + * @return string The signed string, base64-encoded. + */ + public function signBlob($email, $accessToken, $stringToSign, array $delegates = []) + { + $httpHandler = $this->httpHandler; + $name = sprintf(self::SERVICE_ACCOUNT_NAME, $email); + $uri = self::IAM_API_ROOT . '/' . sprintf(self::SIGN_BLOB_PATH, $name); + + if ($delegates) { + foreach ($delegates as &$delegate) { + $delegate = sprintf(self::SERVICE_ACCOUNT_NAME, $delegate); + } + } else { + $delegates = [$name]; + } + + $body = [ + 'delegates' => $delegates, + 'payload' => base64_encode($stringToSign), + ]; + + $headers = [ + 'Authorization' => 'Bearer ' . $accessToken + ]; + + $request = new Psr7\Request( + 'POST', + $uri, + $headers, + Psr7\stream_for(json_encode($body)) + ); + + $res = $httpHandler($request); + $body = json_decode((string) $res->getBody(), true); + + return $body['signedBlob']; + } +} diff --git a/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php b/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php index ee2cf940..02bb1744 100644 --- a/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php +++ b/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php @@ -18,6 +18,7 @@ namespace Google\Auth\Middleware; use Google\Auth\FetchAuthTokenInterface; +use Google\Auth\GetQuotaProjectInterface; use Psr\Http\Message\RequestInterface; /** @@ -88,7 +89,6 @@ public function __construct( * $res = $client->get('myproject/taskqueues/myqueue'); * * @param callable $handler - * * @return \Closure */ public function __invoke(callable $handler) @@ -101,6 +101,13 @@ public function __invoke(callable $handler) $request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken()); + if ($quotaProject = $this->getQuotaProject()) { + $request = $request->withHeader( + GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER, + $quotaProject + ); + } + return $handler($request, $options); }; } @@ -117,10 +124,25 @@ private function fetchToken() if (array_key_exists('access_token', $auth_tokens)) { // notify the callback if applicable if ($this->tokenCallback) { - call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']); + call_user_func( + $this->tokenCallback, + $this->fetcher->getCacheKey(), + $auth_tokens['access_token'] + ); } return $auth_tokens['access_token']; } + + if (array_key_exists('id_token', $auth_tokens)) { + return $auth_tokens['id_token']; + } + } + + private function getQuotaProject() + { + if ($this->fetcher instanceof GetQuotaProjectInterface) { + return $this->fetcher->getQuotaProject(); + } } } diff --git a/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php b/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php index 55f04d1b..ecbb6596 100644 --- a/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php +++ b/vendor/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php @@ -76,7 +76,8 @@ public function __construct( $this->tokenFunc = $tokenFunc; if (!(is_string($scopes) || is_array($scopes))) { throw new \InvalidArgumentException( - 'wants scope should be string or array'); + 'wants scope should be string or array' + ); } $this->scopes = $scopes; @@ -119,7 +120,6 @@ public function __construct( * $res = $client->get('myproject/taskqueues/myqueue'); * * @param callable $handler - * * @return \Closure */ public function __invoke(callable $handler) diff --git a/vendor/google/auth/src/Middleware/SimpleMiddleware.php b/vendor/google/auth/src/Middleware/SimpleMiddleware.php index c31fc657..5104542b 100644 --- a/vendor/google/auth/src/Middleware/SimpleMiddleware.php +++ b/vendor/google/auth/src/Middleware/SimpleMiddleware.php @@ -71,7 +71,6 @@ public function __construct(array $config) * $res = $client->get('drive/v2/rest'); * * @param callable $handler - * * @return \Closure */ public function __invoke(callable $handler) diff --git a/vendor/google/auth/src/OAuth2.php b/vendor/google/auth/src/OAuth2.php index 3dbceeba..a757b5a3 100644 --- a/vendor/google/auth/src/OAuth2.php +++ b/vendor/google/auth/src/OAuth2.php @@ -17,6 +17,7 @@ namespace Google\Auth; +use Google\Auth\HttpHandler\HttpClientCache; use Google\Auth\HttpHandler\HttpHandlerFactory; use GuzzleHttp\Psr7; use GuzzleHttp\Psr7\Request; @@ -119,7 +120,7 @@ class OAuth2 implements FetchAuthTokenInterface * The scope of the access request, expressed either as an Array or as a * space-delimited string. * - * @var string + * @var array */ private $scope; @@ -174,6 +175,13 @@ class OAuth2 implements FetchAuthTokenInterface */ private $signingKey; + /** + * The signing key id when using assertion profile. Param kid in jwt header + * + * @var string + */ + private $signingKeyId; + /** * The signing algorithm when using an assertion profile. * @@ -293,6 +301,9 @@ class OAuth2 implements FetchAuthTokenInterface * - signingKey * Signing key when using assertion profile * + * - signingKeyId + * Signing key id when using assertion profile + * * - refreshToken * The refresh token associated with the access token * to be refreshed. @@ -326,6 +337,7 @@ public function __construct(array $config) 'sub' => null, 'audience' => null, 'signingKey' => null, + 'signingKeyId' => null, 'signingAlgorithm' => null, 'scope' => null, 'additionalClaims' => [], @@ -344,6 +356,7 @@ public function __construct(array $config) $this->setExpiry($opts['expiry']); $this->setAudience($opts['audience']); $this->setSigningKey($opts['signingKey']); + $this->setSigningKeyId($opts['signingKeyId']); $this->setSigningAlgorithm($opts['signingAlgorithm']); $this->setScope($opts['scope']); $this->setExtensionParams($opts['extensionParams']); @@ -358,11 +371,21 @@ public function __construct(array $config) * - if present, but invalid, raises DomainException. * - otherwise returns the payload in the idtoken as a PHP object. * - * if $publicKey is null, the key is decoded without being verified. + * The behavior of this method varies depending on the version of + * `firebase/php-jwt` you are using. In versions lower than 3.0.0, if + * `$publicKey` is null, the key is decoded without being verified. In + * newer versions, if a public key is not given, this method will throw an + * `\InvalidArgumentException`. * * @param string $publicKey The public key to use to authenticate the token * @param array $allowed_algs List of supported verification algorithms - * + * @throws \DomainException if the token is missing an audience. + * @throws \DomainException if the audience does not match the one set in + * the OAuth2 class instance. + * @throws \UnexpectedValueException If the token is invalid + * @throws SignatureInvalidException If the signature is invalid. + * @throws BeforeValidException If the token is not yet valid. + * @throws ExpiredException If the token has expired. * @return null|object */ public function verifyIdToken($publicKey = null, $allowed_algs = array()) @@ -387,7 +410,6 @@ public function verifyIdToken($publicKey = null, $allowed_algs = array()) * Obtains the encoded jwt from the instance data. * * @param array $config array optional configuration parameters - * * @return string */ public function toJwt(array $config = []) @@ -423,8 +445,12 @@ public function toJwt(array $config = []) } $assertion += $this->getAdditionalClaims(); - return $this->jwtEncode($assertion, $this->getSigningKey(), - $this->getSigningAlgorithm()); + return $this->jwtEncode( + $assertion, + $this->getSigningKey(), + $this->getSigningAlgorithm(), + $this->getSigningKeyId() + ); } /** @@ -489,13 +515,12 @@ public function generateCredentialsRequest() * Fetches the auth tokens based on the current state. * * @param callable $httpHandler callback which delivers psr7 request - * * @return array the response */ public function fetchAuthToken(callable $httpHandler = null) { if (is_null($httpHandler)) { - $httpHandler = HttpHandlerFactory::build(); + $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); } $response = $httpHandler($this->generateCredentialsRequest()); @@ -514,12 +539,14 @@ public function fetchAuthToken(callable $httpHandler = null) */ public function getCacheKey() { - if (is_string($this->scope)) { - return $this->scope; - } elseif (is_array($this->scope)) { + if (is_array($this->scope)) { return implode(':', $this->scope); } + if ($this->audience) { + return $this->audience; + } + // If scope has not set, return null to indicate no caching. return null; } @@ -528,9 +555,7 @@ public function getCacheKey() * Parses the fetched tokens. * * @param ResponseInterface $resp the response. - * * @return array the tokens parsed from the response body. - * * @throws \Exception */ public function parseTokenResponse(ResponseInterface $resp) @@ -543,25 +568,27 @@ public function parseTokenResponse(ResponseInterface $resp) parse_str($body, $res); return $res; - } else { - // Assume it's JSON; if it's not throw an exception - if (null === $res = json_decode($body, true)) { - throw new \Exception('Invalid JSON response'); - } + } - return $res; + // Assume it's JSON; if it's not throw an exception + if (null === $res = json_decode($body, true)) { + throw new \Exception('Invalid JSON response'); } + + return $res; } /** * Updates an OAuth 2.0 client. * - * @example - * client.updateToken([ + * Example: + * ``` + * $oauth->updateToken([ * 'refresh_token' => 'n4E9O119d', * 'access_token' => 'FJQbwq9', * 'expires_in' => 3600 - * ]) + * ]); + * ``` * * @param array $config * The configuration parameters related to the token. @@ -618,16 +645,15 @@ public function updateToken(array $config) * Builds the authorization Uri that the user should be redirected to. * * @param array $config configuration options that customize the return url - * * @return UriInterface the authorization Url. - * * @throws InvalidArgumentException */ public function buildFullAuthorizationUri(array $config = []) { if (is_null($this->getAuthorizationUri())) { throw new InvalidArgumentException( - 'requires an authorizationUri to have been set'); + 'requires an authorizationUri to have been set' + ); } $params = array_merge([ @@ -642,14 +668,16 @@ public function buildFullAuthorizationUri(array $config = []) // Validate the auth_params if (is_null($params['client_id'])) { throw new InvalidArgumentException( - 'missing the required client identifier'); + 'missing the required client identifier' + ); } if (is_null($params['redirect_uri'])) { throw new InvalidArgumentException('missing the required redirect URI'); } if (!empty($params['prompt']) && !empty($params['approval_prompt'])) { throw new InvalidArgumentException( - 'prompt and approval_prompt are mutually exclusive'); + 'prompt and approval_prompt are mutually exclusive' + ); } // Construct the uri object; return it if it is valid. @@ -662,7 +690,8 @@ public function buildFullAuthorizationUri(array $config = []) if ($result->getScheme() != 'https') { throw new InvalidArgumentException( - 'Authorization endpoint must be protected by TLS'); + 'Authorization endpoint must be protected by TLS' + ); } return $result; @@ -740,7 +769,8 @@ public function setRedirectUri($uri) // @see https://developers.google.com/identity/sign-in/web/server-side-flow if ('postmessage' !== (string)$uri) { throw new InvalidArgumentException( - 'Redirect URI must be absolute'); + 'Redirect URI must be absolute' + ); } } $this->redirectUri = (string)$uri; @@ -765,7 +795,6 @@ public function getScope() * a space-delimited String. * * @param string|array $scope - * * @throws InvalidArgumentException */ public function setScope($scope) @@ -779,13 +808,15 @@ public function setScope($scope) $pos = strpos($s, ' '); if ($pos !== false) { throw new InvalidArgumentException( - 'array scope values should not contain spaces'); + 'array scope values should not contain spaces' + ); } } $this->scope = $scope; } else { throw new InvalidArgumentException( - 'scopes should be a string or array of strings'); + 'scopes should be a string or array of strings' + ); } } @@ -804,22 +835,27 @@ public function getGrantType() // state. if (!is_null($this->code)) { return 'authorization_code'; - } elseif (!is_null($this->refreshToken)) { + } + + if (!is_null($this->refreshToken)) { return 'refresh_token'; - } elseif (!is_null($this->username) && !is_null($this->password)) { + } + + if (!is_null($this->username) && !is_null($this->password)) { return 'password'; - } elseif (!is_null($this->issuer) && !is_null($this->signingKey)) { + } + + if (!is_null($this->issuer) && !is_null($this->signingKey)) { return self::JWT_URN; - } else { - return null; } + + return null; } /** * Sets the current grant type. * * @param $grantType - * * @throws InvalidArgumentException */ public function setGrantType($grantType) @@ -830,7 +866,8 @@ public function setGrantType($grantType) // validate URI if (!$this->isAbsoluteUri($grantType)) { throw new InvalidArgumentException( - 'invalid grant type'); + 'invalid grant type' + ); } $this->grantType = (string)$grantType; } @@ -1022,6 +1059,26 @@ public function setSigningKey($signingKey) $this->signingKey = $signingKey; } + /** + * Gets the signing key id when using an assertion profile. + * + * @return string + */ + public function getSigningKeyId() + { + return $this->signingKeyId; + } + + /** + * Sets the signing key id when using an assertion profile. + * + * @param string $signingKeyId + */ + public function setSigningKeyId($signingKeyId) + { + $this->signingKeyId = $signingKeyId; + } + /** * Gets the signing algorithm when using an assertion profile. * @@ -1119,7 +1176,9 @@ public function getExpiresAt() { if (!is_null($this->expiresAt)) { return $this->expiresAt; - } elseif (!is_null($this->issuedAt) && !is_null($this->expiresIn)) { + } + + if (!is_null($this->issuedAt) && !is_null($this->expiresIn)) { return $this->issuedAt + $this->expiresIn; } @@ -1244,25 +1303,56 @@ public function getAdditionalClaims() /** * The expiration of the last received token. * - * @return array + * @return array|null */ public function getLastReceivedToken() { if ($token = $this->getAccessToken()) { - return [ + // the bare necessity of an auth token + $authToken = [ 'access_token' => $token, 'expires_at' => $this->getExpiresAt(), ]; + } elseif ($idToken = $this->getIdToken()) { + $authToken = [ + 'id_token' => $idToken, + 'expires_at' => $this->getExpiresAt(), + ]; + } else { + return null; } - return null; + if ($expiresIn = $this->getExpiresIn()) { + $authToken['expires_in'] = $expiresIn; + } + if ($issuedAt = $this->getIssuedAt()) { + $authToken['issued_at'] = $issuedAt; + } + if ($refreshToken = $this->getRefreshToken()) { + $authToken['refresh_token'] = $refreshToken; + } + + return $authToken; + } + + /** + * Get the client ID. + * + * Alias of {@see Google\Auth\OAuth2::getClientId()}. + * + * @param callable $httpHandler + * @return string + * @access private + */ + public function getClientName(callable $httpHandler = null) + { + return $this->getClientId(); } /** * @todo handle uri as array * * @param string $uri - * * @return null|UriInterface */ private function coerceUri($uri) @@ -1278,7 +1368,6 @@ private function coerceUri($uri) * @param string $idToken * @param string|array|null $publicKey * @param array $allowedAlgs - * * @return object */ private function jwtDecode($idToken, $publicKey, $allowedAlgs) @@ -1290,14 +1379,18 @@ private function jwtDecode($idToken, $publicKey, $allowedAlgs) return \JWT::decode($idToken, $publicKey, $allowedAlgs); } - private function jwtEncode($assertion, $signingKey, $signingAlgorithm) + private function jwtEncode($assertion, $signingKey, $signingAlgorithm, $signingKeyId = null) { if (class_exists('Firebase\JWT\JWT')) { - return \Firebase\JWT\JWT::encode($assertion, $signingKey, - $signingAlgorithm); + return \Firebase\JWT\JWT::encode( + $assertion, + $signingKey, + $signingAlgorithm, + $signingKeyId + ); } - return \JWT::encode($assertion, $signingKey, $signingAlgorithm); + return \JWT::encode($assertion, $signingKey, $signingAlgorithm, $signingKeyId); } /** @@ -1305,7 +1398,6 @@ private function jwtEncode($assertion, $signingKey, $signingAlgorithm) * (RFC 3986). * * @param string $uri - * * @return bool */ private function isAbsoluteUri($uri) @@ -1317,7 +1409,6 @@ private function isAbsoluteUri($uri) /** * @param array $params - * * @return array */ private function addClientCredentials(&$params) diff --git a/vendor/google/auth/src/ProjectIdProviderInterface.php b/vendor/google/auth/src/ProjectIdProviderInterface.php new file mode 100644 index 00000000..0a41f783 --- /dev/null +++ b/vendor/google/auth/src/ProjectIdProviderInterface.php @@ -0,0 +1,32 @@ +auth->getSigningKey(); + + $signedString = ''; + if (class_exists('\\phpseclib\\Crypt\\RSA') && !$forceOpenssl) { + $rsa = new RSA; + $rsa->loadKey($privateKey); + $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); + $rsa->setHash('sha256'); + + $signedString = $rsa->sign($stringToSign); + } elseif (extension_loaded('openssl')) { + openssl_sign($stringToSign, $signedString, $privateKey, 'sha256WithRSAEncryption'); + } else { + // @codeCoverageIgnoreStart + throw new \RuntimeException('OpenSSL is not installed.'); + } + // @codeCoverageIgnoreEnd + + return base64_encode($signedString); + } +} diff --git a/vendor/google/auth/src/SignBlobInterface.php b/vendor/google/auth/src/SignBlobInterface.php new file mode 100644 index 00000000..5f2c9441 --- /dev/null +++ b/vendor/google/auth/src/SignBlobInterface.php @@ -0,0 +1,44 @@ +.]; - * $oauth2 = new OAuth2($config) - * $subscriber = new AuthTokenSubscriber($oauth2); + * $config = [...]; + * $oauth2 = new OAuth2($config) + * $subscriber = new AuthTokenSubscriber($oauth2); * - * $client = new Client([ - * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', - * 'defaults' => ['auth' => 'google_auth'] - * ]); - * $client->getEmitter()->attach($subscriber); + * $client = new Client([ + * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'defaults' => ['auth' => 'google_auth'] + * ]); + * $client->getEmitter()->attach($subscriber); * - * $res = $client->get('myproject/taskqueues/myqueue'); + * $res = $client->get('myproject/taskqueues/myqueue'); + * ``` * * @param BeforeEvent $event */ @@ -114,5 +118,19 @@ public function onBefore(BeforeEvent $event) call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']); } } + + if ($quotaProject = $this->getQuotaProject()) { + $request->setHeader( + GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER, + $quotaProject + ); + } + } + + private function getQuotaProject() + { + if ($this->fetcher instanceof GetQuotaProjectInterface) { + return $this->fetcher->getQuotaProject(); + } } } diff --git a/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php b/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php index 63b4ca2a..a52dccef 100644 --- a/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php +++ b/vendor/google/auth/src/Subscriber/ScopedAccessTokenSubscriber.php @@ -78,7 +78,8 @@ public function __construct( $this->tokenFunc = $tokenFunc; if (!(is_string($scopes) || is_array($scopes))) { throw new \InvalidArgumentException( - 'wants scope should be string or array'); + 'wants scope should be string or array' + ); } $this->scopes = $scopes; @@ -102,28 +103,30 @@ public function getEvents() /** * Updates the request with an Authorization header when auth is 'scoped'. * - * E.g this could be used to authenticate using the AppEngine - * AppIdentityService. + * E.g this could be used to authenticate using the AppEngine AppIdentityService. * - * use google\appengine\api\app_identity\AppIdentityService; - * use Google\Auth\Subscriber\ScopedAccessTokenSubscriber; - * use GuzzleHttp\Client; + * Example: + * ``` + * use google\appengine\api\app_identity\AppIdentityService; + * use Google\Auth\Subscriber\ScopedAccessTokenSubscriber; + * use GuzzleHttp\Client; * - * $scope = 'https://www.googleapis.com/auth/taskqueue' - * $subscriber = new ScopedAccessToken( - * 'AppIdentityService::getAccessToken', - * $scope, - * ['prefix' => 'Google\Auth\ScopedAccessToken::'], - * $cache = new Memcache() - * ); + * $scope = 'https://www.googleapis.com/auth/taskqueue' + * $subscriber = new ScopedAccessToken( + * 'AppIdentityService::getAccessToken', + * $scope, + * ['prefix' => 'Google\Auth\ScopedAccessToken::'], + * $cache = new Memcache() + * ); * - * $client = new Client([ - * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', - * 'defaults' => ['auth' => 'scoped'] - * ]); - * $client->getEmitter()->attach($subscriber); + * $client = new Client([ + * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', + * 'defaults' => ['auth' => 'scoped'] + * ]); + * $client->getEmitter()->attach($subscriber); * - * $res = $client->get('myproject/taskqueues/myqueue'); + * $res = $client->get('myproject/taskqueues/myqueue'); + * ``` * * @param BeforeEvent $event */ diff --git a/vendor/google/auth/src/Subscriber/SimpleSubscriber.php b/vendor/google/auth/src/Subscriber/SimpleSubscriber.php index 0c567313..a881eb19 100644 --- a/vendor/google/auth/src/Subscriber/SimpleSubscriber.php +++ b/vendor/google/auth/src/Subscriber/SimpleSubscriber.php @@ -62,19 +62,22 @@ public function getEvents() /** * Updates the request query with the developer key if auth is set to simple. * - * use Google\Auth\Subscriber\SimpleSubscriber; - * use GuzzleHttp\Client; + * Example: + * ``` + * use Google\Auth\Subscriber\SimpleSubscriber; + * use GuzzleHttp\Client; * - * $my_key = 'is not the same as yours'; - * $subscriber = new SimpleSubscriber(['key' => $my_key]); + * $my_key = 'is not the same as yours'; + * $subscriber = new SimpleSubscriber(['key' => $my_key]); * - * $client = new Client([ - * 'base_url' => 'https://www.googleapis.com/discovery/v1/', - * 'defaults' => ['auth' => 'simple'] - * ]); - * $client->getEmitter()->attach($subscriber); + * $client = new Client([ + * 'base_url' => 'https://www.googleapis.com/discovery/v1/', + * 'defaults' => ['auth' => 'simple'] + * ]); + * $client->getEmitter()->attach($subscriber); * - * $res = $client->get('drive/v2/rest'); + * $res = $client->get('drive/v2/rest'); + * ``` * * @param BeforeEvent $event */ diff --git a/vendor/google/auth/src/UpdateMetadataInterface.php b/vendor/google/auth/src/UpdateMetadataInterface.php new file mode 100644 index 00000000..d28b75c5 --- /dev/null +++ b/vendor/google/auth/src/UpdateMetadataInterface.php @@ -0,0 +1,41 @@ +originalHome = getenv('HOME'); - } - - protected function tearDown() - { - if ($this->originalHome != getenv('HOME')) { - putenv('HOME=' . $this->originalHome); - } - putenv(ServiceAccountCredentials::ENV_VAR); // removes it from - } - - /** - * @expectedException DomainException - */ - public function testIsFailsEnvSpecifiesNonExistentFile() - { - $keyFile = __DIR__ . '/fixtures' . '/does-not-exist-private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - ApplicationDefaultCredentials::getCredentials('a scope'); - } - - public function testLoadsOKIfEnvSpecifiedIsValid() - { - $keyFile = __DIR__ . '/fixtures' . '/private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - $this->assertNotNull( - ApplicationDefaultCredentials::getCredentials('a scope') - ); - } - - public function testLoadsDefaultFileIfPresentAndEnvVarIsNotSet() - { - putenv('HOME=' . __DIR__ . '/fixtures'); - $this->assertNotNull( - ApplicationDefaultCredentials::getCredentials('a scope') - ); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfNotOnGceAndNoDefaultFileFound() - { - putenv('HOME=' . __DIR__ . '/not_exist_fixtures'); - // simulate not being GCE by return 500 - $httpHandler = getHandler([ - buildResponse(500), - ]); - - ApplicationDefaultCredentials::getCredentials('a scope', $httpHandler); - } - - public function testSuccedsIfNoDefaultFilesButIsOnGCE() - { - $wantedTokens = [ - 'access_token' => '1/abdef1234567890', - 'expires_in' => '57', - 'token_type' => 'Bearer', - ]; - $jsonTokens = json_encode($wantedTokens); - - // simulate the response from GCE. - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - buildResponse(200, [], Psr7\stream_for($jsonTokens)), - ]); - - $this->assertNotNull( - ApplicationDefaultCredentials::getCredentials('a scope', $httpHandler) - ); - } -} - -class ADCGetMiddlewareTest extends TestCase -{ - private $originalHome; - - protected function setUp() - { - $this->originalHome = getenv('HOME'); - } - - protected function tearDown() - { - if ($this->originalHome != getenv('HOME')) { - putenv('HOME=' . $this->originalHome); - } - putenv(ServiceAccountCredentials::ENV_VAR); // removes it if assigned - } - - /** - * @expectedException DomainException - */ - public function testIsFailsEnvSpecifiesNonExistentFile() - { - $keyFile = __DIR__ . '/fixtures' . '/does-not-exist-private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - ApplicationDefaultCredentials::getMiddleware('a scope'); - } - - public function testLoadsOKIfEnvSpecifiedIsValid() - { - $keyFile = __DIR__ . '/fixtures' . '/private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - $this->assertNotNull(ApplicationDefaultCredentials::getMiddleware('a scope')); - } - - public function testLoadsDefaultFileIfPresentAndEnvVarIsNotSet() - { - putenv('HOME=' . __DIR__ . '/fixtures'); - $this->assertNotNull(ApplicationDefaultCredentials::getMiddleware('a scope')); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfNotOnGceAndNoDefaultFileFound() - { - putenv('HOME=' . __DIR__ . '/not_exist_fixtures'); - - // simulate not being GCE by return 500 - $httpHandler = getHandler([ - buildResponse(500), - ]); - - ApplicationDefaultCredentials::getMiddleware('a scope', $httpHandler); - } - - public function testWithCacheOptions() - { - $keyFile = __DIR__ . '/fixtures' . '/private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - - $httpHandler = getHandler([ - buildResponse(200), - ]); - - $cacheOptions = []; - $cachePool = $this->getMock('Psr\Cache\CacheItemPoolInterface'); - - $middleware = ApplicationDefaultCredentials::getMiddleware( - 'a scope', - $httpHandler, - $cacheOptions, - $cachePool - ); - } - - public function testSuccedsIfNoDefaultFilesButIsOnGCE() - { - $wantedTokens = [ - 'access_token' => '1/abdef1234567890', - 'expires_in' => '57', - 'token_type' => 'Bearer', - ]; - $jsonTokens = json_encode($wantedTokens); - - // simulate the response from GCE. - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - buildResponse(200, [], Psr7\stream_for($jsonTokens)), - ]); - - $this->assertNotNull(ApplicationDefaultCredentials::getMiddleware('a scope', $httpHandler)); - } -} - -class ADCGetCredentialsAppEngineTest extends BaseTest -{ - private $originalHome; - private $originalServiceAccount; - - protected function setUp() - { - // set home to be somewhere else - $this->originalHome = getenv('HOME'); - putenv('HOME=' . __DIR__ . '/not_exist_fixtures'); - - // remove service account path - $this->originalServiceAccount = getenv(ServiceAccountCredentials::ENV_VAR); - putenv(ServiceAccountCredentials::ENV_VAR); - } - - protected function tearDown() - { - // removes it if assigned - putenv('HOME=' . $this->originalHome); - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $this->originalServiceAccount); - } - - public function testAppEngineStandard() - { - $_SERVER['SERVER_SOFTWARE'] = 'Google App Engine'; - $this->assertInstanceOf( - 'Google\Auth\Credentials\AppIdentityCredentials', - ApplicationDefaultCredentials::getCredentials() - ); - } - - public function testAppEngineFlexible() - { - $_SERVER['SERVER_SOFTWARE'] = 'Google App Engine'; - $_SERVER['GAE_VM'] = 'true'; - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - ]); - $this->assertInstanceOf( - 'Google\Auth\Credentials\GCECredentials', - ApplicationDefaultCredentials::getCredentials(null, $httpHandler) - ); - } -} - -// @todo consider a way to DRY this and above class up -class ADCGetSubscriberTest extends BaseTest -{ - private $originalHome; - - protected function setUp() - { - $this->onlyGuzzle5(); - - $this->originalHome = getenv('HOME'); - } - - protected function tearDown() - { - if ($this->originalHome != getenv('HOME')) { - putenv('HOME=' . $this->originalHome); - } - putenv(ServiceAccountCredentials::ENV_VAR); // removes it if assigned - } - - /** - * @expectedException DomainException - */ - public function testIsFailsEnvSpecifiesNonExistentFile() - { - $keyFile = __DIR__ . '/fixtures' . '/does-not-exist-private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - ApplicationDefaultCredentials::getSubscriber('a scope'); - } - - public function testLoadsOKIfEnvSpecifiedIsValid() - { - $keyFile = __DIR__ . '/fixtures' . '/private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - $this->assertNotNull(ApplicationDefaultCredentials::getSubscriber('a scope')); - } - - public function testLoadsDefaultFileIfPresentAndEnvVarIsNotSet() - { - putenv('HOME=' . __DIR__ . '/fixtures'); - $this->assertNotNull(ApplicationDefaultCredentials::getSubscriber('a scope')); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfNotOnGceAndNoDefaultFileFound() - { - putenv('HOME=' . __DIR__ . '/not_exist_fixtures'); - - // simulate not being GCE by return 500 - $httpHandler = getHandler([ - buildResponse(500), - ]); - - ApplicationDefaultCredentials::getSubscriber('a scope', $httpHandler); - } - - public function testWithCacheOptions() - { - $keyFile = __DIR__ . '/fixtures' . '/private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - - $httpHandler = getHandler([ - buildResponse(200), - ]); - - $cacheOptions = []; - $cachePool = $this->getMock('Psr\Cache\CacheItemPoolInterface'); - - $subscriber = ApplicationDefaultCredentials::getSubscriber( - 'a scope', - $httpHandler, - $cacheOptions, - $cachePool - ); - } - - public function testSuccedsIfNoDefaultFilesButIsOnGCE() - { - $wantedTokens = [ - 'access_token' => '1/abdef1234567890', - 'expires_in' => '57', - 'token_type' => 'Bearer', - ]; - $jsonTokens = json_encode($wantedTokens); - - // simulate the response from GCE. - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - buildResponse(200, [], Psr7\stream_for($jsonTokens)), - ]); - - $this->assertNotNull(ApplicationDefaultCredentials::getSubscriber('a scope', $httpHandler)); - } -} diff --git a/vendor/google/auth/tests/BaseTest.php b/vendor/google/auth/tests/BaseTest.php deleted file mode 100644 index 05bded0a..00000000 --- a/vendor/google/auth/tests/BaseTest.php +++ /dev/null @@ -1,33 +0,0 @@ -markTestSkipped('Guzzle 6 only'); - } - } - - public function onlyGuzzle5() - { - $version = ClientInterface::VERSION; - if ('5' !== $version[0]) { - $this->markTestSkipped('Guzzle 5 only'); - } - } - - /** - * @see Google\Auth\$this->getValidKeyName - */ - public function getValidKeyName($key) - { - return preg_replace('|[^a-zA-Z0-9_\.! ]|', '', $key); - } -} diff --git a/vendor/google/auth/tests/Cache/ItemTest.php b/vendor/google/auth/tests/Cache/ItemTest.php deleted file mode 100644 index ed52176a..00000000 --- a/vendor/google/auth/tests/Cache/ItemTest.php +++ /dev/null @@ -1,126 +0,0 @@ -assertEquals($key, $this->getItem($key)->getKey()); - } - - public function testGetsNull() - { - $item = $this->getItem('item'); - - $this->assertNull($item->get()); - $this->assertFalse($item->isHit()); - } - - public function testGetsValue() - { - $value = 'value'; - $item = $this->getItem('item'); - $item->set($value); - - $this->assertEquals('value', $item->get()); - } - - /** - * @dataProvider values - */ - public function testSetsValue($value) - { - $item = $this->getItem('item'); - $item->set($value); - - $this->assertEquals($value, $item->get()); - } - - public function values() - { - return [ - [1], - [1.5], - [true], - [null], - [new \DateTime()], - [['test']], - ['value'] - ]; - } - - public function testIsHit() - { - $item = $this->getItem('item'); - - $this->assertFalse($item->isHit()); - - $item->set('value'); - - $this->assertTrue($item->isHit()); - } - - public function testExpiresAt() - { - $item = $this->getItem('item'); - $item->set('value'); - $item->expiresAt(new \DateTime('now + 1 hour')); - - $this->assertTrue($item->isHit()); - - $item->expiresAt(null); - - $this->assertTrue($item->isHit()); - - $item->expiresAt(new \DateTime('yesterday')); - - $this->assertFalse($item->isHit()); - } - - public function testExpiresAfter() - { - $item = $this->getItem('item'); - $item->set('value'); - $item->expiresAfter(30); - - $this->assertTrue($item->isHit()); - - $item->expiresAfter(0); - - $this->assertFalse($item->isHit()); - - $item->expiresAfter(new \DateInterval('PT30S')); - - $this->assertTrue($item->isHit()); - - $item->expiresAfter(null); - - $this->assertTrue($item->isHit()); - } -} diff --git a/vendor/google/auth/tests/Cache/MemoryCacheItemPoolTest.php b/vendor/google/auth/tests/Cache/MemoryCacheItemPoolTest.php deleted file mode 100644 index 153e70df..00000000 --- a/vendor/google/auth/tests/Cache/MemoryCacheItemPoolTest.php +++ /dev/null @@ -1,222 +0,0 @@ -pool = new MemoryCacheItemPool(); - } - - public function saveItem($key, $value) - { - $item = $this->pool->getItem($key); - $item->set($value); - $this->assertTrue($this->pool->save($item)); - - return $item; - } - - public function testGetsFreshItem() - { - $item = $this->pool->getItem('item'); - - $this->assertInstanceOf('Google\Auth\Cache\Item', $item); - $this->assertNull($item->get()); - $this->assertFalse($item->isHit()); - } - - public function testGetsExistingItem() - { - $key = 'item'; - $value = 'value'; - $this->saveItem($key, $value); - $item = $this->pool->getItem($key); - - $this->assertInstanceOf('Google\Auth\Cache\Item', $item); - $this->assertEquals($value, $item->get()); - $this->assertTrue($item->isHit()); - } - - public function testGetsMultipleItems() - { - $keys = ['item1', 'item2']; - $items = $this->pool->getItems($keys); - - $this->assertEquals($keys, array_keys($items)); - $this->assertContainsOnlyInstancesOf('Google\Auth\Cache\Item', $items); - } - - public function testHasItem() - { - $existsKey = 'does-exist'; - $this->saveItem($existsKey, 'value'); - - $this->assertTrue($this->pool->hasItem($existsKey)); - $this->assertFalse($this->pool->hasItem('does-not-exist')); - } - - public function testClear() - { - $key = 'item'; - $this->saveItem($key, 'value'); - - $this->assertTrue($this->pool->hasItem($key)); - $this->assertTrue($this->pool->clear()); - $this->assertFalse($this->pool->hasItem($key)); - } - - public function testDeletesItem() - { - $key = 'item'; - $this->saveItem($key, 'value'); - - $this->assertTrue($this->pool->deleteItem($key)); - $this->assertFalse($this->pool->hasItem($key)); - } - - public function testDeletesItems() - { - $keys = ['item1', 'item2']; - - foreach ($keys as $key) { - $this->saveItem($key, 'value'); - } - - $this->assertTrue($this->pool->deleteItems($keys)); - $this->assertFalse($this->pool->hasItem($keys[0])); - $this->assertFalse($this->pool->hasItem($keys[1])); - } - - public function testDoesNotDeleteItemsWithInvalidKey() - { - $keys = ['item1', '{item2}', 'item3']; - $value = 'value'; - $this->saveItem($keys[0], $value); - $this->saveItem($keys[2], $value); - - try { - $this->pool->deleteItems($keys); - } catch (InvalidArgumentException $ex) { - // continue execution - } - - $this->assertTrue($this->pool->hasItem($keys[0])); - $this->assertTrue($this->pool->hasItem($keys[2])); - } - - public function testSavesItem() - { - $key = 'item'; - $this->saveItem($key, 'value'); - - $this->assertTrue($this->pool->hasItem($key)); - } - - public function testSavesDeferredItem() - { - $item = $this->pool->getItem('item'); - $this->assertTrue($this->pool->saveDeferred($item)); - } - - public function testCommitsDeferredItems() - { - $keys = ['item1', 'item2']; - - foreach ($keys as $key) { - $item = $this->pool->getItem($key); - $item->set('value'); - $this->pool->saveDeferred($item); - } - - $this->assertTrue($this->pool->commit()); - $this->assertTrue($this->pool->hasItem($keys[0])); - $this->assertTrue($this->pool->hasItem($keys[1])); - } - - /** - * @expectedException \Psr\Cache\InvalidArgumentException - * @dataProvider invalidKeys - */ - public function testCheckInvalidKeysOnGetItem($key) - { - $this->pool->getItem($key); - } - - /** - * @expectedException \Psr\Cache\InvalidArgumentException - * @dataProvider invalidKeys - */ - public function testCheckInvalidKeysOnGetItems($key) - { - $this->pool->getItems([$key]); - } - - /** - * @expectedException \Psr\Cache\InvalidArgumentException - * @dataProvider invalidKeys - */ - public function testCheckInvalidKeysOnHasItem($key) - { - $this->pool->hasItem($key); - } - - /** - * @expectedException \Psr\Cache\InvalidArgumentException - * @dataProvider invalidKeys - */ - public function testCheckInvalidKeysOnDeleteItem($key) - { - $this->pool->deleteItem($key); - } - - /** - * @expectedException \Psr\Cache\InvalidArgumentException - * @dataProvider invalidKeys - */ - public function testCheckInvalidKeysOnDeleteItems($key) - { - $this->pool->deleteItems([$key]); - } - - public function invalidKeys() - { - return [ - [1], - [true], - [null], - [new \DateTime()], - ['{'], - ['}'], - ['('], - [')'], - ['/'], - ['\\'], - ['@'], - [':'], - [[]] - ]; - } -} diff --git a/vendor/google/auth/tests/CacheTraitTest.php b/vendor/google/auth/tests/CacheTraitTest.php deleted file mode 100644 index 86d36e19..00000000 --- a/vendor/google/auth/tests/CacheTraitTest.php +++ /dev/null @@ -1,214 +0,0 @@ -mockFetcher = - $this - ->getMockBuilder('Google\Auth\FetchAuthTokenInterface') - ->getMock(); - $this->mockCacheItem = - $this - ->getMockBuilder('Psr\Cache\CacheItemInterface') - ->getMock(); - $this->mockCache = - $this - ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') - ->getMock(); - } - - public function testSuccessfullyPullsFromCache() - { - $expectedValue = '1234'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($expectedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->will($this->returnValue($this->mockCacheItem)); - - $implementation = new CacheTraitImplementation([ - 'cache' => $this->mockCache, - ]); - - $cachedValue = $implementation->gCachedValue(); - $this->assertEquals($expectedValue, $cachedValue); - } - - public function testSuccessfullyPullsFromCacheWithInvalidKey() - { - $key = 'this-key-has-@-illegal-characters'; - $expectedKey = 'thiskeyhasillegalcharacters'; - $expectedValue = '1234'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($expectedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($expectedKey) - ->will($this->returnValue($this->mockCacheItem)); - - $implementation = new CacheTraitImplementation([ - 'cache' => $this->mockCache, - 'key' => $key, - ]); - - $cachedValue = $implementation->gCachedValue(); - $this->assertEquals($expectedValue, $cachedValue); - } - - public function testSuccessfullyPullsFromCacheWithLongKey() - { - $key = 'this-key-is-over-64-characters-and-it-will-still-work' - . '-but-it-will-be-hashed-and-shortened'; - $expectedKey = str_replace('-', '', $key); - $expectedKey = substr(hash('sha256', $expectedKey), 0, 64); - $expectedValue = '1234'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($expectedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($expectedKey) - ->will($this->returnValue($this->mockCacheItem)); - - $implementation = new CacheTraitImplementation([ - 'cache' => $this->mockCache, - 'key' => $key - ]); - - $cachedValue = $implementation->gCachedValue(); - $this->assertEquals($expectedValue, $cachedValue); - } - - public function testFailsPullFromCacheWithNoCache() - { - $implementation = new CacheTraitImplementation(); - - $cachedValue = $implementation->gCachedValue(); - $this->assertEquals(null, $cachedValue); - } - - public function testFailsPullFromCacheWithoutKey() - { - $implementation = new CacheTraitImplementation([ - 'cache' => $this->mockCache, - 'key' => null, - ]); - - $cachedValue = $implementation->gCachedValue(); - } - - public function testSuccessfullySetsToCache() - { - $value = '1234'; - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($value); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo('key')) - ->will($this->returnValue($this->mockCacheItem)); - - $implementation = new CacheTraitImplementation([ - 'cache' => $this->mockCache, - ]); - - $implementation->sCachedValue($value); - } - - public function testFailsSetToCacheWithNoCache() - { - $implementation = new CacheTraitImplementation(); - - $implementation->sCachedValue('1234'); - - $cachedValue = $implementation->sCachedValue('1234'); - $this->assertNull($cachedValue); - } - - public function testFailsSetToCacheWithoutKey() - { - $implementation = new CacheTraitImplementation([ - 'cache' => $this->mockCache, - 'key' => null, - ]); - - $cachedValue = $implementation->sCachedValue('1234'); - $this->assertNull($cachedValue); - } -} - -class CacheTraitImplementation -{ - use CacheTrait; - - private $cache; - private $cacheConfig; - - public function __construct(array $config = []) - { - $this->key = array_key_exists('key', $config) ? $config['key'] : 'key'; - $this->cache = isset($config['cache']) ? $config['cache'] : null; - $this->cacheConfig = [ - 'prefix' => '', - 'lifetime' => 1000, - ]; - } - - // allows us to keep trait methods private - public function gCachedValue() - { - return $this->getCachedValue($this->key); - } - - public function sCachedValue($v) - { - $this->setCachedValue($this->key, $v); - } -} diff --git a/vendor/google/auth/tests/Credentials/AppIndentityCredentialsTest.php b/vendor/google/auth/tests/Credentials/AppIndentityCredentialsTest.php deleted file mode 100644 index d43714aa..00000000 --- a/vendor/google/auth/tests/Credentials/AppIndentityCredentialsTest.php +++ /dev/null @@ -1,111 +0,0 @@ -assertFalse(AppIdentityCredentials::onAppEngine()); - } - - public function testIsTrueWhenServerSoftwareIsGoogleAppEngine() - { - $_SERVER['SERVER_SOFTWARE'] = 'Google App Engine'; - $this->assertTrue(AppIdentityCredentials::onAppEngine()); - } - - public function testIsTrueWhenAppEngineRuntimeIsPhp() - { - $_SERVER['APPENGINE_RUNTIME'] = 'php'; - $this->assertTrue(AppIdentityCredentials::onAppEngine()); - } -} - -class AppIdentityCredentialsGetCacheKeyTest extends TestCase -{ - public function testShouldBeEmpty() - { - $g = new AppIdentityCredentials(); - $this->assertEmpty($g->getCacheKey()); - } -} - -class AppIdentityCredentialsFetchAuthTokenTest extends TestCase -{ - public function testShouldBeEmptyIfNotOnAppEngine() - { - $g = new AppIdentityCredentials(); - $this->assertEquals(array(), $g->fetchAuthToken()); - } - - /* @expectedException */ - public function testThrowsExceptionIfClassDoesntExist() - { - $_SERVER['SERVER_SOFTWARE'] = 'Google App Engine'; - $g = new AppIdentityCredentials(); - } - - public function testReturnsExpectedToken() - { - // include the mock AppIdentityService class - require_once __DIR__ . '/../mocks/AppIdentityService.php'; - - $wantedToken = [ - 'access_token' => '1/abdef1234567890', - 'expires_in' => '57', - 'token_type' => 'Bearer', - ]; - - AppIdentityService::$accessToken = $wantedToken; - - $_SERVER['SERVER_SOFTWARE'] = 'Google App Engine'; - - $g = new AppIdentityCredentials(); - $this->assertEquals($wantedToken, $g->fetchAuthToken()); - } - - public function testScopeIsAlwaysArray() - { - // include the mock AppIdentityService class - require_once __DIR__ . '/../mocks/AppIdentityService.php'; - - $scope1 = ['scopeA', 'scopeB']; - $scope2 = 'scopeA scopeB'; - $scope3 = 'scopeA'; - - $_SERVER['SERVER_SOFTWARE'] = 'Google App Engine'; - - $g = new AppIdentityCredentials($scope1); - $g->fetchAuthToken(); - $this->assertEquals($scope1, AppIdentityService::$scope); - - $g = new AppIdentityCredentials($scope2); - $g->fetchAuthToken(); - $this->assertEquals(explode(' ', $scope2), AppIdentityService::$scope); - - $g = new AppIdentityCredentials($scope3); - $g->fetchAuthToken(); - $this->assertEquals([$scope3], AppIdentityService::$scope); - } -} diff --git a/vendor/google/auth/tests/Credentials/GCECredentialsTest.php b/vendor/google/auth/tests/Credentials/GCECredentialsTest.php deleted file mode 100644 index 8e23a0ff..00000000 --- a/vendor/google/auth/tests/Credentials/GCECredentialsTest.php +++ /dev/null @@ -1,125 +0,0 @@ -assertFalse(GCECredentials::onGCE($httpHandler)); - } - - public function testIsFalseOnServerErrorStatus() - { - $httpHandler = getHandler([ - buildResponse(500), - ]); - $this->assertFalse(GCECredentials::onGCE($httpHandler)); - } - - public function testIsFalseOnOkStatusWithoutExpectedHeader() - { - $httpHandler = getHandler([ - buildResponse(200), - ]); - $this->assertFalse(GCECredentials::onGCE($httpHandler)); - } - - public function testIsOkIfGoogleIsTheFlavor() - { - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - ]); - $this->assertTrue(GCECredentials::onGCE($httpHandler)); - } -} - -class GCECredentialsOnAppEngineFlexibleTest extends TestCase -{ - public function testIsFalseByDefault() - { - $this->assertFalse(GCECredentials::onAppEngineFlexible()); - } - - public function testIsTrueWhenGaeVmIsTrue() - { - $_SERVER['GAE_VM'] = 'true'; - $this->assertTrue(GCECredentials::onAppEngineFlexible()); - } -} - -class GCECredentialsGetCacheKeyTest extends TestCase -{ - public function testShouldNotBeEmpty() - { - $g = new GCECredentials(); - $this->assertNotEmpty($g->getCacheKey()); - } -} - -class GCECredentialsFetchAuthTokenTest extends TestCase -{ - public function testShouldBeEmptyIfNotOnGCE() - { - $httpHandler = getHandler([ - buildResponse(500), - ]); - $g = new GCECredentials(); - $this->assertEquals(array(), $g->fetchAuthToken($httpHandler)); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage Invalid JSON response - */ - public function testShouldFailIfResponseIsNotJson() - { - $notJson = '{"foo": , this is cannot be passed as json" "bar"}'; - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - buildResponse(200, [], $notJson), - ]); - $g = new GCECredentials(); - $g->fetchAuthToken($httpHandler); - } - - public function testShouldReturnTokenInfo() - { - $wantedTokens = [ - 'access_token' => '1/abdef1234567890', - 'expires_in' => '57', - 'token_type' => 'Bearer', - ]; - $jsonTokens = json_encode($wantedTokens); - $httpHandler = getHandler([ - buildResponse(200, [GCECredentials::FLAVOR_HEADER => 'Google']), - buildResponse(200, [], Psr7\stream_for($jsonTokens)), - ]); - $g = new GCECredentials(); - $this->assertEquals($wantedTokens, $g->fetchAuthToken($httpHandler)); - $this->assertEquals(time() + 57, $g->getLastReceivedToken()['expires_at']); - } -} diff --git a/vendor/google/auth/tests/Credentials/IAMCredentialsTest.php b/vendor/google/auth/tests/Credentials/IAMCredentialsTest.php deleted file mode 100644 index 86cd5741..00000000 --- a/vendor/google/auth/tests/Credentials/IAMCredentialsTest.php +++ /dev/null @@ -1,82 +0,0 @@ -assertNotNull( - new IAMCredentials('iam-selector', 'iam-token') - ); - } -} - -class IAMUpdateMetadataCallbackTest extends TestCase -{ - public function testUpdateMetadataFunc() - { - $selector = 'iam-selector'; - $token = 'iam-token'; - $iam = new IAMCredentials( - $selector, - $token - ); - - $update_metadata = $iam->getUpdateMetadataFunc(); - $this->assertInternalType('callable', $update_metadata); - - $actual_metadata = call_user_func($update_metadata, - $metadata = array('foo' => 'bar')); - $this->assertArrayHasKey(IAMCredentials::SELECTOR_KEY, $actual_metadata); - $this->assertEquals( - $actual_metadata[IAMCredentials::SELECTOR_KEY], - $selector); - $this->assertArrayHasKey(IAMCredentials::TOKEN_KEY, $actual_metadata); - $this->assertEquals( - $actual_metadata[IAMCredentials::TOKEN_KEY], - $token); - } -} diff --git a/vendor/google/auth/tests/Credentials/ServiceAccountCredentialsTest.php b/vendor/google/auth/tests/Credentials/ServiceAccountCredentialsTest.php deleted file mode 100644 index 3a0beb47..00000000 --- a/vendor/google/auth/tests/Credentials/ServiceAccountCredentialsTest.php +++ /dev/null @@ -1,521 +0,0 @@ - 'key123', - 'private_key' => 'privatekey', - 'client_email' => 'test@example.com', - 'client_id' => 'client123', - 'type' => 'service_account', - ]; -} - -class SACGetCacheKeyTest extends TestCase -{ - public function testShouldBeTheSameAsOAuth2WithTheSameScope() - { - $testJson = createTestJson(); - $scope = ['scope/1', 'scope/2']; - $sa = new ServiceAccountCredentials( - $scope, - $testJson); - $o = new OAuth2(['scope' => $scope]); - $this->assertSame( - $testJson['client_email'] . ':' . $o->getCacheKey(), - $sa->getCacheKey() - ); - } - - public function testShouldBeTheSameAsOAuth2WithTheSameScopeWithSub() - { - $testJson = createTestJson(); - $scope = ['scope/1', 'scope/2']; - $sub = 'sub123'; - $sa = new ServiceAccountCredentials( - $scope, - $testJson, - $sub); - $o = new OAuth2(['scope' => $scope]); - $this->assertSame( - $testJson['client_email'] . ':' . $o->getCacheKey() . ':' . $sub, - $sa->getCacheKey() - ); - } - - public function testShouldBeTheSameAsOAuth2WithTheSameScopeWithSubAddedLater() - { - $testJson = createTestJson(); - $scope = ['scope/1', 'scope/2']; - $sub = 'sub123'; - $sa = new ServiceAccountCredentials( - $scope, - $testJson, - null); - $sa->setSub($sub); - - $o = new OAuth2(['scope' => $scope]); - $this->assertSame( - $testJson['client_email'] . ':' . $o->getCacheKey() . ':' . $sub, - $sa->getCacheKey() - ); - } -} - -class SACConstructorTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testShouldFailIfScopeIsNotAValidType() - { - $testJson = createTestJson(); - $notAnArrayOrString = new \stdClass(); - $sa = new ServiceAccountCredentials( - $notAnArrayOrString, - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testShouldFailIfJsonDoesNotHaveClientEmail() - { - $testJson = createTestJson(); - unset($testJson['client_email']); - $scope = ['scope/1', 'scope/2']; - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testShouldFailIfJsonDoesNotHavePrivateKey() - { - $testJson = createTestJson(); - unset($testJson['private_key']); - $scope = ['scope/1', 'scope/2']; - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testFailsToInitalizeFromANonExistentFile() - { - $keyFile = __DIR__ . '/../fixtures' . '/does-not-exist-private.json'; - new ServiceAccountCredentials('scope/1', $keyFile); - } - - public function testInitalizeFromAFile() - { - $keyFile = __DIR__ . '/../fixtures' . '/private.json'; - $this->assertNotNull( - new ServiceAccountCredentials('scope/1', $keyFile) - ); - } -} - -class SACFromEnvTest extends TestCase -{ - protected function tearDown() - { - putenv(ServiceAccountCredentials::ENV_VAR); // removes it from - } - - public function testIsNullIfEnvVarIsNotSet() - { - $this->assertNull(ServiceAccountCredentials::fromEnv()); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfEnvSpecifiesNonExistentFile() - { - $keyFile = __DIR__ . '/../fixtures' . '/does-not-exist-private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - ApplicationDefaultCredentials::getCredentials('a scope'); - } - - public function testSucceedIfFileExists() - { - $keyFile = __DIR__ . '/../fixtures' . '/private.json'; - putenv(ServiceAccountCredentials::ENV_VAR . '=' . $keyFile); - $this->assertNotNull(ApplicationDefaultCredentials::getCredentials('a scope')); - } -} - -class SACFromWellKnownFileTest extends TestCase -{ - private $originalHome; - - protected function setUp() - { - $this->originalHome = getenv('HOME'); - } - - protected function tearDown() - { - if ($this->originalHome != getenv('HOME')) { - putenv('HOME=' . $this->originalHome); - } - } - - public function testIsNullIfFileDoesNotExist() - { - putenv('HOME=' . __DIR__ . '/../not_exists_fixtures'); - $this->assertNull( - ServiceAccountCredentials::fromWellKnownFile() - ); - } - - public function testSucceedIfFileIsPresent() - { - putenv('HOME=' . __DIR__ . '/../fixtures'); - $this->assertNotNull( - ApplicationDefaultCredentials::getCredentials('a scope') - ); - } -} - -class SACFetchAuthTokenTest extends TestCase -{ - private $privateKey; - - public function setUp() - { - $this->privateKey = - file_get_contents(__DIR__ . '/../fixtures' . '/private.pem'); - } - - private function createTestJson() - { - $testJson = createTestJson(); - $testJson['private_key'] = $this->privateKey; - - return $testJson; - } - - /** - * @expectedException GuzzleHttp\Exception\ClientException - */ - public function testFailsOnClientErrors() - { - $testJson = $this->createTestJson(); - $scope = ['scope/1', 'scope/2']; - $httpHandler = getHandler([ - buildResponse(400), - ]); - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - $sa->fetchAuthToken($httpHandler); - } - - /** - * @expectedException GuzzleHttp\Exception\ServerException - */ - public function testFailsOnServerErrors() - { - $testJson = $this->createTestJson(); - $scope = ['scope/1', 'scope/2']; - $httpHandler = getHandler([ - buildResponse(500), - ]); - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - $sa->fetchAuthToken($httpHandler); - } - - public function testCanFetchCredsOK() - { - $testJson = $this->createTestJson(); - $testJsonText = json_encode($testJson); - $scope = ['scope/1', 'scope/2']; - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($testJsonText)), - ]); - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - $tokens = $sa->fetchAuthToken($httpHandler); - $this->assertEquals($testJson, $tokens); - } - - public function testUpdateMetadataFunc() - { - $testJson = $this->createTestJson(); - $scope = ['scope/1', 'scope/2']; - $access_token = 'accessToken123'; - $responseText = json_encode(array('access_token' => $access_token)); - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($responseText)), - ]); - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - $update_metadata = $sa->getUpdateMetadataFunc(); - $this->assertInternalType('callable', $update_metadata); - - $actual_metadata = call_user_func($update_metadata, - $metadata = array('foo' => 'bar'), - $authUri = null, - $httpHandler); - $this->assertArrayHasKey( - CredentialsLoader::AUTH_METADATA_KEY, - $actual_metadata - ); - $this->assertEquals( - $actual_metadata[CredentialsLoader::AUTH_METADATA_KEY], - array('Bearer ' . $access_token)); - } -} - -class SACJwtAccessTest extends TestCase -{ - private $privateKey; - - public function setUp() - { - $this->privateKey = - file_get_contents(__DIR__ . '/../fixtures' . '/private.pem'); - } - - private function createTestJson() - { - $testJson = createTestJson(); - $testJson['private_key'] = $this->privateKey; - - return $testJson; - } - - /** - * @expectedException InvalidArgumentException - */ - public function testFailsOnMissingClientEmail() - { - $testJson = $this->createTestJson(); - unset($testJson['client_email']); - $sa = new ServiceAccountJwtAccessCredentials( - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testFailsOnMissingPrivateKey() - { - $testJson = $this->createTestJson(); - unset($testJson['private_key']); - $sa = new ServiceAccountJwtAccessCredentials( - $testJson - ); - } - - public function testCanInitializeFromJson() - { - $testJson = $this->createTestJson(); - $sa = new ServiceAccountJwtAccessCredentials( - $testJson - ); - $this->assertNotNull($sa); - } - - public function testNoOpOnFetchAuthToken() - { - $testJson = $this->createTestJson(); - $sa = new ServiceAccountJwtAccessCredentials( - $testJson - ); - $this->assertNotNull($sa); - - $httpHandler = getHandler([ - buildResponse(200), - ]); - $result = $sa->fetchAuthToken($httpHandler); // authUri has not been set - $this->assertNull($result); - } - - public function testAuthUriIsNotSet() - { - $testJson = $this->createTestJson(); - $sa = new ServiceAccountJwtAccessCredentials( - $testJson - ); - $this->assertNotNull($sa); - - $update_metadata = $sa->getUpdateMetadataFunc(); - $this->assertInternalType('callable', $update_metadata); - - $actual_metadata = call_user_func($update_metadata, - $metadata = array('foo' => 'bar'), - $authUri = null); - $this->assertArrayNotHasKey( - CredentialsLoader::AUTH_METADATA_KEY, - $actual_metadata - ); - } - - public function testUpdateMetadataFunc() - { - $testJson = $this->createTestJson(); - $sa = new ServiceAccountJwtAccessCredentials( - $testJson - ); - $this->assertNotNull($sa); - - $update_metadata = $sa->getUpdateMetadataFunc(); - $this->assertInternalType('callable', $update_metadata); - - $actual_metadata = call_user_func($update_metadata, - $metadata = array('foo' => 'bar'), - $authUri = 'https://example.com/service'); - $this->assertArrayHasKey( - CredentialsLoader::AUTH_METADATA_KEY, - $actual_metadata - ); - - $authorization = $actual_metadata[CredentialsLoader::AUTH_METADATA_KEY]; - $this->assertInternalType('array', $authorization); - - $bearer_token = current($authorization); - $this->assertInternalType('string', $bearer_token); - $this->assertEquals(0, strpos($bearer_token, 'Bearer ')); - $this->assertGreaterThan(30, strlen($bearer_token)); - - $actual_metadata2 = call_user_func($update_metadata, - $metadata = array('foo' => 'bar'), - $authUri = 'https://example.com/anotherService'); - $this->assertArrayHasKey( - CredentialsLoader::AUTH_METADATA_KEY, - $actual_metadata2 - ); - - $authorization2 = $actual_metadata2[CredentialsLoader::AUTH_METADATA_KEY]; - $this->assertInternalType('array', $authorization2); - - $bearer_token2 = current($authorization2); - $this->assertInternalType('string', $bearer_token2); - $this->assertEquals(0, strpos($bearer_token2, 'Bearer ')); - $this->assertGreaterThan(30, strlen($bearer_token2)); - $this->assertNotEquals($bearer_token2, $bearer_token); - } -} - -class SACJwtAccessComboTest extends TestCase -{ - private $privateKey; - - public function setUp() - { - $this->privateKey = - file_get_contents(__DIR__ . '/../fixtures' . '/private.pem'); - } - - private function createTestJson() - { - $testJson = createTestJson(); - $testJson['private_key'] = $this->privateKey; - - return $testJson; - } - - public function testNoScopeUseJwtAccess() - { - $testJson = $this->createTestJson(); - // no scope, jwt access should be used, no outbound - // call should be made - $scope = null; - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - $this->assertNotNull($sa); - - $update_metadata = $sa->getUpdateMetadataFunc(); - $this->assertInternalType('callable', $update_metadata); - - $actual_metadata = call_user_func($update_metadata, - $metadata = array('foo' => 'bar'), - $authUri = 'https://example.com/service'); - $this->assertArrayHasKey( - CredentialsLoader::AUTH_METADATA_KEY, - $actual_metadata - ); - - $authorization = $actual_metadata[CredentialsLoader::AUTH_METADATA_KEY]; - $this->assertInternalType('array', $authorization); - - $bearer_token = current($authorization); - $this->assertInternalType('string', $bearer_token); - $this->assertEquals(0, strpos($bearer_token, 'Bearer ')); - $this->assertGreaterThan(30, strlen($bearer_token)); - } - - public function testNoScopeAndNoAuthUri() - { - $testJson = $this->createTestJson(); - // no scope, jwt access should be used, no outbound - // call should be made - $scope = null; - $sa = new ServiceAccountCredentials( - $scope, - $testJson - ); - $this->assertNotNull($sa); - - $update_metadata = $sa->getUpdateMetadataFunc(); - $this->assertInternalType('callable', $update_metadata); - - $actual_metadata = call_user_func($update_metadata, - $metadata = array('foo' => 'bar'), - $authUri = null); - // no access_token is added to the metadata hash - // but also, no error should be thrown - $this->assertInternalType('array', $actual_metadata); - $this->assertArrayNotHasKey( - CredentialsLoader::AUTH_METADATA_KEY, - $actual_metadata - ); - } -} diff --git a/vendor/google/auth/tests/Credentials/UserRefreshCredentialsTest.php b/vendor/google/auth/tests/Credentials/UserRefreshCredentialsTest.php deleted file mode 100644 index 1a3678b2..00000000 --- a/vendor/google/auth/tests/Credentials/UserRefreshCredentialsTest.php +++ /dev/null @@ -1,229 +0,0 @@ - 'client123', - 'client_secret' => 'clientSecret123', - 'refresh_token' => 'refreshToken123', - 'type' => 'authorized_user', - ]; -} - -class URCGetCacheKeyTest extends TestCase -{ - public function testShouldBeTheSameAsOAuth2WithTheSameScope() - { - $testJson = createURCTestJson(); - $scope = ['scope/1', 'scope/2']; - $sa = new UserRefreshCredentials( - $scope, - $testJson); - $o = new OAuth2(['scope' => $scope]); - $this->assertSame( - $testJson['client_id'] . ':' . $o->getCacheKey(), - $sa->getCacheKey() - ); - } -} - -class URCConstructorTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testShouldFailIfScopeIsNotAValidType() - { - $testJson = createURCTestJson(); - $notAnArrayOrString = new \stdClass(); - $sa = new UserRefreshCredentials( - $notAnArrayOrString, - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testShouldFailIfJsonDoesNotHaveClientSecret() - { - $testJson = createURCTestJson(); - unset($testJson['client_secret']); - $scope = ['scope/1', 'scope/2']; - $sa = new UserRefreshCredentials( - $scope, - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testShouldFailIfJsonDoesNotHaveRefreshToken() - { - $testJson = createURCTestJson(); - unset($testJson['refresh_token']); - $scope = ['scope/1', 'scope/2']; - $sa = new UserRefreshCredentials( - $scope, - $testJson - ); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testFailsToInitalizeFromANonExistentFile() - { - $keyFile = __DIR__ . '/../fixtures' . '/does-not-exist-private.json'; - new UserRefreshCredentials('scope/1', $keyFile); - } - - public function testInitalizeFromAFile() - { - $keyFile = __DIR__ . '/../fixtures2' . '/private.json'; - $this->assertNotNull( - new UserRefreshCredentials('scope/1', $keyFile) - ); - } -} - -class URCFromEnvTest extends TestCase -{ - protected function tearDown() - { - putenv(UserRefreshCredentials::ENV_VAR); // removes it from - } - - public function testIsNullIfEnvVarIsNotSet() - { - $this->assertNull(UserRefreshCredentials::fromEnv('a scope')); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfEnvSpecifiesNonExistentFile() - { - $keyFile = __DIR__ . '/../fixtures' . '/does-not-exist-private.json'; - putenv(UserRefreshCredentials::ENV_VAR . '=' . $keyFile); - UserRefreshCredentials::fromEnv('a scope'); - } - - public function testSucceedIfFileExists() - { - $keyFile = __DIR__ . '/../fixtures2' . '/private.json'; - putenv(UserRefreshCredentials::ENV_VAR . '=' . $keyFile); - $this->assertNotNull(ApplicationDefaultCredentials::getCredentials('a scope')); - } -} - -class URCFromWellKnownFileTest extends TestCase -{ - private $originalHome; - - protected function setUp() - { - $this->originalHome = getenv('HOME'); - } - - protected function tearDown() - { - if ($this->originalHome != getenv('HOME')) { - putenv('HOME=' . $this->originalHome); - } - } - - public function testIsNullIfFileDoesNotExist() - { - putenv('HOME=' . __DIR__ . '/../not_exist_fixtures'); - $this->assertNull( - UserRefreshCredentials::fromWellKnownFile('a scope') - ); - } - - public function testSucceedIfFileIsPresent() - { - putenv('HOME=' . __DIR__ . '/../fixtures2'); - $this->assertNotNull( - ApplicationDefaultCredentials::getCredentials('a scope') - ); - } -} - -class URCFetchAuthTokenTest extends TestCase -{ - /** - * @expectedException GuzzleHttp\Exception\ClientException - */ - public function testFailsOnClientErrors() - { - $testJson = createURCTestJson(); - $scope = ['scope/1', 'scope/2']; - $httpHandler = getHandler([ - buildResponse(400), - ]); - $sa = new UserRefreshCredentials( - $scope, - $testJson - ); - $sa->fetchAuthToken($httpHandler); - } - - /** - * @expectedException GuzzleHttp\Exception\ServerException - */ - public function testFailsOnServerErrors() - { - $testJson = createURCTestJson(); - $scope = ['scope/1', 'scope/2']; - $httpHandler = getHandler([ - buildResponse(500), - ]); - $sa = new UserRefreshCredentials( - $scope, - $testJson - ); - $sa->fetchAuthToken($httpHandler); - } - - public function testCanFetchCredsOK() - { - $testJson = createURCTestJson(); - $testJsonText = json_encode($testJson); - $scope = ['scope/1', 'scope/2']; - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($testJsonText)), - ]); - $sa = new UserRefreshCredentials( - $scope, - $testJson - ); - $tokens = $sa->fetchAuthToken($httpHandler); - $this->assertEquals($testJson, $tokens); - } -} diff --git a/vendor/google/auth/tests/FetchAuthTokenCacheTest.php b/vendor/google/auth/tests/FetchAuthTokenCacheTest.php deleted file mode 100644 index a027fa7b..00000000 --- a/vendor/google/auth/tests/FetchAuthTokenCacheTest.php +++ /dev/null @@ -1,154 +0,0 @@ -mockFetcher = - $this - ->getMockBuilder('Google\Auth\FetchAuthTokenInterface') - ->getMock(); - $this->mockCacheItem = - $this - ->getMockBuilder('Psr\Cache\CacheItemInterface') - ->getMock(); - $this->mockCache = - $this - ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') - ->getMock(); - } - - public function testUsesCachedAuthToken() - { - $cacheKey = 'myKey'; - $cachedValue = '2/abcdef1234567890'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->never()) - ->method('fetchAuthToken'); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - - // Run the test. - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - null, - $this->mockCache - ); - $accessToken = $cachedFetcher->fetchAuthToken(); - $this->assertEquals($accessToken, ['access_token' => $cachedValue]); - } - - public function testGetsCachedAuthTokenUsingCachePrefix() - { - $prefix = 'test_prefix_'; - $cacheKey = 'myKey'; - $cachedValue = '2/abcdef1234567890'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->never()) - ->method('fetchAuthToken'); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - - // Run the test - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix], - $this->mockCache - ); - $accessToken = $cachedFetcher->fetchAuthToken(); - $this->assertEquals($accessToken, ['access_token' => $cachedValue]); - } - - public function testShouldSaveValueInCacheWithCacheOptions() - { - $prefix = 'test_prefix_'; - $lifetime = '70707'; - $cacheKey = 'myKey'; - $token = '1/abcdef1234567890'; - $authResult = ['access_token' => $token]; - $this->mockCacheItem - ->expects($this->any()) - ->method('get') - ->will($this->returnValue(null)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)) - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('expiresAfter') - ->with($this->equalTo($lifetime)); - $this->mockCache - ->expects($this->exactly(2)) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - - // Run the test - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix, 'lifetime' => $lifetime], - $this->mockCache - ); - $accessToken = $cachedFetcher->fetchAuthToken(); - $this->assertEquals($accessToken, ['access_token' => $token]); - } -} diff --git a/vendor/google/auth/tests/FetchAuthTokenTest.php b/vendor/google/auth/tests/FetchAuthTokenTest.php deleted file mode 100644 index 52bf8f89..00000000 --- a/vendor/google/auth/tests/FetchAuthTokenTest.php +++ /dev/null @@ -1,224 +0,0 @@ -getMockBuilder($fetcherClass) - ->disableOriginalConstructor() - ->getMock(); - - $mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnCallback(function ($httpHandler) { - return $httpHandler(); - })); - - $httpHandlerCalled = false; - $httpHandler = function () use (&$httpHandlerCalled) { - $httpHandlerCalled = true; - return ['access_token' => 'xyz']; - }; - - $tokenCallbackCalled = false; - $tokenCallback = function ($cacheKey, $accessToken) use (&$tokenCallbackCalled) { - $tokenCallbackCalled = true; - $this->assertEquals('xyz', $accessToken); - }; - - $client = CredentialsLoader::makeHttpClient( - $mockFetcher, - [ - 'base_url' => 'https://www.googleapis.com/books/v1/', - 'base_uri' => 'https://www.googleapis.com/books/v1/', - 'exceptions' => false, - 'defaults' => ['exceptions' => false] - ], - $httpHandler, - $tokenCallback - ); - - $response = $client->get( - 'volumes?q=Henry+David+Thoreau&country=US' - ); - - $this->assertEquals(401, $response->getStatusCode()); - $this->assertTrue($httpHandlerCalled); - $this->assertTrue($tokenCallbackCalled); - } - - public function provideMakeHttpClient() - { - return [ - ['Google\Auth\Credentials\AppIdentityCredentials'], - ['Google\Auth\Credentials\GCECredentials'], - ['Google\Auth\Credentials\ServiceAccountCredentials'], - ['Google\Auth\Credentials\ServiceAccountJwtAccessCredentials'], - ['Google\Auth\Credentials\UserRefreshCredentials'], - ['Google\Auth\OAuth2'], - ]; - } - - public function testAppIdentityCredentialsGetLastReceivedToken() - { - $class = new \ReflectionClass( - 'Google\Auth\Credentials\AppIdentityCredentials' - ); - $property = $class->getProperty('lastReceivedToken'); - $property->setAccessible(true); - - $credentials = new AppIdentityCredentials(); - $property->setValue($credentials, [ - 'access_token' => 'xyz', - 'expiration_time' => strtotime('2001'), - ]); - - $this->assertGetLastReceivedToken($credentials); - } - - public function testGCECredentialsGetLastReceivedToken() - { - $class = new \ReflectionClass( - 'Google\Auth\Credentials\GCECredentials' - ); - $property = $class->getProperty('lastReceivedToken'); - $property->setAccessible(true); - - $credentials = new GCECredentials(); - $property->setValue($credentials, [ - 'access_token' => 'xyz', - 'expires_at' => strtotime('2001'), - ]); - - $this->assertGetLastReceivedToken($credentials); - } - - public function testServiceAccountCredentialsGetLastReceivedToken() - { - $jsonPath = sprintf( - '%s/fixtures/.config/%s', - __DIR__, - CredentialsLoader::WELL_KNOWN_PATH - ); - - $class = new \ReflectionClass( - 'Google\Auth\Credentials\ServiceAccountCredentials' - ); - $property = $class->getProperty('auth'); - $property->setAccessible(true); - - $credentials = new ServiceAccountCredentials($this->scopes, $jsonPath); - $property->setValue($credentials, $this->getOAuth2Mock()); - - $this->assertGetLastReceivedToken($credentials); - } - - public function testServiceAccountJwtAccessCredentialsGetLastReceivedToken() - { - $jsonPath = sprintf( - '%s/fixtures/.config/%s', - __DIR__, - CredentialsLoader::WELL_KNOWN_PATH - ); - - $class = new \ReflectionClass( - 'Google\Auth\Credentials\ServiceAccountJwtAccessCredentials' - ); - $property = $class->getProperty('auth'); - $property->setAccessible(true); - - $credentials = new ServiceAccountJwtAccessCredentials($jsonPath); - $property->setValue($credentials, $this->getOAuth2Mock()); - - $this->assertGetLastReceivedToken($credentials); - } - - public function testUserRefreshCredentialsGetLastReceivedToken() - { - $jsonPath = sprintf( - '%s/fixtures2/.config/%s', - __DIR__, - CredentialsLoader::WELL_KNOWN_PATH - ); - - $class = new \ReflectionClass( - 'Google\Auth\Credentials\UserRefreshCredentials' - ); - $property = $class->getProperty('auth'); - $property->setAccessible(true); - - $credentials = new UserRefreshCredentials($this->scopes, $jsonPath); - $property->setValue($credentials, $this->getOAuth2Mock()); - - $this->assertGetLastReceivedToken($credentials); - } - - private function getOAuth2() - { - $oauth = new OAuth2([ - 'access_token' => 'xyz', - 'expires_at' => strtotime('2001'), - ]); - - $this->assertGetLastReceivedToken($oauth); - } - - private function getOAuth2Mock() - { - $mock = $this->getMockBuilder('Google\Auth\OAuth2') - ->disableOriginalConstructor() - ->getMock(); - - $mock - ->expects($this->once()) - ->method('getLastReceivedToken') - ->will($this->returnValue([ - 'access_token' => 'xyz', - 'expires_at' => strtotime('2001'), - ])); - - return $mock; - } - - private function assertGetLastReceivedToken(FetchAuthTokenInterface $fetcher) - { - $accessToken = $fetcher->getLastReceivedToken(); - - $this->assertNotNull($accessToken); - $this->assertArrayHasKey('access_token', $accessToken); - $this->assertArrayHasKey('expires_at', $accessToken); - - $this->assertEquals('xyz', $accessToken['access_token']); - $this->assertEquals(strtotime('2001'), $accessToken['expires_at']); - } -} diff --git a/vendor/google/auth/tests/HttpHandler/Guzzle5HttpHandlerTest.php b/vendor/google/auth/tests/HttpHandler/Guzzle5HttpHandlerTest.php deleted file mode 100644 index 9ed40dfb..00000000 --- a/vendor/google/auth/tests/HttpHandler/Guzzle5HttpHandlerTest.php +++ /dev/null @@ -1,217 +0,0 @@ -onlyGuzzle5(); - - $this->mockPsr7Request = - $this - ->getMockBuilder('Psr\Http\Message\RequestInterface') - ->getMock(); - $this->mockRequest = - $this - ->getMockBuilder('GuzzleHttp\Message\RequestInterface') - ->getMock(); - $this->mockClient = - $this - ->getMockBuilder('GuzzleHttp\Client') - ->disableOriginalConstructor() - ->getMock(); - $this->mockFuture = - $this - ->getMockBuilder('GuzzleHttp\Ring\Future\FutureInterface') - ->disableOriginalConstructor() - ->getMock(); - } - - public function testSuccessfullySendsRealRequest() - { - $request = new \GuzzleHttp\Psr7\Request('get', 'http://httpbin.org/get'); - $client = new \GuzzleHttp\Client(); - $handler = new Guzzle5HttpHandler($client); - $response = $handler($request); - $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $response); - $this->assertEquals(200, $response->getStatusCode()); - $json = json_decode((string) $response->getBody(), true); - $this->assertArrayHasKey('url', $json); - $this->assertEquals($request->getUri(), $json['url']); - } - - public function testSuccessfullySendsMockRequest() - { - $response = new Response( - 200, - [], - Stream::factory('Body Text') - ); - $this->mockClient - ->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $this->mockClient - ->expects($this->any()) - ->method('createRequest') - ->will($this->returnValue($this->mockRequest)); - - $handler = new Guzzle5HttpHandler($this->mockClient); - $response = $handler($this->mockPsr7Request); - $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $response); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('Body Text', (string) $response->getBody()); - } - - public function testAsyncWithoutGuzzlePromiseThrowsException() - { - // Pretend the promise library doesn't exist - foreach (spl_autoload_functions() as $function) { - if ($function[0] instanceof ClassLoader) { - $newAutoloader = clone $function[0]; - $newAutoloader->setPsr4('GuzzleHttp\\Promise\\', '/tmp'); - spl_autoload_register($newAutoloadFunc = [$newAutoloader, 'loadClass']); - spl_autoload_unregister($previousAutoloadFunc = $function); - } - } - $this->mockClient - ->expects($this->any()) - ->method('send') - ->will($this->returnValue(new FutureResponse($this->mockFuture))); - $this->mockClient - ->expects($this->any()) - ->method('createRequest') - ->will($this->returnValue($this->mockRequest)); - - $handler = new Guzzle5HttpHandler($this->mockClient); - $errorThrown = false; - try { - $handler->async($this->mockPsr7Request); - } catch (Exception $e) { - $this->assertEquals( - 'Install guzzlehttp/promises to use async with Guzzle 5', - $e->getMessage() - ); - $errorThrown = true; - } - - // Restore autoloader before assertion (in case it fails) - spl_autoload_register($previousAutoloadFunc); - spl_autoload_unregister($newAutoloadFunc); - - $this->assertTrue($errorThrown); - } - - public function testSuccessfullySendsRequestAsync() - { - $response = new Response( - 200, - [], - Stream::factory('Body Text') - ); - $this->mockClient - ->expects($this->any()) - ->method('send') - ->will($this->returnValue(new FutureResponse( - new CompletedFutureValue($response) - ))); - $this->mockClient - ->expects($this->any()) - ->method('createRequest') - ->will($this->returnValue($this->mockRequest)); - - $handler = new Guzzle5HttpHandler($this->mockClient); - $promise = $handler->async($this->mockPsr7Request); - $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $promise->wait()); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('Body Text', (string) $response->getBody()); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage This is a test rejection message - */ - public function testPromiseHandlesException() - { - $this->mockClient - ->expects($this->any()) - ->method('send') - ->will($this->returnValue(new FutureResponse( - (new CompletedFutureValue(new Response(200))) - ->then(function () { - throw new Exception('This is a test rejection message'); - }) - ))); - $this->mockClient - ->expects($this->any()) - ->method('createRequest') - ->will($this->returnValue($this->mockRequest)); - - $handler = new Guzzle5HttpHandler($this->mockClient); - $promise = $handler->async($this->mockPsr7Request); - $promise->wait(); - } - - public function testCreateGuzzle5Request() - { - $requestHeaders = [ - 'header1' => 'value1', - 'header2' => 'value2', - ]; - $this->mockPsr7Request - ->expects($this->once()) - ->method('getHeaders') - ->will($this->returnValue($requestHeaders)); - $mockBody = $this->getMock('Psr\Http\Message\StreamInterface'); - $this->mockPsr7Request - ->expects($this->once()) - ->method('getBody') - ->will($this->returnValue($mockBody)); - $this->mockClient - ->expects($this->once()) - ->method('createRequest') - ->with(null, null, [ - 'headers' => $requestHeaders + ['header3' => 'value3'], - 'body' => $mockBody, - ]) - ->will($this->returnValue( - $this->getMock('GuzzleHttp\Message\RequestInterface') - )); - $this->mockClient - ->expects($this->once()) - ->method('send') - ->will($this->returnValue( - $this->getMock('GuzzleHttp\Message\ResponseInterface') - )); - $handler = new Guzzle5HttpHandler($this->mockClient); - $handler($this->mockPsr7Request, [ - 'headers' => [ - 'header3' => 'value3' - ] - ]); - } -} diff --git a/vendor/google/auth/tests/HttpHandler/Guzzle6HttpHandlerTest.php b/vendor/google/auth/tests/HttpHandler/Guzzle6HttpHandlerTest.php deleted file mode 100644 index 974145fa..00000000 --- a/vendor/google/auth/tests/HttpHandler/Guzzle6HttpHandlerTest.php +++ /dev/null @@ -1,68 +0,0 @@ -onlyGuzzle6(); - - $this->mockRequest = - $this - ->getMockBuilder('Psr\Http\Message\RequestInterface') - ->getMock(); - $this->mockClient = - $this - ->getMockBuilder('GuzzleHttp\Client') - ->getMock(); - } - - public function testSuccessfullySendsRequest() - { - $this->mockClient - ->expects($this->any()) - ->method('send') - ->will($this->returnValue(new Response(200))); - - $handler = new Guzzle6HttpHandler($this->mockClient); - $response = $handler($this->mockRequest); - $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $response); - } - - public function testSuccessfullySendsRequestAsync() - { - $this->mockClient - ->expects($this->any()) - ->method('sendAsync') - ->will($this->returnValue(new Promise(function () use (&$promise) { - return $promise->resolve(new Response(200, [], 'Body Text')); - }))); - - $handler = new Guzzle6HttpHandler($this->mockClient); - $promise = $handler->async($this->mockRequest); - $response = $promise->wait(); - $this->assertInstanceOf('Psr\Http\Message\ResponseInterface', $response); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('Body Text', (string) $response->getBody()); - } -} diff --git a/vendor/google/auth/tests/HttpHandler/HttpHandlerFactoryTest.php b/vendor/google/auth/tests/HttpHandler/HttpHandlerFactoryTest.php deleted file mode 100644 index 73126e60..00000000 --- a/vendor/google/auth/tests/HttpHandler/HttpHandlerFactoryTest.php +++ /dev/null @@ -1,39 +0,0 @@ -onlyGuzzle5(); - - $handler = HttpHandlerFactory::build(); - $this->assertInstanceOf('Google\Auth\HttpHandler\Guzzle5HttpHandler', $handler); - } - - public function testBuildsGuzzle6Handler() - { - $this->onlyGuzzle6(); - - $handler = HttpHandlerFactory::build(); - $this->assertInstanceOf('Google\Auth\HttpHandler\Guzzle6HttpHandler', $handler); - } -} diff --git a/vendor/google/auth/tests/Middleware/AuthTokenMiddlewareTest.php b/vendor/google/auth/tests/Middleware/AuthTokenMiddlewareTest.php deleted file mode 100644 index e3d05e9f..00000000 --- a/vendor/google/auth/tests/Middleware/AuthTokenMiddlewareTest.php +++ /dev/null @@ -1,344 +0,0 @@ -onlyGuzzle6(); - - $this->mockFetcher = - $this - ->getMockBuilder('Google\Auth\FetchAuthTokenInterface') - ->getMock(); - $this->mockCacheItem = - $this - ->getMockBuilder('Psr\Cache\CacheItemInterface') - ->getMock(); - $this->mockCache = - $this - ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') - ->getMock(); - $this->mockRequest = - $this - ->getMockBuilder('GuzzleHttp\Psr7\Request') - ->disableOriginalConstructor() - ->getMock(); - } - - public function testOnlyTouchesWhenAuthConfigScoped() - { - $this->mockFetcher - ->expects($this->any()) - ->method('fetchAuthToken') - ->will($this->returnValue([])); - $this->mockRequest - ->expects($this->never()) - ->method('withHeader'); - - $middleware = new AuthTokenMiddleware($this->mockFetcher); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'not_google_auth']); - } - - public function testAddsTheTokenAsAnAuthorizationHeader() - { - $authResult = ['access_token' => '1/abcdef1234567890']; - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $authResult['access_token']) - ->will($this->returnValue($this->mockRequest)); - - // Run the test. - $middleware = new AuthTokenMiddleware($this->mockFetcher); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'google_auth']); - } - - public function testDoesNotAddAnAuthorizationHeaderOnNoAccessToken() - { - $authResult = ['not_access_token' => '1/abcdef1234567890']; - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ') - ->will($this->returnValue($this->mockRequest)); - - // Run the test. - $middleware = new AuthTokenMiddleware($this->mockFetcher); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'google_auth']); - } - - public function testUsesCachedAuthToken() - { - $cacheKey = 'myKey'; - $cachedValue = '2/abcdef1234567890'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->never()) - ->method('fetchAuthToken'); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $cachedValue) - ->will($this->returnValue($this->mockRequest)); - - // Run the test. - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - null, - $this->mockCache - ); - $middleware = new AuthTokenMiddleware($cachedFetcher); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'google_auth']); - } - - public function testGetsCachedAuthTokenUsingCacheOptions() - { - $prefix = 'test_prefix_'; - $cacheKey = 'myKey'; - $cachedValue = '2/abcdef1234567890'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->never()) - ->method('fetchAuthToken'); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $cachedValue) - ->will($this->returnValue($this->mockRequest)); - - // Run the test. - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix], - $this->mockCache - ); - $middleware = new AuthTokenMiddleware($cachedFetcher); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'google_auth']); - } - - public function testShouldSaveValueInCacheWithSpecifiedPrefix() - { - $prefix = 'test_prefix_'; - $lifetime = '70707'; - $cacheKey = 'myKey'; - $token = '1/abcdef1234567890'; - $authResult = ['access_token' => $token]; - $this->mockCacheItem - ->expects($this->any()) - ->method('get') - ->will($this->returnValue(null)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)) - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('expiresAfter') - ->with($this->equalTo($lifetime)); - $this->mockCache - ->expects($this->any()) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $token) - ->will($this->returnValue($this->mockRequest)); - - // Run the test. - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix, 'lifetime' => $lifetime], - $this->mockCache - ); - $middleware = new AuthTokenMiddleware($cachedFetcher); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'google_auth']); - } - - /** @dataProvider provideShouldNotifyTokenCallback */ - public function testShouldNotifyTokenCallback(callable $tokenCallback) - { - $prefix = 'test_prefix_'; - $cacheKey = 'myKey'; - $token = '1/abcdef1234567890'; - $authResult = ['access_token' => $token]; - $this->mockCacheItem - ->expects($this->any()) - ->method('get') - ->will($this->returnValue(null)); - $this->mockCache - ->expects($this->any()) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->will($this->returnValue($this->mockRequest)); - - MiddlewareCallback::$expectedKey = $this->getValidKeyName($prefix . $cacheKey); - MiddlewareCallback::$expectedValue = $token; - MiddlewareCallback::$called = false; - - // Run the test. - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix], - $this->mockCache - ); - $middleware = new AuthTokenMiddleware( - $cachedFetcher, - null, - $tokenCallback - ); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'google_auth']); - $this->assertTrue(MiddlewareCallback::$called); - } - - public function provideShouldNotifyTokenCallback() - { - MiddlewareCallback::$phpunit = $this; - $anonymousFunc = function ($key, $value) { - MiddlewareCallback::staticInvoke($key, $value); - }; - return [ - ['Google\Auth\Tests\MiddlewareCallbackFunction'], - ['Google\Auth\Tests\MiddlewareCallback::staticInvoke'], - [['Google\Auth\Tests\MiddlewareCallback', 'staticInvoke']], - [$anonymousFunc], - [[new MiddlewareCallback, 'staticInvoke']], - [[new MiddlewareCallback, 'methodInvoke']], - [new MiddlewareCallback], - ]; - } -} - -class MiddlewareCallback -{ - public static $phpunit; - public static $expectedKey; - public static $expectedValue; - public static $called = false; - - public function __invoke($key, $value) - { - self::$phpunit->assertEquals(self::$expectedKey, $key); - self::$phpunit->assertEquals(self::$expectedValue, $value); - self::$called = true; - } - - public function methodInvoke($key, $value) - { - return $this($key, $value); - } - - public static function staticInvoke($key, $value) - { - $instance = new self(); - return $instance($key, $value); - } -} - -function MiddlewareCallbackFunction($key, $value) -{ - return MiddlewareCallback::staticInvoke($key, $value); -} diff --git a/vendor/google/auth/tests/Middleware/ScopedAccessTokenMiddlewareTest.php b/vendor/google/auth/tests/Middleware/ScopedAccessTokenMiddlewareTest.php deleted file mode 100644 index b33f1933..00000000 --- a/vendor/google/auth/tests/Middleware/ScopedAccessTokenMiddlewareTest.php +++ /dev/null @@ -1,253 +0,0 @@ -onlyGuzzle6(); - - $this->mockCacheItem = - $this - ->getMockBuilder('Psr\Cache\CacheItemInterface') - ->getMock(); - $this->mockCache = - $this - ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') - ->getMock(); - $this->mockRequest = - $this - ->getMockBuilder('GuzzleHttp\Psr7\Request') - ->disableOriginalConstructor() - ->getMock(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testRequiresScopeAsAStringOrArray() - { - $fakeAuthFunc = function ($unused_scopes) { - return '1/abcdef1234567890'; - }; - new ScopedAccessTokenMiddleware($fakeAuthFunc, new \stdClass()); - } - - public function testAddsTheTokenAsAnAuthorizationHeader() - { - $token = '1/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) use ($token) { - return $token; - }; - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $token) - ->will($this->returnValue($this->mockRequest)); - - // Run the test - $middleware = new ScopedAccessTokenMiddleware($fakeAuthFunc, self::TEST_SCOPE); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'scoped']); - } - - public function testUsesCachedAuthToken() - { - $cachedValue = '2/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) { - return ''; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($this->getValidKeyName(self::TEST_SCOPE))) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $cachedValue) - ->will($this->returnValue($this->mockRequest)); - - // Run the test - $middleware = new ScopedAccessTokenMiddleware( - $fakeAuthFunc, - self::TEST_SCOPE, - [], - $this->mockCache - ); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'scoped']); - } - - public function testGetsCachedAuthTokenUsingCachePrefix() - { - $prefix = 'test_prefix_'; - $cachedValue = '2/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) { - return ''; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($prefix . $this->getValidKeyName(self::TEST_SCOPE))) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $cachedValue) - ->will($this->returnValue($this->mockRequest)); - - // Run the test - $middleware = new ScopedAccessTokenMiddleware( - $fakeAuthFunc, - self::TEST_SCOPE, - ['prefix' => $prefix], - $this->mockCache - ); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'scoped']); - } - - public function testShouldSaveValueInCache() - { - $token = '2/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) use ($token) { - return $token; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)) - ->will($this->returnValue(false)); - $this->mockCache - ->expects($this->exactly(2)) - ->method('getItem') - ->with($this->equalTo($this->getValidKeyName(self::TEST_SCOPE))) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $token) - ->will($this->returnValue($this->mockRequest)); - - // Run the test - $middleware = new ScopedAccessTokenMiddleware( - $fakeAuthFunc, - self::TEST_SCOPE, - [], - $this->mockCache - ); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'scoped']); - } - - public function testShouldSaveValueInCacheWithCacheOptions() - { - $token = '2/abcdef1234567890'; - $prefix = 'test_prefix_'; - $lifetime = '70707'; - $fakeAuthFunc = function ($unused_scopes) use ($token) { - return $token; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)) - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('expiresAfter') - ->with($this->equalTo($lifetime)); - $this->mockCache - ->expects($this->exactly(2)) - ->method('getItem') - ->with($this->equalTo($prefix . $this->getValidKeyName(self::TEST_SCOPE))) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockRequest - ->expects($this->once()) - ->method('withHeader') - ->with('authorization', 'Bearer ' . $token) - ->will($this->returnValue($this->mockRequest)); - - // Run the test - $middleware = new ScopedAccessTokenMiddleware( - $fakeAuthFunc, - self::TEST_SCOPE, - ['prefix' => $prefix, 'lifetime' => $lifetime], - $this->mockCache - ); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'scoped']); - } - - public function testOnlyTouchesWhenAuthConfigScoped() - { - $fakeAuthFunc = function ($unused_scopes) { - return '1/abcdef1234567890'; - }; - $this->mockRequest - ->expects($this->never()) - ->method('withHeader'); - - // Run the test - $middleware = new ScopedAccessTokenMiddleware($fakeAuthFunc, self::TEST_SCOPE); - $mock = new MockHandler([new Response(200)]); - $callable = $middleware($mock); - $callable($this->mockRequest, ['auth' => 'not_scoped']); - } -} diff --git a/vendor/google/auth/tests/OAuth2Test.php b/vendor/google/auth/tests/OAuth2Test.php deleted file mode 100644 index 1a1f76a6..00000000 --- a/vendor/google/auth/tests/OAuth2Test.php +++ /dev/null @@ -1,874 +0,0 @@ - 'https://accounts.test.org/insecure/url', - 'redirectUri' => 'https://accounts.test.org/redirect/url', - 'clientId' => 'aClientID', - ]; - - /** - * @expectedException InvalidArgumentException - */ - public function testIsNullIfAuthorizationUriIsNull() - { - $o = new OAuth2([]); - $this->assertNull($o->buildFullAuthorizationUri()); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testRequiresTheClientId() - { - $o = new OAuth2([ - 'authorizationUri' => 'https://accounts.test.org/auth/url', - 'redirectUri' => 'https://accounts.test.org/redirect/url', - ]); - $o->buildFullAuthorizationUri(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testRequiresTheRedirectUri() - { - $o = new OAuth2([ - 'authorizationUri' => 'https://accounts.test.org/auth/url', - 'clientId' => 'aClientID', - ]); - $o->buildFullAuthorizationUri(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testCannotHavePromptAndApprovalPrompt() - { - $o = new OAuth2([ - 'authorizationUri' => 'https://accounts.test.org/auth/url', - 'clientId' => 'aClientID', - ]); - $o->buildFullAuthorizationUri([ - 'approval_prompt' => 'an approval prompt', - 'prompt' => 'a prompt', - ]); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testCannotHaveInsecureAuthorizationUri() - { - $o = new OAuth2([ - 'authorizationUri' => 'http://accounts.test.org/insecure/url', - 'redirectUri' => 'https://accounts.test.org/redirect/url', - 'clientId' => 'aClientID', - ]); - $o->buildFullAuthorizationUri(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testCannotHaveRelativeRedirectUri() - { - $o = new OAuth2([ - 'authorizationUri' => 'http://accounts.test.org/insecure/url', - 'redirectUri' => '/redirect/url', - 'clientId' => 'aClientID', - ]); - $o->buildFullAuthorizationUri(); - } - - public function testHasDefaultXXXTypeParams() - { - $o = new OAuth2($this->minimal); - $q = Psr7\parse_query($o->buildFullAuthorizationUri()->getQuery()); - $this->assertEquals('code', $q['response_type']); - $this->assertEquals('offline', $q['access_type']); - } - - public function testCanBeUrlObject() - { - $config = array_merge($this->minimal, [ - 'authorizationUri' => Psr7\uri_for('https://another/uri'), - ]); - $o = new OAuth2($config); - $this->assertEquals('/uri', $o->buildFullAuthorizationUri()->getPath()); - } - - public function testCanOverrideParams() - { - $overrides = [ - 'access_type' => 'o_access_type', - 'client_id' => 'o_client_id', - 'redirect_uri' => 'o_redirect_uri', - 'response_type' => 'o_response_type', - 'state' => 'o_state', - ]; - $config = array_merge($this->minimal, ['state' => 'the_state']); - $o = new OAuth2($config); - $q = Psr7\parse_query($o->buildFullAuthorizationUri($overrides)->getQuery()); - $this->assertEquals('o_access_type', $q['access_type']); - $this->assertEquals('o_client_id', $q['client_id']); - $this->assertEquals('o_redirect_uri', $q['redirect_uri']); - $this->assertEquals('o_response_type', $q['response_type']); - $this->assertEquals('o_state', $q['state']); - } - - public function testIncludesTheScope() - { - $with_strings = array_merge($this->minimal, ['scope' => 'scope1 scope2']); - $o = new OAuth2($with_strings); - $q = Psr7\parse_query($o->buildFullAuthorizationUri()->getQuery()); - $this->assertEquals('scope1 scope2', $q['scope']); - - $with_array = array_merge($this->minimal, [ - 'scope' => ['scope1', 'scope2'], - ]); - $o = new OAuth2($with_array); - $q = Psr7\parse_query($o->buildFullAuthorizationUri()->getQuery()); - $this->assertEquals('scope1 scope2', $q['scope']); - } - - public function testRedirectUriPostmessageIsAllowed() - { - $o = new OAuth2([ - 'authorizationUri' => 'https://accounts.test.org/insecure/url', - 'redirectUri' => 'postmessage', - 'clientId' => 'aClientID', - ]); - $this->assertEquals('postmessage', $o->getRedirectUri()); - $url = $o->buildFullAuthorizationUri(); - $parts = parse_url((string)$url); - parse_str($parts['query'], $query); - $this->assertArrayHasKey('redirect_uri', $query); - $this->assertEquals('postmessage', $query['redirect_uri']); - } -} - -class OAuth2GrantTypeTest extends TestCase -{ - private $minimal = [ - 'authorizationUri' => 'https://accounts.test.org/insecure/url', - 'redirectUri' => 'https://accounts.test.org/redirect/url', - 'clientId' => 'aClientID', - ]; - - public function testReturnsNullIfCannotBeInferred() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getGrantType()); - } - - public function testInfersAuthorizationCode() - { - $o = new OAuth2($this->minimal); - $o->setCode('an auth code'); - $this->assertEquals('authorization_code', $o->getGrantType()); - } - - public function testInfersRefreshToken() - { - $o = new OAuth2($this->minimal); - $o->setRefreshToken('a refresh token'); - $this->assertEquals('refresh_token', $o->getGrantType()); - } - - public function testInfersPassword() - { - $o = new OAuth2($this->minimal); - $o->setPassword('a password'); - $o->setUsername('a username'); - $this->assertEquals('password', $o->getGrantType()); - } - - public function testInfersJwtBearer() - { - $o = new OAuth2($this->minimal); - $o->setIssuer('an issuer'); - $o->setSigningKey('a key'); - $this->assertEquals('urn:ietf:params:oauth:grant-type:jwt-bearer', - $o->getGrantType()); - } - - public function testSetsKnownTypes() - { - $o = new OAuth2($this->minimal); - foreach (OAuth2::$knownGrantTypes as $t) { - $o->setGrantType($t); - $this->assertEquals($t, $o->getGrantType()); - } - } - - public function testSetsUrlAsGrantType() - { - $o = new OAuth2($this->minimal); - $o->setGrantType('http://a/grant/url'); - $this->assertEquals('http://a/grant/url', $o->getGrantType()); - } -} - -class OAuth2GetCacheKeyTest extends TestCase -{ - private $minimal = [ - 'clientID' => 'aClientID', - ]; - - public function testIsNullWithNoScopes() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getCacheKey()); - } - - public function testIsScopeIfSingleScope() - { - $o = new OAuth2($this->minimal); - $o->setScope('test/scope/1'); - $this->assertEquals('test/scope/1', $o->getCacheKey()); - } - - public function testIsAllScopesWhenScopeIsArray() - { - $o = new OAuth2($this->minimal); - $o->setScope(['test/scope/1', 'test/scope/2']); - $this->assertEquals('test/scope/1:test/scope/2', $o->getCacheKey()); - } -} - -class OAuth2TimingTest extends TestCase -{ - private $minimal = [ - 'authorizationUri' => 'https://accounts.test.org/insecure/url', - 'redirectUri' => 'https://accounts.test.org/redirect/url', - 'clientId' => 'aClientID', - ]; - - public function testIssuedAtDefaultsToNull() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getIssuedAt()); - } - - public function testExpiresAtDefaultsToNull() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getExpiresAt()); - } - - public function testExpiresInDefaultsToNull() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getExpiresIn()); - } - - public function testSettingExpiresInSetsIssuedAt() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getIssuedAt()); - $aShortWhile = 5; - $o->setExpiresIn($aShortWhile); - $this->assertEquals($aShortWhile, $o->getExpiresIn()); - $this->assertNotNull($o->getIssuedAt()); - } - - public function testSettingExpiresInSetsExpireAt() - { - $o = new OAuth2($this->minimal); - $this->assertNull($o->getExpiresAt()); - $aShortWhile = 5; - $o->setExpiresIn($aShortWhile); - $this->assertNotNull($o->getExpiresAt()); - $this->assertEquals($aShortWhile, $o->getExpiresAt() - $o->getIssuedAt()); - } - - public function testIsNotExpiredByDefault() - { - $o = new OAuth2($this->minimal); - $this->assertFalse($o->isExpired()); - } - - public function testIsNotExpiredIfExpiresAtIsOld() - { - $o = new OAuth2($this->minimal); - $o->setExpiresAt(time() - 2); - $this->assertTrue($o->isExpired()); - } -} - -class OAuth2GeneralTest extends TestCase -{ - private $minimal = [ - 'authorizationUri' => 'https://accounts.test.org/insecure/url', - 'redirectUri' => 'https://accounts.test.org/redirect/url', - 'clientId' => 'aClientID', - ]; - - /** - * @expectedException InvalidArgumentException - */ - public function testFailsOnUnknownSigningAlgorithm() - { - $o = new OAuth2($this->minimal); - $o->setSigningAlgorithm('this is definitely not an algorithm name'); - } - - public function testAllowsKnownSigningAlgorithms() - { - $o = new OAuth2($this->minimal); - foreach (OAuth2::$knownSigningAlgorithms as $a) { - $o->setSigningAlgorithm($a); - $this->assertEquals($a, $o->getSigningAlgorithm()); - } - } - - /** - * @expectedException InvalidArgumentException - */ - public function testFailsOnRelativeRedirectUri() - { - $o = new OAuth2($this->minimal); - $o->setRedirectUri('/relative/url'); - } - - public function testAllowsUrnRedirectUri() - { - $urn = 'urn:ietf:wg:oauth:2.0:oob'; - $o = new OAuth2($this->minimal); - $o->setRedirectUri($urn); - $this->assertEquals($urn, $o->getRedirectUri()); - } -} - -class OAuth2JwtTest extends TestCase -{ - private $signingMinimal = [ - 'signingKey' => 'example_key', - 'signingAlgorithm' => 'HS256', - 'scope' => 'https://www.googleapis.com/auth/userinfo.profile', - 'issuer' => 'app@example.com', - 'audience' => 'accounts.google.com', - 'clientId' => 'aClientID', - ]; - - /** - * @expectedException DomainException - */ - public function testFailsWithMissingAudience() - { - $testConfig = $this->signingMinimal; - unset($testConfig['audience']); - $o = new OAuth2($testConfig); - $o->toJwt(); - } - - /** - * @expectedException DomainException - */ - public function testFailsWithMissingIssuer() - { - $testConfig = $this->signingMinimal; - unset($testConfig['issuer']); - $o = new OAuth2($testConfig); - $o->toJwt(); - } - - /** - */ - public function testCanHaveNoScope() - { - $testConfig = $this->signingMinimal; - unset($testConfig['scope']); - $o = new OAuth2($testConfig); - $o->toJwt(); - } - - /** - * @expectedException DomainException - */ - public function testFailsWithMissingSigningKey() - { - $testConfig = $this->signingMinimal; - unset($testConfig['signingKey']); - $o = new OAuth2($testConfig); - $o->toJwt(); - } - - /** - * @expectedException DomainException - */ - public function testFailsWithMissingSigningAlgorithm() - { - $testConfig = $this->signingMinimal; - unset($testConfig['signingAlgorithm']); - $o = new OAuth2($testConfig); - $o->toJwt(); - } - - public function testCanHS256EncodeAValidPayload() - { - $testConfig = $this->signingMinimal; - $o = new OAuth2($testConfig); - $payload = $o->toJwt(); - $roundTrip = $this->jwtDecode($payload, $testConfig['signingKey'], array('HS256')); - $this->assertEquals($roundTrip->iss, $testConfig['issuer']); - $this->assertEquals($roundTrip->aud, $testConfig['audience']); - $this->assertEquals($roundTrip->scope, $testConfig['scope']); - } - - public function testCanRS256EncodeAValidPayload() - { - $publicKey = file_get_contents(__DIR__ . '/fixtures' . '/public.pem'); - $privateKey = file_get_contents(__DIR__ . '/fixtures' . '/private.pem'); - $testConfig = $this->signingMinimal; - $o = new OAuth2($testConfig); - $o->setSigningAlgorithm('RS256'); - $o->setSigningKey($privateKey); - $payload = $o->toJwt(); - $roundTrip = $this->jwtDecode($payload, $publicKey, array('RS256')); - $this->assertEquals($roundTrip->iss, $testConfig['issuer']); - $this->assertEquals($roundTrip->aud, $testConfig['audience']); - $this->assertEquals($roundTrip->scope, $testConfig['scope']); - } - - public function testCanHaveAdditionalClaims() - { - $publicKey = file_get_contents(__DIR__ . '/fixtures' . '/public.pem'); - $privateKey = file_get_contents(__DIR__ . '/fixtures' . '/private.pem'); - $testConfig = $this->signingMinimal; - $targetAud = '123@456.com'; - $testConfig['additionalClaims'] = ['target_audience' => $targetAud]; - $o = new OAuth2($testConfig); - $o->setSigningAlgorithm('RS256'); - $o->setSigningKey($privateKey); - $payload = $o->toJwt(); - $roundTrip = $this->jwtDecode($payload, $publicKey, array('RS256')); - $this->assertEquals($roundTrip->target_audience, $targetAud); - } - - private function jwtDecode() - { - $args = func_get_args(); - $class = 'JWT'; - if (class_exists('Firebase\JWT\JWT')) { - $class = 'Firebase\JWT\JWT'; - } - - return call_user_func_array("$class::decode", $args); - } -} - -class OAuth2GenerateAccessTokenRequestTest extends TestCase -{ - private $tokenRequestMinimal = [ - 'tokenCredentialUri' => 'https://tokens_r_us/test', - 'scope' => 'https://www.googleapis.com/auth/userinfo.profile', - 'issuer' => 'app@example.com', - 'audience' => 'accounts.google.com', - 'clientId' => 'aClientID', - ]; - - /** - * @expectedException DomainException - */ - public function testFailsIfNoTokenCredentialUri() - { - $testConfig = $this->tokenRequestMinimal; - unset($testConfig['tokenCredentialUri']); - $o = new OAuth2($testConfig); - $o->generateCredentialsRequest(); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfAuthorizationCodeIsMissing() - { - $testConfig = $this->tokenRequestMinimal; - $testConfig['redirectUri'] = 'https://has/redirect/uri'; - $o = new OAuth2($testConfig); - $o->generateCredentialsRequest(); - } - - public function testGeneratesAuthorizationCodeRequests() - { - $testConfig = $this->tokenRequestMinimal; - $testConfig['redirectUri'] = 'https://has/redirect/uri'; - $o = new OAuth2($testConfig); - $o->setCode('an_auth_code'); - - // Generate the request and confirm that it's correct. - $req = $o->generateCredentialsRequest(); - $this->assertInstanceOf('Psr\Http\Message\RequestInterface', $req); - $this->assertEquals('POST', $req->getMethod()); - $fields = Psr7\parse_query((string)$req->getBody()); - $this->assertEquals('authorization_code', $fields['grant_type']); - $this->assertEquals('an_auth_code', $fields['code']); - } - - public function testGeneratesPasswordRequests() - { - $testConfig = $this->tokenRequestMinimal; - $o = new OAuth2($testConfig); - $o->setUsername('a_username'); - $o->setPassword('a_password'); - - // Generate the request and confirm that it's correct. - $req = $o->generateCredentialsRequest(); - $this->assertInstanceOf('Psr\Http\Message\RequestInterface', $req); - $this->assertEquals('POST', $req->getMethod()); - $fields = Psr7\parse_query((string)$req->getBody()); - $this->assertEquals('password', $fields['grant_type']); - $this->assertEquals('a_password', $fields['password']); - $this->assertEquals('a_username', $fields['username']); - } - - public function testGeneratesRefreshTokenRequests() - { - $testConfig = $this->tokenRequestMinimal; - $o = new OAuth2($testConfig); - $o->setRefreshToken('a_refresh_token'); - - // Generate the request and confirm that it's correct. - $req = $o->generateCredentialsRequest(); - $this->assertInstanceOf('Psr\Http\Message\RequestInterface', $req); - $this->assertEquals('POST', $req->getMethod()); - $fields = Psr7\parse_query((string)$req->getBody()); - $this->assertEquals('refresh_token', $fields['grant_type']); - $this->assertEquals('a_refresh_token', $fields['refresh_token']); - } - - public function testClientSecretAddedIfSetForAuthorizationCodeRequests() - { - $testConfig = $this->tokenRequestMinimal; - $testConfig['clientSecret'] = 'a_client_secret'; - $testConfig['redirectUri'] = 'https://has/redirect/uri'; - $o = new OAuth2($testConfig); - $o->setCode('an_auth_code'); - $request = $o->generateCredentialsRequest(); - $fields = Psr7\parse_query((string)$request->getBody()); - $this->assertEquals('a_client_secret', $fields['client_secret']); - } - - public function testClientSecretAddedIfSetForRefreshTokenRequests() - { - $testConfig = $this->tokenRequestMinimal; - $testConfig['clientSecret'] = 'a_client_secret'; - $o = new OAuth2($testConfig); - $o->setRefreshToken('a_refresh_token'); - $request = $o->generateCredentialsRequest(); - $fields = Psr7\parse_query((string)$request->getBody()); - $this->assertEquals('a_client_secret', $fields['client_secret']); - } - - public function testClientSecretAddedIfSetForPasswordRequests() - { - $testConfig = $this->tokenRequestMinimal; - $testConfig['clientSecret'] = 'a_client_secret'; - $o = new OAuth2($testConfig); - $o->setUsername('a_username'); - $o->setPassword('a_password'); - $request = $o->generateCredentialsRequest(); - $fields = Psr7\parse_query((string)$request->getBody()); - $this->assertEquals('a_client_secret', $fields['client_secret']); - } - - public function testGeneratesAssertionRequests() - { - $testConfig = $this->tokenRequestMinimal; - $o = new OAuth2($testConfig); - $o->setSigningKey('a_key'); - $o->setSigningAlgorithm('HS256'); - - // Generate the request and confirm that it's correct. - $req = $o->generateCredentialsRequest(); - $this->assertInstanceOf('Psr\Http\Message\RequestInterface', $req); - $this->assertEquals('POST', $req->getMethod()); - $fields = Psr7\parse_query((string)$req->getBody()); - $this->assertEquals(OAuth2::JWT_URN, $fields['grant_type']); - $this->assertArrayHasKey('assertion', $fields); - } - - public function testGeneratesExtendedRequests() - { - $testConfig = $this->tokenRequestMinimal; - $o = new OAuth2($testConfig); - $o->setGrantType('urn:my_test_grant_type'); - $o->setExtensionParams(['my_param' => 'my_value']); - - // Generate the request and confirm that it's correct. - $req = $o->generateCredentialsRequest(); - $this->assertInstanceOf('Psr\Http\Message\RequestInterface', $req); - $this->assertEquals('POST', $req->getMethod()); - $fields = Psr7\parse_query((string)$req->getBody()); - $this->assertEquals('my_value', $fields['my_param']); - $this->assertEquals('urn:my_test_grant_type', $fields['grant_type']); - } -} - -class OAuth2FetchAuthTokenTest extends TestCase -{ - private $fetchAuthTokenMinimal = [ - 'tokenCredentialUri' => 'https://tokens_r_us/test', - 'scope' => 'https://www.googleapis.com/auth/userinfo.profile', - 'signingKey' => 'example_key', - 'signingAlgorithm' => 'HS256', - 'issuer' => 'app@example.com', - 'audience' => 'accounts.google.com', - 'clientId' => 'aClientID', - ]; - - /** - * @expectedException GuzzleHttp\Exception\ClientException - */ - public function testFailsOn400() - { - $testConfig = $this->fetchAuthTokenMinimal; - $httpHandler = getHandler([ - buildResponse(400), - ]); - $o = new OAuth2($testConfig); - $o->fetchAuthToken($httpHandler); - } - - /** - * @expectedException GuzzleHttp\Exception\ServerException - */ - public function testFailsOn500() - { - $testConfig = $this->fetchAuthTokenMinimal; - $httpHandler = getHandler([ - buildResponse(500), - ]); - $o = new OAuth2($testConfig); - $o->fetchAuthToken($httpHandler); - } - - /** - * @expectedException Exception - * @expectedExceptionMessage Invalid JSON response - */ - public function testFailsOnNoContentTypeIfResponseIsNotJSON() - { - $testConfig = $this->fetchAuthTokenMinimal; - $notJson = '{"foo": , this is cannot be passed as json" "bar"}'; - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($notJson)), - ]); - $o = new OAuth2($testConfig); - $o->fetchAuthToken($httpHandler); - } - - public function testFetchesJsonResponseOnNoContentTypeOK() - { - $testConfig = $this->fetchAuthTokenMinimal; - $json = '{"foo": "bar"}'; - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($json)), - ]); - $o = new OAuth2($testConfig); - $tokens = $o->fetchAuthToken($httpHandler); - $this->assertEquals($tokens['foo'], 'bar'); - } - - public function testFetchesFromFormEncodedResponseOK() - { - $testConfig = $this->fetchAuthTokenMinimal; - $json = 'foo=bar&spice=nice'; - $httpHandler = getHandler([ - buildResponse( - 200, - ['Content-Type' => 'application/x-www-form-urlencoded'], - Psr7\stream_for($json) - ), - ]); - $o = new OAuth2($testConfig); - $tokens = $o->fetchAuthToken($httpHandler); - $this->assertEquals($tokens['foo'], 'bar'); - $this->assertEquals($tokens['spice'], 'nice'); - } - - public function testUpdatesTokenFieldsOnFetch() - { - $testConfig = $this->fetchAuthTokenMinimal; - $wanted_updates = [ - 'expires_at' => '1', - 'expires_in' => '57', - 'issued_at' => '2', - 'access_token' => 'an_access_token', - 'id_token' => 'an_id_token', - 'refresh_token' => 'a_refresh_token', - ]; - $json = json_encode($wanted_updates); - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($json)), - ]); - $o = new OAuth2($testConfig); - $this->assertNull($o->getExpiresAt()); - $this->assertNull($o->getExpiresIn()); - $this->assertNull($o->getIssuedAt()); - $this->assertNull($o->getAccessToken()); - $this->assertNull($o->getIdToken()); - $this->assertNull($o->getRefreshToken()); - $tokens = $o->fetchAuthToken($httpHandler); - $this->assertEquals(1, $o->getExpiresAt()); - $this->assertEquals(57, $o->getExpiresIn()); - $this->assertEquals(2, $o->getIssuedAt()); - $this->assertEquals('an_access_token', $o->getAccessToken()); - $this->assertEquals('an_id_token', $o->getIdToken()); - $this->assertEquals('a_refresh_token', $o->getRefreshToken()); - } - - public function testUpdatesTokenFieldsOnFetchMissingRefreshToken() - { - $testConfig = $this->fetchAuthTokenMinimal; - $testConfig['refresh_token'] = 'a_refresh_token'; - $wanted_updates = [ - 'expires_at' => '1', - 'expires_in' => '57', - 'issued_at' => '2', - 'access_token' => 'an_access_token', - 'id_token' => 'an_id_token', - ]; - $json = json_encode($wanted_updates); - $httpHandler = getHandler([ - buildResponse(200, [], Psr7\stream_for($json)), - ]); - $o = new OAuth2($testConfig); - $this->assertNull($o->getExpiresAt()); - $this->assertNull($o->getExpiresIn()); - $this->assertNull($o->getIssuedAt()); - $this->assertNull($o->getAccessToken()); - $this->assertNull($o->getIdToken()); - $this->assertEquals('a_refresh_token', $o->getRefreshToken()); - $tokens = $o->fetchAuthToken($httpHandler); - $this->assertEquals(1, $o->getExpiresAt()); - $this->assertEquals(57, $o->getExpiresIn()); - $this->assertEquals(2, $o->getIssuedAt()); - $this->assertEquals('an_access_token', $o->getAccessToken()); - $this->assertEquals('an_id_token', $o->getIdToken()); - $this->assertEquals('a_refresh_token', $o->getRefreshToken()); - } -} - -class OAuth2VerifyIdTokenTest extends TestCase -{ - private $publicKey; - private $privateKey; - private $verifyIdTokenMinimal = [ - 'scope' => 'https://www.googleapis.com/auth/userinfo.profile', - 'audience' => 'myaccount.on.host.issuer.com', - 'issuer' => 'an.issuer.com', - 'clientId' => 'myaccount.on.host.issuer.com', - ]; - - public function setUp() - { - $this->publicKey = - file_get_contents(__DIR__ . '/fixtures' . '/public.pem'); - $this->privateKey = - file_get_contents(__DIR__ . '/fixtures' . '/private.pem'); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testFailsIfIdTokenIsInvalid() - { - $testConfig = $this->verifyIdTokenMinimal; - $not_a_jwt = 'not a jot'; - $o = new OAuth2($testConfig); - $o->setIdToken($not_a_jwt); - $o->verifyIdToken($this->publicKey); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfAudienceIsMissing() - { - $testConfig = $this->verifyIdTokenMinimal; - $now = time(); - $origIdToken = [ - 'issuer' => $testConfig['issuer'], - 'exp' => $now + 65, // arbitrary - 'iat' => $now, - ]; - $o = new OAuth2($testConfig); - $jwtIdToken = $this->jwtEncode($origIdToken, $this->privateKey, 'RS256'); - $o->setIdToken($jwtIdToken); - $o->verifyIdToken($this->publicKey, ['RS256']); - } - - /** - * @expectedException DomainException - */ - public function testFailsIfAudienceIsWrong() - { - $now = time(); - $testConfig = $this->verifyIdTokenMinimal; - $origIdToken = [ - 'aud' => 'a different audience', - 'iss' => $testConfig['issuer'], - 'exp' => $now + 65, // arbitrary - 'iat' => $now, - ]; - $o = new OAuth2($testConfig); - $jwtIdToken = $this->jwtEncode($origIdToken, $this->privateKey, 'RS256'); - $o->setIdToken($jwtIdToken); - $o->verifyIdToken($this->publicKey, ['RS256']); - } - - public function testShouldReturnAValidIdToken() - { - $testConfig = $this->verifyIdTokenMinimal; - $now = time(); - $origIdToken = [ - 'aud' => $testConfig['audience'], - 'iss' => $testConfig['issuer'], - 'exp' => $now + 65, // arbitrary - 'iat' => $now, - ]; - $o = new OAuth2($testConfig); - $alg = 'RS256'; - $jwtIdToken = $this->jwtEncode($origIdToken, $this->privateKey, $alg); - $o->setIdToken($jwtIdToken); - $roundTrip = $o->verifyIdToken($this->publicKey, array($alg)); - $this->assertEquals($origIdToken['aud'], $roundTrip->aud); - } - - private function jwtEncode() - { - $args = func_get_args(); - $class = 'JWT'; - if (class_exists('Firebase\JWT\JWT')) { - $class = 'Firebase\JWT\JWT'; - } - - return call_user_func_array("$class::encode", $args); - } -} diff --git a/vendor/google/auth/tests/Subscriber/AuthTokenSubscriberTest.php b/vendor/google/auth/tests/Subscriber/AuthTokenSubscriberTest.php deleted file mode 100644 index 0a97ac73..00000000 --- a/vendor/google/auth/tests/Subscriber/AuthTokenSubscriberTest.php +++ /dev/null @@ -1,333 +0,0 @@ -onlyGuzzle5(); - - $this->mockFetcher = - $this - ->getMockBuilder('Google\Auth\FetchAuthTokenInterface') - ->getMock(); - $this->mockCacheItem = - $this - ->getMockBuilder('Psr\Cache\CacheItemInterface') - ->getMock(); - $this->mockCache = - $this - ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') - ->getMock(); - } - - public function testSubscribesToEvents() - { - $a = new AuthTokenSubscriber($this->mockFetcher); - $this->assertArrayHasKey('before', $a->getEvents()); - } - - public function testOnlyTouchesWhenAuthConfigScoped() - { - $s = new AuthTokenSubscriber($this->mockFetcher); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'not_google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame($request->getHeader('authorization'), ''); - } - - public function testAddsTheTokenAsAnAuthorizationHeader() - { - $authResult = ['access_token' => '1/abcdef1234567890']; - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - - // Run the test. - $a = new AuthTokenSubscriber($this->mockFetcher); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $a->onBefore($before); - $this->assertSame($request->getHeader('authorization'), - 'Bearer 1/abcdef1234567890'); - } - - public function testDoesNotAddAnAuthorizationHeaderOnNoAccessToken() - { - $authResult = ['not_access_token' => '1/abcdef1234567890']; - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - - // Run the test. - $a = new AuthTokenSubscriber($this->mockFetcher); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $a->onBefore($before); - $this->assertSame($request->getHeader('authorization'), ''); - } - - public function testUsesCachedAuthToken() - { - $cacheKey = 'myKey'; - $cachedValue = '2/abcdef1234567890'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->never()) - ->method('fetchAuthToken'); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - - // Run the test. - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - null, - $this->mockCache - ); - $a = new AuthTokenSubscriber($cachedFetcher); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $a->onBefore($before); - $this->assertSame($request->getHeader('authorization'), - 'Bearer 2/abcdef1234567890'); - } - - public function testGetsCachedAuthTokenUsingCachePrefix() - { - $prefix = 'test_prefix_'; - $cacheKey = 'myKey'; - $cachedValue = '2/abcdef1234567890'; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->never()) - ->method('fetchAuthToken'); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - - // Run the test - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix], - $this->mockCache - ); - $a = new AuthTokenSubscriber($cachedFetcher); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $a->onBefore($before); - $this->assertSame($request->getHeader('authorization'), - 'Bearer 2/abcdef1234567890'); - } - - public function testShouldSaveValueInCacheWithCacheOptions() - { - $prefix = 'test_prefix_'; - $lifetime = '70707'; - $cacheKey = 'myKey'; - $token = '1/abcdef1234567890'; - $authResult = ['access_token' => $token]; - $this->mockCacheItem - ->expects($this->any()) - ->method('get') - ->will($this->returnValue(null)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)) - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('expiresAfter') - ->with($this->equalTo($lifetime)); - $this->mockCache - ->expects($this->exactly(2)) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - - // Run the test - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix, 'lifetime' => $lifetime], - $this->mockCache - ); - $a = new AuthTokenSubscriber($cachedFetcher); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $a->onBefore($before); - $this->assertSame($request->getHeader('authorization'), - 'Bearer 1/abcdef1234567890'); - } - - /** @dataProvider provideShouldNotifyTokenCallback */ - public function testShouldNotifyTokenCallback(callable $tokenCallback) - { - $prefix = 'test_prefix_'; - $cacheKey = 'myKey'; - $token = '1/abcdef1234567890'; - $authResult = ['access_token' => $token]; - $this->mockCacheItem - ->expects($this->any()) - ->method('get') - ->will($this->returnValue(null)); - $this->mockCache - ->expects($this->any()) - ->method('getItem') - ->with($this->equalTo($prefix . $cacheKey)) - ->will($this->returnValue($this->mockCacheItem)); - $this->mockFetcher - ->expects($this->any()) - ->method('getCacheKey') - ->will($this->returnValue($cacheKey)); - $this->mockFetcher - ->expects($this->once()) - ->method('fetchAuthToken') - ->will($this->returnValue($authResult)); - - SubscriberCallback::$expectedKey = $this->getValidKeyName($prefix . $cacheKey); - SubscriberCallback::$expectedValue = $token; - SubscriberCallback::$called = false; - - // Run the test - $cachedFetcher = new FetchAuthTokenCache( - $this->mockFetcher, - ['prefix' => $prefix], - $this->mockCache - ); - $a = new AuthTokenSubscriber( - $cachedFetcher, - null, - $tokenCallback - ); - - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'google_auth']); - $before = new BeforeEvent(new Transaction($client, $request)); - $a->onBefore($before); - $this->assertTrue(SubscriberCallback::$called); - } - - public function provideShouldNotifyTokenCallback() - { - SubscriberCallback::$phpunit = $this; - $anonymousFunc = function ($key, $value) { - SubscriberCallback::staticInvoke($key, $value); - }; - return [ - ['Google\Auth\Tests\SubscriberCallbackFunction'], - ['Google\Auth\Tests\SubscriberCallback::staticInvoke'], - [['Google\Auth\Tests\SubscriberCallback', 'staticInvoke']], - [$anonymousFunc], - [[new SubscriberCallback, 'staticInvoke']], - [[new SubscriberCallback, 'methodInvoke']], - [new SubscriberCallback], - ]; - } -} - -class SubscriberCallback -{ - public static $phpunit; - public static $expectedKey; - public static $expectedValue; - public static $called = false; - - public function __invoke($key, $value) - { - self::$phpunit->assertEquals(self::$expectedKey, $key); - self::$phpunit->assertEquals(self::$expectedValue, $value); - self::$called = true; - } - - public function methodInvoke($key, $value) - { - return $this($key, $value); - } - - public static function staticInvoke($key, $value) - { - $instance = new self(); - return $instance($key, $value); - } -} - -function SubscriberCallbackFunction($key, $value) -{ - return SubscriberCallback::staticInvoke($key, $value); -} diff --git a/vendor/google/auth/tests/Subscriber/ScopedAccessTokenSubscriberTest.php b/vendor/google/auth/tests/Subscriber/ScopedAccessTokenSubscriberTest.php deleted file mode 100644 index 829c5b27..00000000 --- a/vendor/google/auth/tests/Subscriber/ScopedAccessTokenSubscriberTest.php +++ /dev/null @@ -1,246 +0,0 @@ -onlyGuzzle5(); - - $this->mockCacheItem = - $this - ->getMockBuilder('Psr\Cache\CacheItemInterface') - ->getMock(); - $this->mockCache = - $this - ->getMockBuilder('Psr\Cache\CacheItemPoolInterface') - ->getMock(); - $this->mockRequest = - $this - ->getMockBuilder('GuzzleHttp\Psr7\Request') - ->disableOriginalConstructor() - ->getMock(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testRequiresScopeAsAStringOrArray() - { - $fakeAuthFunc = function ($unused_scopes) { - return '1/abcdef1234567890'; - }; - new ScopedAccessTokenSubscriber($fakeAuthFunc, new \stdClass(), array()); - } - - public function testSubscribesToEvents() - { - $fakeAuthFunc = function ($unused_scopes) { - return '1/abcdef1234567890'; - }; - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, array()); - $this->assertArrayHasKey('before', $s->getEvents()); - } - - public function testAddsTheTokenAsAnAuthorizationHeader() - { - $fakeAuthFunc = function ($unused_scopes) { - return '1/abcdef1234567890'; - }; - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, array()); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'scoped']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame( - 'Bearer 1/abcdef1234567890', - $request->getHeader('authorization') - ); - } - - public function testUsesCachedAuthToken() - { - $cachedValue = '2/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) { - return ''; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($this->getValidKeyName(self::TEST_SCOPE)) - ->will($this->returnValue($this->mockCacheItem)); - - // Run the test - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, array(), - $this->mockCache); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'scoped']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame( - 'Bearer 2/abcdef1234567890', - $request->getHeader('authorization') - ); - } - - public function testGetsCachedAuthTokenUsingCachePrefix() - { - $prefix = 'test_prefix_'; - $cachedValue = '2/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) { - return ''; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(true)); - $this->mockCacheItem - ->expects($this->once()) - ->method('get') - ->will($this->returnValue($cachedValue)); - $this->mockCache - ->expects($this->once()) - ->method('getItem') - ->with($prefix . $this->getValidKeyName(self::TEST_SCOPE)) - ->will($this->returnValue($this->mockCacheItem)); - - // Run the test - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, - ['prefix' => $prefix], - $this->mockCache); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'scoped']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame( - 'Bearer 2/abcdef1234567890', - $request->getHeader('authorization') - ); - } - - public function testShouldSaveValueInCache() - { - $token = '2/abcdef1234567890'; - $fakeAuthFunc = function ($unused_scopes) { - return '2/abcdef1234567890'; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)) - ->will($this->returnValue(false)); - $this->mockCache - ->expects($this->exactly(2)) - ->method('getItem') - ->with($this->getValidKeyName(self::TEST_SCOPE)) - ->will($this->returnValue($this->mockCacheItem)); - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, array(), - $this->mockCache); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'scoped']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame( - 'Bearer 2/abcdef1234567890', - $request->getHeader('authorization') - ); - } - - public function testShouldSaveValueInCacheWithCacheOptions() - { - $token = '2/abcdef1234567890'; - $prefix = 'test_prefix_'; - $lifetime = '70707'; - $fakeAuthFunc = function ($unused_scopes) { - return '2/abcdef1234567890'; - }; - $this->mockCacheItem - ->expects($this->once()) - ->method('isHit') - ->will($this->returnValue(false)); - $this->mockCacheItem - ->expects($this->once()) - ->method('set') - ->with($this->equalTo($token)); - $this->mockCacheItem - ->expects($this->once()) - ->method('expiresAfter') - ->with($this->equalTo($lifetime)); - $this->mockCache - ->expects($this->exactly(2)) - ->method('getItem') - ->with($prefix . $this->getValidKeyName(self::TEST_SCOPE)) - ->will($this->returnValue($this->mockCacheItem)); - - // Run the test - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, - ['prefix' => $prefix, 'lifetime' => $lifetime], - $this->mockCache); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'scoped']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame( - 'Bearer 2/abcdef1234567890', - $request->getHeader('authorization') - ); - } - - public function testOnlyTouchesWhenAuthConfigScoped() - { - $fakeAuthFunc = function ($unused_scopes) { - return '1/abcdef1234567890'; - }; - $s = new ScopedAccessTokenSubscriber($fakeAuthFunc, self::TEST_SCOPE, array()); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'notscoped']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertSame('', $request->getHeader('authorization')); - } -} diff --git a/vendor/google/auth/tests/Subscriber/SimpleSubscriberTest.php b/vendor/google/auth/tests/Subscriber/SimpleSubscriberTest.php deleted file mode 100644 index 6c392e66..00000000 --- a/vendor/google/auth/tests/Subscriber/SimpleSubscriberTest.php +++ /dev/null @@ -1,69 +0,0 @@ -onlyGuzzle5(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testRequiresADeveloperKey() - { - new SimpleSubscriber(['not_key' => 'a test key']); - } - - public function testSubscribesToEvents() - { - $events = (new SimpleSubscriber(['key' => 'a test key']))->getEvents(); - $this->assertArrayHasKey('before', $events); - } - - public function testAddsTheKeyToTheQuery() - { - $s = new SimpleSubscriber(['key' => 'test_key']); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'simple']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertCount(1, $request->getQuery()); - $this->assertTrue($request->getQuery()->hasKey('key')); - $this->assertSame($request->getQuery()->get('key'), 'test_key'); - } - - public function testOnlyTouchesWhenAuthConfigIsSimple() - { - $s = new SimpleSubscriber(['key' => 'test_key']); - $client = new Client(); - $request = $client->createRequest('GET', 'http://testing.org', - ['auth' => 'notsimple']); - $before = new BeforeEvent(new Transaction($client, $request)); - $s->onBefore($before); - $this->assertCount(0, $request->getQuery()); - } -} diff --git a/vendor/google/auth/tests/bootstrap.php b/vendor/google/auth/tests/bootstrap.php deleted file mode 100644 index 6e7b7d5f..00000000 --- a/vendor/google/auth/tests/bootstrap.php +++ /dev/null @@ -1,55 +0,0 @@ - $handler]); - - return new \Google\Auth\HttpHandler\Guzzle6HttpHandler($client); - } - - $client = new \GuzzleHttp\Client(); - $client->getEmitter()->attach( - new \GuzzleHttp\Subscriber\Mock($mockResponses) - ); - - return new \Google\Auth\HttpHandler\Guzzle5HttpHandler($client); -} diff --git a/vendor/google/auth/tests/fixtures/.config/gcloud/application_default_credentials.json b/vendor/google/auth/tests/fixtures/.config/gcloud/application_default_credentials.json deleted file mode 100644 index 608d325c..00000000 --- a/vendor/google/auth/tests/fixtures/.config/gcloud/application_default_credentials.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "private_key_id": "key123", - "private_key": "privatekey", - "client_email": "hello@youarecool.com", - "client_id": "client123", - "type": "service_account" -} \ No newline at end of file diff --git a/vendor/google/auth/tests/fixtures/private.json b/vendor/google/auth/tests/fixtures/private.json deleted file mode 100644 index 608d325c..00000000 --- a/vendor/google/auth/tests/fixtures/private.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "private_key_id": "key123", - "private_key": "privatekey", - "client_email": "hello@youarecool.com", - "client_id": "client123", - "type": "service_account" -} \ No newline at end of file diff --git a/vendor/google/auth/tests/fixtures/private.pem b/vendor/google/auth/tests/fixtures/private.pem deleted file mode 100644 index 00a658fe..00000000 --- a/vendor/google/auth/tests/fixtures/private.pem +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQDzU+jLTzW6154Joezxrd2+5pCNYP0HcaMoYqEyXfNRpkNE7wrQ -UEG830o4Qcaae2BhqZoujwSW7RkR6h0Fkd0WTR8h5J8rSGNHv/1jJoUUjP9iZ/5S -FAyIIyEYfDPqtnA4iF1QWO2lXWlEFSuZjwM/8jBmeGzoiw17akNThIw8NwIDAQAB -AoGATpboVloEAY/IdFX/QGOmfhTb1T3hG3lheBa695iOkO2BRo9qT7PMN6NqxlbA -PX7ht0lfCfCZS+HSOg4CR50/6WXHMSmwlvcjGuDIDKWjviQTTYE77MlVBQHw9WzY -PfiRBbtouyPGQtO4rk42zkIILC6exBZ1vKpRPOmTAnxrjCECQQD+56r6hYcS6GNp -NOWyv0eVFMBX4iNWAsRf9JVVvGDz2rVuhnkNiN73vfffDWvSXkCydL1jFmalgdQD -gm77UZQHAkEA9F+CauU0aZsJ1SthQ6H0sDQ+eNRUgnz4itnkSC2C20fZ3DaSpCMC -0go81CcZOhftNO730ILqiS67C3d3rqLqUQJBAP10ROHMmz4Fq7MUUcClyPtHIuk/ -hXskTTZL76DMKmrN8NDxDLSUf38+eJRkt+z4osPOp/E6eN3gdXr32nox50kCQCl8 -hXGMU+eR0IuF/88xkY7Qb8KnmWlFuhQohZ7TSyHbAttl0GNZJkNuRYFm2duI8FZK -M3wMnbCIZGy/7WuScOECQQCV+0yrf5dL1M2GHjJfwuTb00wRKalKQEH1v/kvE5vS -FmdN7BPK5Ra50MaecMNoYqu9rmtyWRBn93dcvKrL57nY ------END RSA PRIVATE KEY----- diff --git a/vendor/google/auth/tests/fixtures/public.pem b/vendor/google/auth/tests/fixtures/public.pem deleted file mode 100644 index 00a8f7af..00000000 --- a/vendor/google/auth/tests/fixtures/public.pem +++ /dev/null @@ -1,6 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzU+jLTzW6154Joezxrd2+5pCN -YP0HcaMoYqEyXfNRpkNE7wrQUEG830o4Qcaae2BhqZoujwSW7RkR6h0Fkd0WTR8h -5J8rSGNHv/1jJoUUjP9iZ/5SFAyIIyEYfDPqtnA4iF1QWO2lXWlEFSuZjwM/8jBm -eGzoiw17akNThIw8NwIDAQAB ------END PUBLIC KEY----- diff --git a/vendor/google/auth/tests/fixtures2/.config/gcloud/application_default_credentials.json b/vendor/google/auth/tests/fixtures2/.config/gcloud/application_default_credentials.json deleted file mode 100644 index 5b5063d8..00000000 --- a/vendor/google/auth/tests/fixtures2/.config/gcloud/application_default_credentials.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "client_id": "client123", - "client_secret": "clientSecret123", - "refresh_token": "refreshToken123", - "type": "authorized_user" -} diff --git a/vendor/google/auth/tests/fixtures2/private.json b/vendor/google/auth/tests/fixtures2/private.json deleted file mode 100644 index 5b5063d8..00000000 --- a/vendor/google/auth/tests/fixtures2/private.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "client_id": "client123", - "client_secret": "clientSecret123", - "refresh_token": "refreshToken123", - "type": "authorized_user" -} diff --git a/vendor/google/auth/tests/mocks/AppIdentityService.php b/vendor/google/auth/tests/mocks/AppIdentityService.php deleted file mode 100644 index 324292a9..00000000 --- a/vendor/google/auth/tests/mocks/AppIdentityService.php +++ /dev/null @@ -1,19 +0,0 @@ - 'xyz', - 'expiration_time' => '2147483646', - ); - - public static function getAccessToken($scope) - { - self::$scope = $scope; - - return self::$accessToken; - } -} diff --git a/vendor/guzzlehttp/guzzle/.php_cs b/vendor/guzzlehttp/guzzle/.php_cs new file mode 100644 index 00000000..2dd5036c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/.php_cs @@ -0,0 +1,23 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'declare_strict_types' => false, + 'concat_space' => ['spacing'=>'one'], + 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], + 'ordered_imports' => true, + // 'phpdoc_align' => ['align'=>'vertical'], + // 'native_function_invocation' => true, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') + ->name('*.php') + ) +; + +return $config; diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md index 25fcbb3e..464cf1c5 100644 --- a/vendor/guzzlehttp/guzzle/CHANGELOG.md +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -1,5 +1,61 @@ # Change Log +## 6.5.5 - 2020-06-16 + +* Unpin version constraint for `symfony/polyfill-intl-idn` [#2678](https://github.com/guzzle/guzzle/pull/2678) + +## 6.5.4 - 2020-05-25 + +* Fix various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) + +## 6.5.3 - 2020-04-18 + +* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) +* Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548) + +## 6.5.2 - 2019-12-23 + +* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) + +## 6.5.1 - 2019-12-21 + +* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) +* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) + +## 6.5.0 - 2019-12-07 + +* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) +* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) +* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) +* Fix: `RetryMiddleware` did not do exponential delay between retries due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) + Previously, `RetryMiddleware` would sleep for 1 millisecond, then 2 milliseconds, then 4 milliseconds. + **After this change, `RetryMiddleware` will sleep for 1 second, then 2 seconds, then 4 seconds.** + `Middleware::retry()` accepts a second callback parameter to override the default timeouts if needed. +* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) +* Deprecated `ClientInterface::VERSION` + +## 6.4.1 - 2019-10-23 + +* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that +* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` + +## 6.4.0 - 2019-10-23 + +* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) +* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) +* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) +* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) +* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) +* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) +* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) +* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) +* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) + +## 6.3.3 - 2018-04-22 + +* Fix: Default headers when decode_content is specified + + ## 6.3.2 - 2018-03-26 * Fix: Release process diff --git a/vendor/guzzlehttp/guzzle/Dockerfile b/vendor/guzzlehttp/guzzle/Dockerfile new file mode 100644 index 00000000..f6a09523 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/Dockerfile @@ -0,0 +1,18 @@ +FROM composer:latest as setup + +RUN mkdir /guzzle + +WORKDIR /guzzle + +RUN set -xe \ + && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár " --no-interaction \ + && composer require guzzlehttp/guzzle + + +FROM php:7.3 + +RUN mkdir /guzzle + +WORKDIR /guzzle + +COPY --from=setup /guzzle /guzzle diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md index bcd18b8e..5fdb6c5f 100644 --- a/vendor/guzzlehttp/guzzle/README.md +++ b/vendor/guzzlehttp/guzzle/README.md @@ -21,19 +21,18 @@ trivial to integrate with web services. ```php $client = new \GuzzleHttp\Client(); -$res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); -echo $res->getStatusCode(); -// 200 -echo $res->getHeaderLine('content-type'); -// 'application/json; charset=utf8' -echo $res->getBody(); -// '{"id": 1420053, "name": "guzzle", ...}' - -// Send an asynchronous request. +$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); + +echo $response->getStatusCode(); # 200 +echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8' +echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}' + +# Send an asynchronous request. $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); $promise = $client->sendAsync($request)->then(function ($response) { echo 'I completed! ' . $response->getBody(); }); + $promise->wait(); ``` @@ -57,7 +56,7 @@ curl -sS https://getcomposer.org/installer | php Next, run the Composer command to install the latest stable version of Guzzle: ```bash -php composer.phar require guzzlehttp/guzzle +composer require guzzlehttp/guzzle ``` After installing, you need to require Composer's autoloader: @@ -69,7 +68,7 @@ require 'vendor/autoload.php'; You can then later update Guzzle using composer: ```bash -composer.phar update +composer update ``` @@ -79,13 +78,13 @@ composer.phar update |---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------| | 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 | | 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 | -| 5.x | Maintained | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | +| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | | 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 | [guzzle-3-repo]: https://github.com/guzzle/guzzle3 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 [guzzle-6-repo]: https://github.com/guzzle/guzzle -[guzzle-3-docs]: http://guzzle3.readthedocs.org/en/latest/ +[guzzle-3-docs]: http://guzzle3.readthedocs.org [guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/ [guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/ diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json index 0ebf81e0..c01864f0 100644 --- a/vendor/guzzlehttp/guzzle/composer.json +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -2,7 +2,15 @@ "name": "guzzlehttp/guzzle", "type": "library", "description": "Guzzle is a PHP HTTP client library", - "keywords": ["framework", "http", "rest", "web service", "curl", "client", "HTTP client"], + "keywords": [ + "framework", + "http", + "rest", + "web service", + "curl", + "client", + "HTTP client" + ], "homepage": "http://guzzlephp.org/", "license": "MIT", "authors": [ @@ -14,31 +22,38 @@ ], "require": { "php": ">=5.5", - "guzzlehttp/psr7": "^1.4", - "guzzlehttp/promises": "^1.0" + "ext-json": "*", + "symfony/polyfill-intl-idn": "^1.17.0", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1" }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4", - "psr/log": "^1.0" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } }, "autoload": { - "files": ["src/functions_include.php"], "psr-4": { "GuzzleHttp\\": "src/" - } + }, + "files": [ + "src/functions_include.php" + ] }, "autoload-dev": { "psr-4": { "GuzzleHttp\\Tests\\": "tests/" } - }, - "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "extra": { - "branch-alias": { - "dev-master": "6.3-dev" - } } } diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php index 6b35d892..315a022c 100644 --- a/vendor/guzzlehttp/guzzle/src/Client.php +++ b/vendor/guzzlehttp/guzzle/src/Client.php @@ -2,11 +2,12 @@ namespace GuzzleHttp; use GuzzleHttp\Cookie\CookieJar; +use GuzzleHttp\Exception\GuzzleException; use GuzzleHttp\Promise; use GuzzleHttp\Psr7; -use Psr\Http\Message\UriInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; /** * @method ResponseInterface get(string|UriInterface $uri, array $options = []) @@ -46,9 +47,8 @@ class Client implements ClientInterface * wire. The function is called with a Psr7\Http\Message\RequestInterface * and array of transfer options, and must return a * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a - * Psr7\Http\Message\ResponseInterface on success. "handler" is a - * constructor only option that cannot be overridden in per/request - * options. If no handler is provided, a default handler will be created + * Psr7\Http\Message\ResponseInterface on success. + * If no handler is provided, a default handler will be created * that enables all of the request options below by attaching all of the * default middleware to the handler. * - base_uri: (string|UriInterface) Base URI of the client that is merged @@ -75,6 +75,12 @@ public function __construct(array $config = []) $this->configureDefaults($config); } + /** + * @param string $method + * @param array $args + * + * @return Promise\PromiseInterface + */ public function __call($method, $args) { if (count($args) < 1) { @@ -89,6 +95,14 @@ public function __call($method, $args) : $this->request($method, $uri, $opts); } + /** + * Asynchronously send an HTTP request. + * + * @param array $options Request options to apply to the given + * request and to the transfer. See \GuzzleHttp\RequestOptions. + * + * @return Promise\PromiseInterface + */ public function sendAsync(RequestInterface $request, array $options = []) { // Merge the base URI into the request URI if needed. @@ -100,12 +114,35 @@ public function sendAsync(RequestInterface $request, array $options = []) ); } + /** + * Send an HTTP request. + * + * @param array $options Request options to apply to the given + * request and to the transfer. See \GuzzleHttp\RequestOptions. + * + * @return ResponseInterface + * @throws GuzzleException + */ public function send(RequestInterface $request, array $options = []) { $options[RequestOptions::SYNCHRONOUS] = true; return $this->sendAsync($request, $options)->wait(); } + /** + * Create and send an asynchronous HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string $method HTTP method + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. + * + * @return Promise\PromiseInterface + */ public function requestAsync($method, $uri = '', array $options = []) { $options = $this->prepareDefaults($options); @@ -125,12 +162,37 @@ public function requestAsync($method, $uri = '', array $options = []) return $this->transfer($request, $options); } + /** + * Create and send an HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string $method HTTP method. + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. + * + * @return ResponseInterface + * @throws GuzzleException + */ public function request($method, $uri = '', array $options = []) { $options[RequestOptions::SYNCHRONOUS] = true; return $this->requestAsync($method, $uri, $options)->wait(); } + /** + * Get a client configuration option. + * + * These options include default request options of the client, a "handler" + * (if utilized by the concrete client), and a "base_uri" if utilized by + * the concrete client. + * + * @param string|null $option The config option to retrieve. + * + * @return mixed + */ public function getConfig($option = null) { return $option === null @@ -138,6 +200,11 @@ public function getConfig($option = null) : (isset($this->config[$option]) ? $this->config[$option] : null); } + /** + * @param string|null $uri + * + * @return UriInterface + */ private function buildUri($uri, array $config) { // for BC we accept null which would otherwise fail in uri_for @@ -147,6 +214,11 @@ private function buildUri($uri, array $config) $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); } + if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) { + $idnOptions = ($config['idn_conversion'] === true) ? IDNA_DEFAULT : $config['idn_conversion']; + $uri = Utils::idnUriConvert($uri, $idnOptions); + } + return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; } @@ -154,6 +226,7 @@ private function buildUri($uri, array $config) * Configures the default options for a client. * * @param array $config + * @return void */ private function configureDefaults(array $config) { @@ -162,7 +235,8 @@ private function configureDefaults(array $config) 'http_errors' => true, 'decode_content' => true, 'verify' => true, - 'cookies' => false + 'cookies' => false, + 'idn_conversion' => true, ]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. @@ -170,7 +244,7 @@ private function configureDefaults(array $config) // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". - if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) { + if (php_sapi_name() === 'cli' && getenv('HTTP_PROXY')) { $defaults['proxy']['http'] = getenv('HTTP_PROXY'); } @@ -210,7 +284,7 @@ private function configureDefaults(array $config) * * @return array */ - private function prepareDefaults($options) + private function prepareDefaults(array $options) { $defaults = $this->config; @@ -225,7 +299,7 @@ private function prepareDefaults($options) if (array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { - $defaults['_conditional'] = null; + $defaults['_conditional'] = []; unset($options['headers']); } elseif (!is_array($options['headers'])) { throw new \InvalidArgumentException('headers must be an array'); @@ -251,8 +325,7 @@ private function prepareDefaults($options) * The URI of the request is not modified and the request options are used * as-is without merging in default options. * - * @param RequestInterface $request - * @param array $options + * @param array $options See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ @@ -271,6 +344,7 @@ private function transfer(RequestInterface $request, array $options) } $request = $this->applyOptions($request, $options); + /** @var HandlerStack $handler */ $handler = $options['handler']; try { @@ -331,7 +405,7 @@ private function applyOptions(RequestInterface $request, array &$options) && $options['decode_content'] !== true ) { // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $modify['set_headers']); + $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } @@ -411,6 +485,11 @@ private function applyOptions(RequestInterface $request, array &$options) return $request; } + /** + * Throw Exception with pre-set message. + * @return void + * @throws \InvalidArgumentException Invalid body. + */ private function invalidBody() { throw new \InvalidArgumentException('Passing in the "body" request ' diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php index 8de39166..638b75dc 100644 --- a/vendor/guzzlehttp/guzzle/src/ClientInterface.php +++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -1,8 +1,8 @@ cookies as $cookie) { @@ -103,6 +103,8 @@ public function getCookieByName($name) return $cookie; } } + + return null; } public function toArray() @@ -120,7 +122,7 @@ public function clear($domain = null, $path = null, $name = null) } elseif (!$path) { $this->cookies = array_filter( $this->cookies, - function (SetCookie $cookie) use ($path, $domain) { + function (SetCookie $cookie) use ($domain) { return !$cookie->matchesDomain($domain); } ); diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php index 2cf298a8..6ee11885 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php @@ -58,9 +58,9 @@ public function setCookie(SetCookie $cookie); * arguments, then the cookie with the specified name, path and domain is * removed. * - * @param string $domain Clears cookies matching a domain - * @param string $path Clears cookies matching a domain and path - * @param string $name Clears cookies matching a domain, path, and name + * @param string|null $domain Clears cookies matching a domain + * @param string|null $path Clears cookies matching a domain and path + * @param string|null $name Clears cookies matching a domain, path, and name * * @return CookieJarInterface */ diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php index 9887c1d5..3fb8600e 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php @@ -23,6 +23,7 @@ class FileCookieJar extends CookieJar */ public function __construct($cookieFile, $storeSessionCookies = false) { + parent::__construct(); $this->filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; @@ -56,7 +57,7 @@ public function save($filename) } $jsonStr = \GuzzleHttp\json_encode($json); - if (false === file_put_contents($filename, $jsonStr)) { + if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php index 4497bcf0..0224a244 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -22,6 +22,7 @@ class SessionCookieJar extends CookieJar */ public function __construct($sessionKey, $storeSessionCookies = false) { + parent::__construct(); $this->sessionKey = $sessionKey; $this->storeSessionCookies = $storeSessionCookies; $this->load(); diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php index 4c404077..3d776a70 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -227,7 +227,7 @@ public function setExpires($timestamp) /** * Get whether or not this is a secure cookie * - * @return null|bool + * @return bool|null */ public function getSecure() { @@ -247,7 +247,7 @@ public function setSecure($secure) /** * Get whether or not this is a session cookie * - * @return null|bool + * @return bool|null */ public function getDiscard() { @@ -377,8 +377,8 @@ public function validate() // Check if any of the invalid characters are present in the cookie name if (preg_match( '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', - $name) - ) { + $name + )) { return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\"/?={}'; diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php index f95c09f2..4cfd393c 100644 --- a/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php +++ b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php @@ -4,4 +4,6 @@ /** * Exception when a client error is encountered (4xx codes) */ -class ClientException extends BadResponseException {} +class ClientException extends BadResponseException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php index 510778f6..27b2722b 100644 --- a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php +++ b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php @@ -1,13 +1,23 @@ getBody(); - - if (!$body->isSeekable()) { - return null; - } - - $size = $body->getSize(); - - if ($size === 0) { - return null; - } - - $summary = $body->read(120); - $body->rewind(); - - if ($size > 120) { - $summary .= ' (truncated...)'; - } - - // Matches any printable character, including unicode characters: - // letters, marks, numbers, punctuation, spacing, and separators. - if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) { - return null; - } - - return $summary; + return \GuzzleHttp\Psr7\get_message_body_summary($response); } /** - * Obfuscates URI if there is an username and a password present + * Obfuscates URI if there is a username and a password present * * @param UriInterface $uri * * @return UriInterface */ - private static function obfuscateUri($uri) + private static function obfuscateUri(UriInterface $uri) { $userInfo = $uri->getUserInfo(); diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php index 7cdd3408..127094c1 100644 --- a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php +++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -4,4 +4,6 @@ /** * Exception when a server error is encountered (5xx codes) */ -class ServerException extends BadResponseException {} +class ServerException extends BadResponseException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php index b60a9678..fff05251 100644 --- a/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php +++ b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php @@ -1,4 +1,6 @@ handle); + $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME); $stats = new TransferStats( $easy->request, $easy->response, @@ -136,7 +140,9 @@ private static function finishError( $ctx = [ 'errno' => $easy->errno, 'error' => curl_error($easy->handle), + 'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME), ] + curl_getinfo($easy->handle); + $ctx[self::CURL_VERSION_STR] = curl_version()['version']; $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. @@ -172,13 +178,22 @@ private static function createRejection(EasyHandle $easy, array $ctx) ) ); } - - $message = sprintf( - 'cURL error %s: %s (%s)', - $ctx['errno'], - $ctx['error'], - 'see http://curl.haxx.se/libcurl/c/libcurl-errors.html' - ); + if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { + $message = sprintf( + 'cURL error %s: %s (%s)', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' + ); + } else { + $message = sprintf( + 'cURL error %s: %s (%s) for %s', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', + $easy->request->getUri() + ); + } // Create a connection exception if it was a specific error code. $error = isset($connectionErrors[$easy->errno]) @@ -439,11 +454,16 @@ private function applyHandlerOptions(EasyHandle $easy, array &$conf) } if (isset($options['ssl_key'])) { - $sslKey = $options['ssl_key']; - if (is_array($sslKey)) { - $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1]; - $sslKey = $sslKey[0]; + if (is_array($options['ssl_key'])) { + if (count($options['ssl_key']) === 2) { + list($sslKey, $conf[CURLOPT_SSLKEYPASSWD]) = $options['ssl_key']; + } else { + list($sslKey) = $options['ssl_key']; + } } + + $sslKey = isset($sslKey) ? $sslKey: $options['ssl_key']; + if (!file_exists($sslKey)) { throw new \InvalidArgumentException( "SSL private key not found: {$sslKey}" diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php index 2754d8e4..564c95f4 100644 --- a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -3,7 +3,7 @@ use GuzzleHttp\Promise as P; use GuzzleHttp\Promise\Promise; -use GuzzleHttp\Psr7; +use GuzzleHttp\Utils; use Psr\Http\Message\RequestInterface; /** @@ -23,6 +23,7 @@ class CurlMultiHandler private $active; private $handles = []; private $delays = []; + private $options = []; /** * This handler accepts the following options: @@ -30,6 +31,8 @@ class CurlMultiHandler * - handle_factory: An optional factory used to create curl handles * - select_timeout: Optional timeout (in seconds) to block before timing * out while selecting curl handles. Defaults to 1 second. + * - options: An associative array of CURLMOPT_* options and + * corresponding values for curl_multi_setopt() * * @param array $options */ @@ -37,14 +40,31 @@ public function __construct(array $options = []) { $this->factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(50); - $this->selectTimeout = isset($options['select_timeout']) - ? $options['select_timeout'] : 1; + + if (isset($options['select_timeout'])) { + $this->selectTimeout = $options['select_timeout']; + } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { + $this->selectTimeout = $selectTimeout; + } else { + $this->selectTimeout = 1; + } + + $this->options = isset($options['options']) ? $options['options'] : []; } public function __get($name) { if ($name === '_mh') { - return $this->_mh = curl_multi_init(); + $this->_mh = curl_multi_init(); + + foreach ($this->options as $option => $value) { + // A warning is raised in case of a wrong option. + curl_multi_setopt($this->_mh, $option, $value); + } + + // Further calls to _mh will return the value directly, without entering the + // __get() method at all. + return $this->_mh; } throw new \BadMethodCallException(); @@ -82,7 +102,7 @@ public function tick() { // Add any delayed handles if needed. if ($this->delays) { - $currentTime = microtime(true); + $currentTime = Utils::currentTime(); foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); @@ -134,7 +154,7 @@ private function addRequest(array $entry) if (empty($easy->options['delay'])) { curl_multi_add_handle($this->_mh, $easy->handle); } else { - $this->delays[$id] = microtime(true) + ($easy->options['delay'] / 1000); + $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000); } } @@ -186,7 +206,7 @@ private function processMessages() private function timeToNext() { - $currentTime = microtime(true); + $currentTime = Utils::currentTime(); $nextTime = PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { diff --git a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php index d892061c..5b312bc0 100644 --- a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php +++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php @@ -66,7 +66,7 @@ public function __invoke(RequestInterface $request, array $options) throw new \OutOfBoundsException('Mock queue is empty'); } - if (isset($options['delay'])) { + if (isset($options['delay']) && is_numeric($options['delay'])) { usleep($options['delay'] * 1000); } @@ -175,6 +175,11 @@ public function count() return count($this->queue); } + public function reset() + { + $this->queue = []; + } + private function invokeStats( RequestInterface $request, array $options, @@ -182,7 +187,8 @@ private function invokeStats( $reason = null ) { if (isset($options['on_stats'])) { - $stats = new TransferStats($request, $response, 0, $reason); + $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; + $stats = new TransferStats($request, $response, $transferTime, $reason); call_user_func($options['on_stats'], $stats); } } diff --git a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php index b686545e..a15734a4 100644 --- a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php +++ b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php @@ -1,12 +1,13 @@ getBody()->getSize()) { - $request = $request->withHeader('Content-Length', 0); + $request = $request->withHeader('Content-Length', '0'); } return $this->createResponse( @@ -82,7 +83,7 @@ private function invokeStats( $stats = new TransferStats( $request, $response, - microtime(true) - $startTime, + Utils::currentTime() - $startTime, $error, [] ); @@ -343,13 +344,25 @@ private function resolveHost(RequestInterface $request, array $options) if ('v4' === $options['force_ip_resolve']) { $records = dns_get_record($uri->getHost(), DNS_A); if (!isset($records[0]['ip'])) { - throw new ConnectException(sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); + throw new ConnectException( + sprintf( + "Could not resolve IPv4 address for host '%s'", + $uri->getHost() + ), + $request + ); } $uri = $uri->withHost($records[0]['ip']); } elseif ('v6' === $options['force_ip_resolve']) { $records = dns_get_record($uri->getHost(), DNS_AAAA); if (!isset($records[0]['ipv6'])) { - throw new ConnectException(sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); + throw new ConnectException( + sprintf( + "Could not resolve IPv6 address for host '%s'", + $uri->getHost() + ), + $request + ); } $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); } diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php index 24c46fd9..6a49cc06 100644 --- a/vendor/guzzlehttp/guzzle/src/HandlerStack.php +++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php @@ -1,7 +1,9 @@ extractCookies($request, $response); return $response; } - ); + ); }; }; } @@ -58,7 +57,7 @@ public static function httpErrors() return $handler($request, $options); } return $handler($request, $options)->then( - function (ResponseInterface $response) use ($request, $handler) { + function (ResponseInterface $response) use ($request) { $code = $response->getStatusCode(); if ($code < 400) { return $response; @@ -73,7 +72,7 @@ function (ResponseInterface $response) use ($request, $handler) { /** * Middleware that pushes history data to an ArrayAccess container. * - * @param array $container Container to hold the history (by reference). + * @param array|\ArrayAccess $container Container to hold the history (by reference). * * @return callable Returns a function that accepts the next handler. * @throws \InvalidArgumentException if container is not an array or ArrayAccess. @@ -183,7 +182,7 @@ public static function retry(callable $decider, callable $delay = null) * * @return callable Returns a function that accepts the next handler. */ - public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = LogLevel::INFO) + public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */) { return function (callable $handler) use ($logger, $formatter, $logLevel) { return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) { diff --git a/vendor/guzzlehttp/guzzle/src/Pool.php b/vendor/guzzlehttp/guzzle/src/Pool.php index 8f1be33c..5838db4f 100644 --- a/vendor/guzzlehttp/guzzle/src/Pool.php +++ b/vendor/guzzlehttp/guzzle/src/Pool.php @@ -1,12 +1,13 @@ each = new EachPromise($requests(), $config); } + /** + * Get promise + * + * @return PromiseInterface + */ public function promise() { return $this->each->promise(); @@ -106,6 +112,11 @@ public static function batch( return $res; } + /** + * Execute callback(s) + * + * @return void + */ private static function cmpCallback(array &$options, $name, array &$results) { if (!isset($options[$name])) { diff --git a/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php index 2eb95f9b..568a1e90 100644 --- a/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php +++ b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -66,6 +66,11 @@ public function __invoke(RequestInterface $request, array $options) return $fn(Psr7\modify_request($request, $modify), $options); } + /** + * Add expect header + * + * @return void + */ private function addExpectHeader( RequestInterface $request, array $options, diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php index 131b7717..e4644b7a 100644 --- a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php +++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -13,7 +13,7 @@ * Request redirect middleware. * * Apply this middleware like other middleware using - * {@see GuzzleHttp\Middleware::redirect()}. + * {@see \GuzzleHttp\Middleware::redirect()}. */ class RedirectMiddleware { @@ -76,7 +76,7 @@ public function __invoke(RequestInterface $request, array $options) /** * @param RequestInterface $request * @param array $options - * @param ResponseInterface|PromiseInterface $response + * @param ResponseInterface $response * * @return ResponseInterface|PromiseInterface */ @@ -118,6 +118,11 @@ public function checkRedirect( return $promise; } + /** + * Enable tracking on promise. + * + * @return PromiseInterface + */ private function withTracking(PromiseInterface $promise, $uri, $statusCode) { return $promise->then( @@ -135,6 +140,13 @@ function (ResponseInterface $response) use ($uri, $statusCode) { ); } + /** + * Check for too many redirects + * + * @return void + * + * @throws TooManyRedirectsException Too many redirects. + */ private function guardMax(RequestInterface $request, array &$options) { $current = isset($options['__redirect_count']) @@ -172,13 +184,19 @@ public function modifyRequest( // would do. $statusCode = $response->getStatusCode(); if ($statusCode == 303 || - ($statusCode <= 302 && $request->getBody() && !$options['allow_redirects']['strict']) + ($statusCode <= 302 && !$options['allow_redirects']['strict']) ) { $modify['method'] = 'GET'; $modify['body'] = ''; } - $modify['uri'] = $this->redirectUri($request, $response, $protocols); + $uri = $this->redirectUri($request, $response, $protocols); + if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { + $idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion']; + $uri = Utils::idnUriConvert($uri, $idnOptions); + } + + $modify['uri'] = $uri; Psr7\rewind_body($request); // Add the Referer header if it is told to do so and only @@ -186,7 +204,7 @@ public function modifyRequest( if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme() ) { - $uri = $request->getUri()->withUserInfo('', ''); + $uri = $request->getUri()->withUserInfo(''); $modify['set_headers']['Referer'] = (string) $uri; } else { $modify['remove_headers'][] = 'Referer'; diff --git a/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/vendor/guzzlehttp/guzzle/src/RequestOptions.php index c6aacfb1..355f658f 100644 --- a/vendor/guzzlehttp/guzzle/src/RequestOptions.php +++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php @@ -22,7 +22,7 @@ final class RequestOptions * - strict: (bool, default=false) Set to true to use strict redirects * meaning redirect POST requests with POST requests vs. doing what most * browsers do which is redirect POST requests with GET requests - * - referer: (bool, default=true) Set to false to disable the Referer + * - referer: (bool, default=false) Set to true to enable the Referer * header. * - protocols: (array, default=['http', 'https']) Allowed redirect * protocols. @@ -132,6 +132,14 @@ final class RequestOptions */ const HTTP_ERRORS = 'http_errors'; + /** + * idn: (bool|int, default=true) A combination of IDNA_* constants for + * idn_to_ascii() PHP's function (see "options" parameter). Set to false to + * disable IDN support completely, or to true to use the default + * configuration (IDNA_DEFAULT constant). + */ + const IDN_CONVERSION = 'idn_conversion'; + /** * json: (mixed) Adds JSON data to a request. The provided value is JSON * encoded and a Content-Type header of application/json will be added to diff --git a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php index f27090fd..5acc8c5c 100644 --- a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php +++ b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php @@ -19,6 +19,9 @@ class RetryMiddleware /** @var callable */ private $decider; + /** @var callable */ + private $delay; + /** * @param callable $decider Function that accepts the number of retries, * a request, [response], and [exception] and @@ -42,13 +45,13 @@ public function __construct( /** * Default exponential backoff delay function. * - * @param $retries + * @param int $retries * - * @return int + * @return int milliseconds. */ public static function exponentialDelay($retries) { - return (int) pow(2, $retries - 1); + return (int) pow(2, $retries - 1) * 1000; } /** @@ -71,6 +74,11 @@ public function __invoke(RequestInterface $request, array $options) ); } + /** + * Execute fulfilled closure + * + * @return mixed + */ private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use ($req, $options) { @@ -87,6 +95,11 @@ private function onFulfilled(RequestInterface $req, array $options) }; } + /** + * Execute rejected closure + * + * @return callable + */ private function onRejected(RequestInterface $req, array $options) { return function ($reason) use ($req, $options) { @@ -103,6 +116,9 @@ private function onRejected(RequestInterface $req, array $options) }; } + /** + * @return self + */ private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) { $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response); diff --git a/vendor/guzzlehttp/guzzle/src/TransferStats.php b/vendor/guzzlehttp/guzzle/src/TransferStats.php index 15f717e1..87fb3c00 100644 --- a/vendor/guzzlehttp/guzzle/src/TransferStats.php +++ b/vendor/guzzlehttp/guzzle/src/TransferStats.php @@ -18,11 +18,11 @@ final class TransferStats private $handlerErrorData; /** - * @param RequestInterface $request Request that was sent. - * @param ResponseInterface $response Response received (if any) - * @param null $transferTime Total handler transfer time. - * @param mixed $handlerErrorData Handler error data. - * @param array $handlerStats Handler specific stats. + * @param RequestInterface $request Request that was sent. + * @param ResponseInterface|null $response Response received (if any) + * @param float|null $transferTime Total handler transfer time. + * @param mixed $handlerErrorData Handler error data. + * @param array $handlerStats Handler specific stats. */ public function __construct( RequestInterface $request, @@ -93,7 +93,7 @@ public function getEffectiveUri() /** * Get the estimated time the request was being transferred by the handler. * - * @return float Time in seconds. + * @return float|null Time in seconds. */ public function getTransferTime() { diff --git a/vendor/guzzlehttp/guzzle/src/Utils.php b/vendor/guzzlehttp/guzzle/src/Utils.php new file mode 100644 index 00000000..c698acbf --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Utils.php @@ -0,0 +1,92 @@ +getHost()) { + $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); + if ($asciiHost === false) { + $errorBitSet = isset($info['errors']) ? $info['errors'] : 0; + + $errorConstants = array_filter(array_keys(get_defined_constants()), function ($name) { + return substr($name, 0, 11) === 'IDNA_ERROR_'; + }); + + $errors = []; + foreach ($errorConstants as $errorConstant) { + if ($errorBitSet & constant($errorConstant)) { + $errors[] = $errorConstant; + } + } + + $errorMessage = 'IDN conversion failed'; + if ($errors) { + $errorMessage .= ' (errors: ' . implode(', ', $errors) . ')'; + } + + throw new InvalidArgumentException($errorMessage); + } else { + if ($uri->getHost() !== $asciiHost) { + // Replace URI only if the ASCII version is different + $uri = $uri->withHost($asciiHost); + } + } + } + + return $uri; + } + + /** + * @param string $domain + * @param int $options + * @param array $info + * + * @return string|false + */ + private static function idnToAsci($domain, $options, &$info = []) + { + if (\preg_match('%^[ -~]+$%', $domain) === 1) { + return $domain; + } + + if (\extension_loaded('intl') && defined('INTL_IDNA_VARIANT_UTS46')) { + return \idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $info); + } + + /* + * The Idn class is marked as @internal. Verify that class and method exists. + */ + if (method_exists(Idn::class, 'idn_to_ascii')) { + return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info); + } + + throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old'); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php index a3ac450d..c2afd8c7 100644 --- a/vendor/guzzlehttp/guzzle/src/functions.php +++ b/vendor/guzzlehttp/guzzle/src/functions.php @@ -56,7 +56,7 @@ function describe_type($input) /** * Parses an array of header lines into an associative array of headers. * - * @param array $lines Header lines array of strings in the following + * @param iterable $lines Header lines array of strings in the following * format: "Name: Value" * @return array */ @@ -97,8 +97,8 @@ function debug_resource($value = null) * * The returned handler is not wrapped by any default middlewares. * - * @throws \RuntimeException if no viable Handler is available. * @return callable Returns the best handler for the given system. + * @throws \RuntimeException if no viable Handler is available. */ function choose_handler() { @@ -196,7 +196,8 @@ function default_ca_bundle() } } - throw new \RuntimeException(<<< EOT + throw new \RuntimeException( + <<< EOT No system CA bundle could be found in any of the the common system locations. PHP versions earlier than 5.6 are not properly configured to use the system's CA bundle by default. In order to verify peer certificates, you will need to @@ -294,14 +295,14 @@ function is_host_in_noproxy($host, array $noProxyArray) * @param int $options Bitmask of JSON decode options. * * @return mixed - * @throws \InvalidArgumentException if the JSON cannot be decoded. + * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. * @link http://www.php.net/manual/en/function.json-decode.php */ function json_decode($json, $assoc = false, $depth = 512, $options = 0) { $data = \json_decode($json, $assoc, $depth, $options); if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException( + throw new Exception\InvalidArgumentException( 'json_decode error: ' . json_last_error_msg() ); } @@ -317,14 +318,14 @@ function json_decode($json, $assoc = false, $depth = 512, $options = 0) * @param int $depth Set the maximum depth. Must be greater than zero. * * @return string - * @throws \InvalidArgumentException if the JSON cannot be encoded. + * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. * @link http://www.php.net/manual/en/function.json-encode.php */ function json_encode($value, $options = 0, $depth = 512) { $json = \json_encode($value, $options, $depth); if (JSON_ERROR_NONE !== json_last_error()) { - throw new \InvalidArgumentException( + throw new Exception\InvalidArgumentException( 'json_encode error: ' . json_last_error_msg() ); } diff --git a/vendor/guzzlehttp/promises/.php_cs.dist b/vendor/guzzlehttp/promises/.php_cs.dist new file mode 100644 index 00000000..a321876e --- /dev/null +++ b/vendor/guzzlehttp/promises/.php_cs.dist @@ -0,0 +1,88 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'binary_operator_spaces' => ['operators' => ['=>' => null]], + 'blank_line_after_opening_tag' => true, + 'class_attributes_separation' => ['elements' => ['method']], + 'compact_nullable_typehint' => true, + 'concat_space' => ['spacing' => 'one'], + 'declare_equal_normalize' => ['space' => 'none'], + 'declare_strict_types' => false, + 'dir_constant' => true, + 'final_static_access' => true, + 'fully_qualified_strict_types' => true, + 'function_to_constant' => true, + 'function_typehint_space' => true, + 'header_comment' => false, + 'is_null' => ['use_yoda_style' => false], + 'list_syntax' => ['syntax' => 'short'], + 'lowercase_cast' => true, + 'magic_method_casing' => true, + 'modernize_types_casting' => true, + 'multiline_comment_opening_closing' => true, + //'native_constant_invocation' => true, + 'no_alias_functions' => true, + 'no_alternative_syntax' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_empty_comment' => true, + 'no_empty_phpdoc' => true, + 'no_extra_blank_lines' => true, + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_spaces_around_offset' => true, + 'no_superfluous_phpdoc_tags' => ['allow_mixed' => true], + 'no_trailing_comma_in_singleline_array' => true, + 'no_unneeded_control_parentheses' => true, + 'no_unset_cast' => true, + 'no_unused_imports' => true, + 'no_useless_else' => true, + 'no_useless_return' => true, + 'no_whitespace_in_blank_line' => true, + 'normalize_index_brace' => true, + 'ordered_imports' => true, + 'php_unit_construct' => true, + 'php_unit_dedicate_assert' => ['target' => 'newest'], + 'php_unit_dedicate_assert_internal_type' => ['target' => 'newest'], + 'php_unit_expectation' => ['target' => 'newest'], + 'php_unit_mock' => ['target' => 'newest'], + 'php_unit_mock_short_will_return' => true, + 'php_unit_no_expectation_annotation' => ['target' => 'newest'], + 'php_unit_test_annotation' => ['style' => 'prefix'], + //'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], + 'phpdoc_align' => ['align' => 'vertical'], + //'phpdoc_line_span' => ['method' => 'multi', 'property' => 'multi'], + 'phpdoc_no_package' => true, + 'phpdoc_no_useless_inheritdoc' => true, + 'phpdoc_scalar' => true, + 'phpdoc_separation' => true, + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_trim' => true, + 'phpdoc_trim_consecutive_blank_line_separation' => true, + 'phpdoc_types' => true, + 'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'], + 'phpdoc_var_without_name' => true, + 'return_assignment' => true, + 'short_scalar_cast' => true, + 'single_trait_insert_per_statement' => true, + 'standardize_not_equals' => true, + //'static_lambda' => true, + 'ternary_to_null_coalescing' => true, + 'trim_array_spaces' => true, + 'visibility_required' => true, + 'yoda_style' => false, + // 'native_function_invocation' => true, + 'braces' => ['allow_single_line_closure'=>true], + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') + ->name('*.php') + ) +; + +return $config; diff --git a/vendor/guzzlehttp/promises/CHANGELOG.md b/vendor/guzzlehttp/promises/CHANGELOG.md index 551929f6..4b63b2c7 100644 --- a/vendor/guzzlehttp/promises/CHANGELOG.md +++ b/vendor/guzzlehttp/promises/CHANGELOG.md @@ -1,6 +1,22 @@ # CHANGELOG +## 1.4.0 - 2020-09-30 + +### Added + +- Support for PHP 8 +- Optional `$recursive` flag to `all` +- Replaced functions by static methods + +### Fixed + +- Fix empty `each` processing +- Fix promise handling for Iterators of non-unique keys +- Fixed `method_exists` crashes on PHP 8 +- Memory leak on exceptions + + ## 1.3.1 - 2016-12-20 ### Fixed diff --git a/vendor/guzzlehttp/promises/README.md b/vendor/guzzlehttp/promises/README.md index 7b607e28..a95c6059 100644 --- a/vendor/guzzlehttp/promises/README.md +++ b/vendor/guzzlehttp/promises/README.md @@ -26,7 +26,7 @@ for a general introduction to promises. - Promises can be cancelled. - Works with any object that has a `then` function. - C# style async/await coroutine promises using - `GuzzleHttp\Promise\coroutine()`. + `GuzzleHttp\Promise\Coroutine::of()`. # Quick start @@ -88,7 +88,7 @@ $promise }); // Resolving the promise triggers the $onFulfilled callbacks and outputs -// "Hello, reader". +// "Hello, reader." $promise->resolve('reader.'); ``` @@ -150,7 +150,7 @@ use GuzzleHttp\Promise\Promise; $promise = new Promise(); $promise->then(null, function ($reason) { - throw new \Exception($reason); + throw new Exception($reason); })->then(null, function ($reason) { assert($reason->getMessage() === 'Error!'); }); @@ -182,7 +182,6 @@ invoked using the value returned from the `$onRejected` callback. ```php use GuzzleHttp\Promise\Promise; -use GuzzleHttp\Promise\RejectedPromise; $promise = new Promise(); $promise @@ -220,7 +219,7 @@ the promise is rejected with the exception and the exception is thrown. ```php $promise = new Promise(function () use (&$promise) { - throw new \Exception('foo'); + throw new Exception('foo'); }); $promise->wait(); // throws the exception. @@ -397,7 +396,7 @@ $deferred = new React\Promise\Deferred(); $reactPromise = $deferred->promise(); // Create a Guzzle promise that is fulfilled with a React promise. -$guzzlePromise = new \GuzzleHttp\Promise\Promise(); +$guzzlePromise = new GuzzleHttp\Promise\Promise(); $guzzlePromise->then(function ($value) use ($reactPromise) { // Do something something with the value... // Return the React promise @@ -424,7 +423,7 @@ instance. ```php // Get the global task queue -$queue = \GuzzleHttp\Promise\queue(); +$queue = GuzzleHttp\Promise\Utils::queue(); $queue->run(); ``` @@ -502,3 +501,32 @@ $promise->then(function ($value) { echo $value; }); $promise->resolve('foo'); // prints "foo" ``` + + +## Upgrading from Function API + +A static API was first introduced in 1.4.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API will be removed in 2.0.0. A migration table has been provided here for your convenience: + +| Original Function | Replacement Method | +|----------------|----------------| +| `queue` | `Utils::queue` | +| `task` | `Utils::task` | +| `promise_for` | `Create::promiseFor` | +| `rejection_for` | `Create::rejectionFor` | +| `exception_for` | `Create::exceptionFor` | +| `iter_for` | `Create::iterFor` | +| `inspect` | `Utils::inspect` | +| `inspect_all` | `Utils::inspectAll` | +| `unwrap` | `Utils::unwrap` | +| `all` | `Utils::all` | +| `some` | `Utils::some` | +| `any` | `Utils::any` | +| `settle` | `Utils::settle` | +| `each` | `Each::of` | +| `each_limit` | `Each::ofLimit` | +| `each_limit_all` | `Each::ofLimitAll` | +| `!is_fulfilled` | `Is::pending` | +| `is_fulfilled` | `Is::fulfilled` | +| `is_rejected` | `Is::rejected` | +| `is_settled` | `Is::settled` | +| `coroutine` | `Coroutine::of` | diff --git a/vendor/guzzlehttp/promises/composer.json b/vendor/guzzlehttp/promises/composer.json index ec41a61e..db44d9e3 100644 --- a/vendor/guzzlehttp/promises/composer.json +++ b/vendor/guzzlehttp/promises/composer.json @@ -11,10 +11,10 @@ } ], "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "autoload": { "psr-4": { @@ -22,9 +22,14 @@ }, "files": ["src/functions_include.php"] }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Promise\\Tests\\": "tests/" + } + }, "scripts": { - "test": "vendor/bin/phpunit", - "test-ci": "vendor/bin/phpunit --coverage-text" + "test": "vendor/bin/simple-phpunit", + "test-ci": "vendor/bin/simple-phpunit --coverage-text" }, "extra": { "branch-alias": { diff --git a/vendor/guzzlehttp/promises/phpstan-baseline.neon b/vendor/guzzlehttp/promises/phpstan-baseline.neon new file mode 100644 index 00000000..26012c2d --- /dev/null +++ b/vendor/guzzlehttp/promises/phpstan-baseline.neon @@ -0,0 +1,7 @@ +parameters: + ignoreErrors: + - + message: "#^Parameter \\#1 \\$function of function register_shutdown_function expects callable\\(\\)\\: void, Closure\\(\\)\\: mixed given\\.$#" + count: 1 + path: src/TaskQueue.php + diff --git a/vendor/guzzlehttp/promises/phpstan.neon.dist b/vendor/guzzlehttp/promises/phpstan.neon.dist new file mode 100644 index 00000000..b533a8c9 --- /dev/null +++ b/vendor/guzzlehttp/promises/phpstan.neon.dist @@ -0,0 +1,10 @@ +includes: + - phpstan-baseline.neon + +parameters: + level: 5 + paths: + - src + + ignoreErrors: + - "#^Dead catch - Exception is already caught by Throwable above\\.$#" diff --git a/vendor/guzzlehttp/promises/psalm.xml b/vendor/guzzlehttp/promises/psalm.xml new file mode 100644 index 00000000..3e4e3d08 --- /dev/null +++ b/vendor/guzzlehttp/promises/psalm.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/vendor/guzzlehttp/promises/src/AggregateException.php b/vendor/guzzlehttp/promises/src/AggregateException.php index 6a5690c3..d2b5712b 100644 --- a/vendor/guzzlehttp/promises/src/AggregateException.php +++ b/vendor/guzzlehttp/promises/src/AggregateException.php @@ -1,4 +1,5 @@ currentPromise->wait(); } }); - $this->nextCoroutine($this->generator->current()); + try { + $this->nextCoroutine($this->generator->current()); + } catch (\Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } + + /** + * Create a new coroutine. + * + * @return self + */ + public static function of(callable $generatorFn) + { + return new self($generatorFn); } public function then( @@ -108,7 +126,7 @@ public function cancel() private function nextCoroutine($yielded) { - $this->currentPromise = promise_for($yielded) + $this->currentPromise = Create::promiseFor($yielded) ->then([$this, '_handleSuccess'], [$this, '_handleFailure']); } @@ -139,7 +157,7 @@ public function _handleFailure($reason) { unset($this->currentPromise); try { - $nextYield = $this->generator->throw(exception_for($reason)); + $nextYield = $this->generator->throw(Create::exceptionFor($reason)); // The throw was caught, so keep iterating on the coroutine $this->nextCoroutine($nextYield); } catch (Exception $exception) { diff --git a/vendor/guzzlehttp/promises/src/Create.php b/vendor/guzzlehttp/promises/src/Create.php new file mode 100644 index 00000000..8d038e9c --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Create.php @@ -0,0 +1,84 @@ +then([$promise, 'resolve'], [$promise, 'reject']); + return $promise; + } + + return new FulfilledPromise($value); + } + + /** + * Creates a rejected promise for a reason if the reason is not a promise. + * If the provided reason is a promise, then it is returned as-is. + * + * @param mixed $reason Promise or reason. + * + * @return PromiseInterface + */ + public static function rejectionFor($reason) + { + if ($reason instanceof PromiseInterface) { + return $reason; + } + + return new RejectedPromise($reason); + } + + /** + * Create an exception for a rejected promise value. + * + * @param mixed $reason + * + * @return \Exception|\Throwable + */ + public static function exceptionFor($reason) + { + if ($reason instanceof \Exception || $reason instanceof \Throwable) { + return $reason; + } + + return new RejectionException($reason); + } + + /** + * Returns an iterator for the given value. + * + * @param mixed $value + * + * @return \Iterator + */ + public static function iterFor($value) + { + if ($value instanceof \Iterator) { + return $value; + } + + if (is_array($value)) { + return new \ArrayIterator($value); + } + + return new \ArrayIterator([$value]); + } +} diff --git a/vendor/guzzlehttp/promises/src/Each.php b/vendor/guzzlehttp/promises/src/Each.php new file mode 100644 index 00000000..1dda3549 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Each.php @@ -0,0 +1,90 @@ + $onFulfilled, + 'rejected' => $onRejected + ]))->promise(); + } + + /** + * Like of, but only allows a certain number of outstanding promises at any + * given time. + * + * $concurrency may be an integer or a function that accepts the number of + * pending promises and returns a numeric concurrency limit value to allow + * for dynamic a concurrency size. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ + public static function ofLimit( + $iterable, + $concurrency, + callable $onFulfilled = null, + callable $onRejected = null + ) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected, + 'concurrency' => $concurrency + ]))->promise(); + } + + /** + * Like limit, but ensures that no promise in the given $iterable argument + * is rejected. If any promise is rejected, then the aggregate promise is + * rejected with the encountered rejection. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * + * @return PromiseInterface + */ + public static function ofLimitAll( + $iterable, + $concurrency, + callable $onFulfilled = null + ) { + return each_limit( + $iterable, + $concurrency, + $onFulfilled, + function ($reason, $idx, PromiseInterface $aggregate) { + $aggregate->reject($reason); + } + ); + } +} diff --git a/vendor/guzzlehttp/promises/src/EachPromise.php b/vendor/guzzlehttp/promises/src/EachPromise.php index d0ddf603..fbb8876c 100644 --- a/vendor/guzzlehttp/promises/src/EachPromise.php +++ b/vendor/guzzlehttp/promises/src/EachPromise.php @@ -1,4 +1,5 @@ iterable = iter_for($iterable); + $this->iterable = Create::iterFor($iterable); if (isset($config['concurrency'])) { $this->concurrency = $config['concurrency']; @@ -65,6 +66,7 @@ public function __construct($iterable, array $config = []) } } + /** @psalm-suppress InvalidNullableReturnType */ public function promise() { if ($this->aggregate) { @@ -73,14 +75,29 @@ public function promise() try { $this->createPromise(); + /** @psalm-assert Promise $this->aggregate */ $this->iterable->rewind(); - $this->refillPending(); + if (!$this->checkIfFinished()) { + $this->refillPending(); + } } catch (\Throwable $e) { + /** + * @psalm-suppress NullReference + * @phpstan-ignore-next-line + */ $this->aggregate->reject($e); } catch (\Exception $e) { + /** + * @psalm-suppress NullReference + * @phpstan-ignore-next-line + */ $this->aggregate->reject($e); } + /** + * @psalm-suppress NullableReturnStatement + * @phpstan-ignore-next-line + */ return $this->aggregate; } @@ -89,17 +106,12 @@ private function createPromise() $this->mutex = false; $this->aggregate = new Promise(function () { reset($this->pending); - if (empty($this->pending) && !$this->iterable->valid()) { - $this->aggregate->resolve(null); - return; - } - // Consume a potentially fluctuating list of promises while // ensuring that indexes are maintained (precluding array_shift). while ($promise = current($this->pending)) { next($this->pending); $promise->wait(); - if ($this->aggregate->getState() !== PromiseInterface::PENDING) { + if (Is::settled($this->aggregate)) { return; } } @@ -148,22 +160,34 @@ private function addPending() return false; } - $promise = promise_for($this->iterable->current()); - $idx = $this->iterable->key(); + $promise = Create::promiseFor($this->iterable->current()); + $key = $this->iterable->key(); + + // Iterable keys may not be unique, so we add the promises at the end + // of the pending array and retrieve the array index being used + $this->pending[] = null; + end($this->pending); + $idx = key($this->pending); $this->pending[$idx] = $promise->then( - function ($value) use ($idx) { + function ($value) use ($idx, $key) { if ($this->onFulfilled) { call_user_func( - $this->onFulfilled, $value, $idx, $this->aggregate + $this->onFulfilled, + $value, + $key, + $this->aggregate ); } $this->step($idx); }, - function ($reason) use ($idx) { + function ($reason) use ($idx, $key) { if ($this->onRejected) { call_user_func( - $this->onRejected, $reason, $idx, $this->aggregate + $this->onRejected, + $reason, + $key, + $this->aggregate ); } $this->step($idx); @@ -201,7 +225,7 @@ private function advanceIterator() private function step($idx) { // If the promise was already resolved, then ignore this step. - if ($this->aggregate->getState() !== PromiseInterface::PENDING) { + if (Is::settled($this->aggregate)) { return; } diff --git a/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/vendor/guzzlehttp/promises/src/FulfilledPromise.php index dbbeeb9f..98f72a62 100644 --- a/vendor/guzzlehttp/promises/src/FulfilledPromise.php +++ b/vendor/guzzlehttp/promises/src/FulfilledPromise.php @@ -1,4 +1,5 @@ value = $value; @@ -30,11 +32,11 @@ public function then( return $this; } - $queue = queue(); + $queue = Utils::queue(); $p = new Promise([$queue, 'run']); $value = $this->value; $queue->add(static function () use ($p, $value, $onFulfilled) { - if ($p->getState() === self::PENDING) { + if (Is::pending($p)) { try { $p->resolve($onFulfilled($value)); } catch (\Throwable $e) { diff --git a/vendor/guzzlehttp/promises/src/Is.php b/vendor/guzzlehttp/promises/src/Is.php new file mode 100644 index 00000000..c3ed8d01 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Is.php @@ -0,0 +1,46 @@ +getState() === PromiseInterface::PENDING; + } + + /** + * Returns true if a promise is fulfilled or rejected. + * + * @return bool + */ + public static function settled(PromiseInterface $promise) + { + return $promise->getState() !== PromiseInterface::PENDING; + } + + /** + * Returns true if a promise is fulfilled. + * + * @return bool + */ + public static function fulfilled(PromiseInterface $promise) + { + return $promise->getState() === PromiseInterface::FULFILLED; + } + + /** + * Returns true if a promise is rejected. + * + * @return bool + */ + public static function rejected(PromiseInterface $promise) + { + return $promise->getState() === PromiseInterface::REJECTED; + } +} diff --git a/vendor/guzzlehttp/promises/src/Promise.php b/vendor/guzzlehttp/promises/src/Promise.php index 844ada07..75939057 100644 --- a/vendor/guzzlehttp/promises/src/Promise.php +++ b/vendor/guzzlehttp/promises/src/Promise.php @@ -1,4 +1,5 @@ state === self::FULFILLED) { - return $onFulfilled - ? promise_for($this->result)->then($onFulfilled) - : promise_for($this->result); + $promise = Create::promiseFor($this->result); + return $onFulfilled ? $promise->then($onFulfilled) : $promise; } // It's either cancelled or rejected, so return a rejected promise // and immediately invoke any callbacks. - $rejection = rejection_for($this->result); + $rejection = Create::rejectionFor($this->result); return $onRejected ? $rejection->then(null, $onRejected) : $rejection; } @@ -61,19 +61,15 @@ public function wait($unwrap = true) { $this->waitIfPending(); - $inner = $this->result instanceof PromiseInterface - ? $this->result->wait($unwrap) - : $this->result; - + if ($this->result instanceof PromiseInterface) { + return $this->result->wait($unwrap); + } if ($unwrap) { - if ($this->result instanceof PromiseInterface - || $this->state === self::FULFILLED - ) { - return $inner; - } else { - // It's rejected so "unwrap" and throw an exception. - throw exception_for($inner); + if ($this->state === self::FULFILLED) { + return $this->result; } + // It's rejected so "unwrap" and throw an exception. + throw Create::exceptionFor($this->result); } } @@ -103,6 +99,7 @@ public function cancel() } // Reject the promise only if it wasn't rejected in a then callback. + /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject(new CancellationException('Promise has been cancelled')); } @@ -148,17 +145,15 @@ private function settle($state, $value) // If the value was not a settled promise or a thenable, then resolve // it in the task queue using the correct ID. - if (!method_exists($value, 'then')) { + if (!is_object($value) || !method_exists($value, 'then')) { $id = $state === self::FULFILLED ? 1 : 2; // It's a success, so resolve the handlers in the queue. - queue()->add(static function () use ($id, $value, $handlers) { + Utils::queue()->add(static function () use ($id, $value, $handlers) { foreach ($handlers as $handler) { self::callHandler($id, $value, $handler); } }); - } elseif ($value instanceof Promise - && $value->getState() === self::PENDING - ) { + } elseif ($value instanceof Promise && Is::pending($value)) { // We can just merge our handlers onto the next promise. $value->handlers = array_merge($value->handlers, $handlers); } else { @@ -184,8 +179,6 @@ static function ($reason) use ($handlers) { * @param int $index 1 (resolve) or 2 (reject). * @param mixed $value Value to pass to the callback. * @param array $handler Array of handler data (promise and callbacks). - * - * @return array Returns the next group to resolve. */ private static function callHandler($index, $value, array $handler) { @@ -194,13 +187,21 @@ private static function callHandler($index, $value, array $handler) // The promise may have been cancelled or resolved before placing // this thunk in the queue. - if ($promise->getState() !== self::PENDING) { + if (Is::settled($promise)) { return; } try { if (isset($handler[$index])) { - $promise->resolve($handler[$index]($value)); + /* + * If $f throws an exception, then $handler will be in the exception + * stack trace. Since $handler contains a reference to the callable + * itself we get a circular reference. We clear the $handler + * here to avoid that memory leak. + */ + $f = $handler[$index]; + unset($handler); + $promise->resolve($f($value)); } elseif ($index === 1) { // Forward resolution values as-is. $promise->resolve($value); @@ -224,15 +225,16 @@ private function waitIfPending() } elseif ($this->waitList) { $this->invokeWaitList(); } else { - // If there's not wait function, then reject the promise. + // If there's no wait function, then reject the promise. $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.'); } - queue()->run(); + Utils::queue()->run(); + /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject('Invoking the wait callback did not resolve the promise'); } @@ -263,17 +265,13 @@ private function invokeWaitList() $this->waitList = null; foreach ($waitList as $result) { - while (true) { + do { $result->waitIfPending(); + $result = $result->result; + } while ($result instanceof Promise); - if ($result->result instanceof Promise) { - $result = $result->result; - } else { - if ($result->result instanceof PromiseInterface) { - $result->result->wait(false); - } - break; - } + if ($result instanceof PromiseInterface) { + $result->wait(false); } } } diff --git a/vendor/guzzlehttp/promises/src/PromiseInterface.php b/vendor/guzzlehttp/promises/src/PromiseInterface.php index 8f5f4b99..e5983314 100644 --- a/vendor/guzzlehttp/promises/src/PromiseInterface.php +++ b/vendor/guzzlehttp/promises/src/PromiseInterface.php @@ -1,4 +1,5 @@ reason = $reason; @@ -30,11 +32,11 @@ public function then( return $this; } - $queue = queue(); + $queue = Utils::queue(); $reason = $this->reason; $p = new Promise([$queue, 'run']); $queue->add(static function () use ($p, $reason, $onRejected) { - if ($p->getState() === self::PENDING) { + if (Is::pending($p)) { try { // Return a resolved promise if onRejected does not throw. $p->resolve($onRejected($reason)); @@ -59,8 +61,10 @@ public function otherwise(callable $onRejected) public function wait($unwrap = true, $defaultDelivery = null) { if ($unwrap) { - throw exception_for($this->reason); + throw Create::exceptionFor($this->reason); } + + return null; } public function getState() diff --git a/vendor/guzzlehttp/promises/src/RejectionException.php b/vendor/guzzlehttp/promises/src/RejectionException.php index 07c1136d..e2f13770 100644 --- a/vendor/guzzlehttp/promises/src/RejectionException.php +++ b/vendor/guzzlehttp/promises/src/RejectionException.php @@ -1,4 +1,5 @@ run(); + * GuzzleHttp\Promise\Utils::queue()->run(); */ class TaskQueue implements TaskQueueInterface { @@ -42,8 +43,8 @@ public function add(callable $task) public function run() { - /** @var callable $task */ while ($task = array_shift($this->queue)) { + /** @var callable $task */ $task(); } } diff --git a/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php index ac8306e1..723d4d54 100644 --- a/vendor/guzzlehttp/promises/src/TaskQueueInterface.php +++ b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php @@ -1,4 +1,5 @@ + * while ($eventLoop->isRunning()) { + * GuzzleHttp\Promise\Utils::queue()->run(); + * } + * + * + * @param TaskQueueInterface $assign Optionally specify a new queue instance. + * + * @return TaskQueueInterface + */ + public static function queue(TaskQueueInterface $assign = null) + { + static $queue; + + if ($assign) { + $queue = $assign; + } elseif (!$queue) { + $queue = new TaskQueue(); + } + + return $queue; + } + + /** + * Adds a function to run in the task queue when it is next `run()` and + * returns a promise that is fulfilled or rejected with the result. + * + * @param callable $task Task function to run. + * + * @return PromiseInterface + */ + public static function task(callable $task) + { + $queue = self::queue(); + $promise = new Promise([$queue, 'run']); + $queue->add(function () use ($task, $promise) { + try { + $promise->resolve($task()); + } catch (\Throwable $e) { + $promise->reject($e); + } catch (\Exception $e) { + $promise->reject($e); + } + }); + + return $promise; + } + + /** + * Synchronously waits on a promise to resolve and returns an inspection + * state array. + * + * Returns a state associative array containing a "state" key mapping to a + * valid promise state. If the state of the promise is "fulfilled", the + * array will contain a "value" key mapping to the fulfilled value of the + * promise. If the promise is rejected, the array will contain a "reason" + * key mapping to the rejection reason of the promise. + * + * @param PromiseInterface $promise Promise or value. + * + * @return array + */ + public static function inspect(PromiseInterface $promise) + { + try { + return [ + 'state' => PromiseInterface::FULFILLED, + 'value' => $promise->wait() + ]; + } catch (RejectionException $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; + } catch (\Throwable $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } catch (\Exception $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } + } + + /** + * Waits on all of the provided promises, but does not unwrap rejected + * promises as thrown exception. + * + * Returns an array of inspection state arrays. + * + * @see inspect for the inspection state array format. + * + * @param PromiseInterface[] $promises Traversable of promises to wait upon. + * + * @return array + */ + public static function inspectAll($promises) + { + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = inspect($promise); + } + + return $results; + } + + /** + * Waits on all of the provided promises and returns the fulfilled values. + * + * Returns an array that contains the value of each promise (in the same + * order the promises were provided). An exception is thrown if any of the + * promises are rejected. + * + * @param iterable $promises Iterable of PromiseInterface objects to wait on. + * + * @return array + * + * @throws \Exception on error + * @throws \Throwable on error in PHP >=7 + */ + public static function unwrap($promises) + { + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = $promise->wait(); + } + + return $results; + } + + /** + * Given an array of promises, return a promise that is fulfilled when all + * the items in the array are fulfilled. + * + * The promise's fulfillment value is an array with fulfillment values at + * respective positions to the original array. If any promise in the array + * rejects, the returned promise is rejected with the rejection reason. + * + * @param mixed $promises Promises or values. + * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. + * + * @return PromiseInterface + */ + public static function all($promises, $recursive = false) + { + $results = []; + $promise = Each::of( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = $value; + }, + function ($reason, $idx, Promise $aggregate) { + $aggregate->reject($reason); + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); + + if (true === $recursive) { + $promise = $promise->then(function ($results) use ($recursive, &$promises) { + foreach ($promises as $promise) { + if (Is::pending($promise)) { + return self::all($promises, $recursive); + } + } + return $results; + }); + } + + return $promise; + } + + /** + * Initiate a competitive race between multiple promises or values (values + * will become immediately fulfilled promises). + * + * When count amount of promises have been fulfilled, the returned promise + * is fulfilled with an array that contains the fulfillment values of the + * winners in order of resolution. + * + * This promise is rejected with a {@see AggregateException} if the number + * of fulfilled promises is less than the desired $count. + * + * @param int $count Total number of promises. + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ + public static function some($count, $promises) + { + $results = []; + $rejections = []; + + return Each::of( + $promises, + function ($value, $idx, PromiseInterface $p) use (&$results, $count) { + if (Is::settled($p)) { + return; + } + $results[$idx] = $value; + if (count($results) >= $count) { + $p->resolve(null); + } + }, + function ($reason) use (&$rejections) { + $rejections[] = $reason; + } + )->then( + function () use (&$results, &$rejections, $count) { + if (count($results) !== $count) { + throw new AggregateException( + 'Not enough promises to fulfill count', + $rejections + ); + } + ksort($results); + return array_values($results); + } + ); + } + + /** + * Like some(), with 1 as count. However, if the promise fulfills, the + * fulfillment value is not an array of 1 but the value directly. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ + public static function any($promises) + { + return self::some(1, $promises)->then(function ($values) { + return $values[0]; + }); + } + + /** + * Returns a promise that is fulfilled when all of the provided promises have + * been fulfilled or rejected. + * + * The returned promise is fulfilled with an array of inspection state arrays. + * + * @see inspect for the inspection state array format. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ + public static function settle($promises) + { + $results = []; + + return Each::of( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; + }, + function ($reason, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); + } +} diff --git a/vendor/guzzlehttp/promises/src/functions.php b/vendor/guzzlehttp/promises/src/functions.php index 4e27709a..c03d39d0 100644 --- a/vendor/guzzlehttp/promises/src/functions.php +++ b/vendor/guzzlehttp/promises/src/functions.php @@ -1,4 +1,5 @@ add(function () use ($task, $promise) { - try { - $promise->resolve($task()); - } catch (\Throwable $e) { - $promise->reject($e); - } catch (\Exception $e) { - $promise->reject($e); - } - }); - - return $promise; + return Utils::task($task); } /** @@ -62,23 +47,12 @@ function task(callable $task) * @param mixed $value Promise or value. * * @return PromiseInterface + * + * @deprecated promise_for will be removed in guzzlehttp/promises:2.0. Use Create::promiseFor instead. */ function promise_for($value) { - if ($value instanceof PromiseInterface) { - return $value; - } - - // Return a Guzzle promise that shadows the given promise. - if (method_exists($value, 'then')) { - $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null; - $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null; - $promise = new Promise($wfn, $cfn); - $value->then([$promise, 'resolve'], [$promise, 'reject']); - return $promise; - } - - return new FulfilledPromise($value); + return Create::promiseFor($value); } /** @@ -88,14 +62,12 @@ function promise_for($value) * @param mixed $reason Promise or reason. * * @return PromiseInterface + * + * @deprecated rejection_for will be removed in guzzlehttp/promises:2.0. Use Create::rejectionFor instead. */ function rejection_for($reason) { - if ($reason instanceof PromiseInterface) { - return $reason; - } - - return new RejectedPromise($reason); + return Create::rejectionFor($reason); } /** @@ -104,12 +76,12 @@ function rejection_for($reason) * @param mixed $reason * * @return \Exception|\Throwable + * + * @deprecated exception_for will be removed in guzzlehttp/promises:2.0. Use Create::exceptionFor instead. */ function exception_for($reason) { - return $reason instanceof \Exception || $reason instanceof \Throwable - ? $reason - : new RejectionException($reason); + return Create::exceptionFor($reason); } /** @@ -118,16 +90,12 @@ function exception_for($reason) * @param mixed $value * * @return \Iterator + * + * @deprecated iter_for will be removed in guzzlehttp/promises:2.0. Use Create::iterFor instead. */ function iter_for($value) { - if ($value instanceof \Iterator) { - return $value; - } elseif (is_array($value)) { - return new \ArrayIterator($value); - } else { - return new \ArrayIterator([$value]); - } + return Create::iterFor($value); } /** @@ -143,21 +111,12 @@ function iter_for($value) * @param PromiseInterface $promise Promise or value. * * @return array + * + * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspect instead. */ function inspect(PromiseInterface $promise) { - try { - return [ - 'state' => PromiseInterface::FULFILLED, - 'value' => $promise->wait() - ]; - } catch (RejectionException $e) { - return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; - } catch (\Throwable $e) { - return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; - } catch (\Exception $e) { - return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; - } + return Utils::inspect($promise); } /** @@ -166,19 +125,17 @@ function inspect(PromiseInterface $promise) * * Returns an array of inspection state arrays. * + * @see inspect for the inspection state array format. + * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array - * @see GuzzleHttp\Promise\inspect for the inspection state array format. + * + * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspectAll instead. */ function inspect_all($promises) { - $results = []; - foreach ($promises as $key => $promise) { - $results[$key] = inspect($promise); - } - - return $results; + return Utils::inspectAll($promises); } /** @@ -188,20 +145,18 @@ function inspect_all($promises) * the promises were provided). An exception is thrown if any of the promises * are rejected. * - * @param mixed $promises Iterable of PromiseInterface objects to wait on. + * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array + * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 + * + * @deprecated unwrap will be removed in guzzlehttp/promises:2.0. Use Utils::unwrap instead. */ function unwrap($promises) { - $results = []; - foreach ($promises as $key => $promise) { - $results[$key] = $promise->wait(); - } - - return $results; + return Utils::unwrap($promises); } /** @@ -212,25 +167,16 @@ function unwrap($promises) * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * - * @param mixed $promises Promises or values. + * @param mixed $promises Promises or values. + * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface + * + * @deprecated all will be removed in guzzlehttp/promises:2.0. Use Utils::all instead. */ -function all($promises) +function all($promises, $recursive = false) { - $results = []; - return each( - $promises, - function ($value, $idx) use (&$results) { - $results[$idx] = $value; - }, - function ($reason, $idx, Promise $aggregate) { - $aggregate->reject($reason); - } - )->then(function () use (&$results) { - ksort($results); - return $results; - }); + return Utils::all($promises, $recursive); } /** @@ -241,45 +187,19 @@ function ($reason, $idx, Promise $aggregate) { * fulfilled with an array that contains the fulfillment values of the winners * in order of resolution. * - * This prommise is rejected with a {@see GuzzleHttp\Promise\AggregateException} - * if the number of fulfilled promises is less than the desired $count. + * This promise is rejected with a {@see AggregateException} if the number of + * fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface + * + * @deprecated some will be removed in guzzlehttp/promises:2.0. Use Utils::some instead. */ function some($count, $promises) { - $results = []; - $rejections = []; - - return each( - $promises, - function ($value, $idx, PromiseInterface $p) use (&$results, $count) { - if ($p->getState() !== PromiseInterface::PENDING) { - return; - } - $results[$idx] = $value; - if (count($results) >= $count) { - $p->resolve(null); - } - }, - function ($reason) use (&$rejections) { - $rejections[] = $reason; - } - )->then( - function () use (&$results, &$rejections, $count) { - if (count($results) !== $count) { - throw new AggregateException( - 'Not enough promises to fulfill count', - $rejections - ); - } - ksort($results); - return array_values($results); - } - ); + return Utils::some($count, $promises); } /** @@ -289,10 +209,12 @@ function () use (&$results, &$rejections, $count) { * @param mixed $promises Promises or values. * * @return PromiseInterface + * + * @deprecated any will be removed in guzzlehttp/promises:2.0. Use Utils::any instead. */ function any($promises) { - return some(1, $promises)->then(function ($values) { return $values[0]; }); + return Utils::any($promises); } /** @@ -301,27 +223,17 @@ function any($promises) * * The returned promise is fulfilled with an array of inspection state arrays. * + * @see inspect for the inspection state array format. + * * @param mixed $promises Promises or values. * * @return PromiseInterface - * @see GuzzleHttp\Promise\inspect for the inspection state array format. + * + * @deprecated settle will be removed in guzzlehttp/promises:2.0. Use Utils::settle instead. */ function settle($promises) { - $results = []; - - return each( - $promises, - function ($value, $idx) use (&$results) { - $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; - }, - function ($reason, $idx) use (&$results) { - $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; - } - )->then(function () use (&$results) { - ksort($results); - return $results; - }); + return Utils::settle($promises); } /** @@ -329,29 +241,28 @@ function ($reason, $idx) use (&$results) { * fulfilled with a null value when the iterator has been consumed or the * aggregate promise has been fulfilled or rejected. * - * $onFulfilled is a function that accepts the fulfilled value, iterator - * index, and the aggregate promise. The callback can invoke any necessary side - * effects and choose to resolve or reject the aggregate promise if needed. + * $onFulfilled is a function that accepts the fulfilled value, iterator index, + * and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate if needed. * - * $onRejected is a function that accepts the rejection reason, iterator - * index, and the aggregate promise. The callback can invoke any necessary side - * effects and choose to resolve or reject the aggregate promise if needed. + * $onRejected is a function that accepts the rejection reason, iterator index, + * and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate if needed. * * @param mixed $iterable Iterator or array to iterate over. * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface + * + * @deprecated each will be removed in guzzlehttp/promises:2.0. Use Each::of instead. */ function each( $iterable, callable $onFulfilled = null, callable $onRejected = null ) { - return (new EachPromise($iterable, [ - 'fulfilled' => $onFulfilled, - 'rejected' => $onRejected - ]))->promise(); + return Each::of($iterable, $onFulfilled, $onRejected); } /** @@ -368,6 +279,8 @@ function each( * @param callable $onRejected * * @return PromiseInterface + * + * @deprecated each_limit will be removed in guzzlehttp/promises:2.0. Use Each::ofLimit instead. */ function each_limit( $iterable, @@ -375,11 +288,7 @@ function each_limit( callable $onFulfilled = null, callable $onRejected = null ) { - return (new EachPromise($iterable, [ - 'fulfilled' => $onFulfilled, - 'rejected' => $onRejected, - 'concurrency' => $concurrency - ]))->promise(); + return Each::ofLimit($iterable, $concurrency, $onFulfilled, $onRejected); } /** @@ -392,66 +301,63 @@ function each_limit( * @param callable $onFulfilled * * @return PromiseInterface + * + * @deprecated each_limit_all will be removed in guzzlehttp/promises:2.0. Use Each::ofLimitAll instead. */ function each_limit_all( $iterable, $concurrency, callable $onFulfilled = null ) { - return each_limit( - $iterable, - $concurrency, - $onFulfilled, - function ($reason, $idx, PromiseInterface $aggregate) { - $aggregate->reject($reason); - } - ); + return Each::ofLimitAll($iterable, $concurrency, $onFulfilled); } /** * Returns true if a promise is fulfilled. * - * @param PromiseInterface $promise - * * @return bool + * + * @deprecated is_fulfilled will be removed in guzzlehttp/promises:2.0. Use Is::fulfilled instead. */ function is_fulfilled(PromiseInterface $promise) { - return $promise->getState() === PromiseInterface::FULFILLED; + return Is::fulfilled($promise); } /** * Returns true if a promise is rejected. * - * @param PromiseInterface $promise - * * @return bool + * + * @deprecated is_rejected will be removed in guzzlehttp/promises:2.0. Use Is::rejected instead. */ function is_rejected(PromiseInterface $promise) { - return $promise->getState() === PromiseInterface::REJECTED; + return Is::rejected($promise); } /** * Returns true if a promise is fulfilled or rejected. * - * @param PromiseInterface $promise - * * @return bool + * + * @deprecated is_settled will be removed in guzzlehttp/promises:2.0. Use Is::settled instead. */ function is_settled(PromiseInterface $promise) { - return $promise->getState() !== PromiseInterface::PENDING; + return Is::settled($promise); } /** - * @see Coroutine + * Create a new coroutine. * - * @param callable $generatorFn + * @see Coroutine * * @return PromiseInterface + * + * @deprecated coroutine will be removed in guzzlehttp/promises:2.0. Use Coroutine::of instead. */ function coroutine(callable $generatorFn) { - return new Coroutine($generatorFn); + return Coroutine::of($generatorFn); } diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md index 5c252b3a..b441d366 100644 --- a/vendor/guzzlehttp/psr7/CHANGELOG.md +++ b/vendor/guzzlehttp/psr7/CHANGELOG.md @@ -1,32 +1,126 @@ -# CHANGELOG +# Change Log -## 1.4.2 - 2017-03-20 -* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + + +## [Unreleased] + +## [1.7.0] - 2020-09-30 + +### Added + +- Replaced functions by static methods + +### Fixed + +- Converting a non-seekable stream to a string +- Handle multiple Set-Cookie correctly +- Ignore array keys in header values when merging +- Allow multibyte characters to be parsed in `Message:bodySummary()` + +### Changed + +- Restored partial HHVM 3 support + + +## [1.6.1] - 2019-07-02 + +### Fixed + +- Accept null and bool header values again + + +## [1.6.0] - 2019-06-30 + +### Added + +- Allowed version `^3.0` of `ralouphie/getallheaders` dependency (#244) +- Added MIME type for WEBP image format (#246) +- Added more validation of values according to PSR-7 and RFC standards, e.g. status code range (#250, #272) + +### Changed + +- Tests don't pass with HHVM 4.0, so HHVM support got dropped. Other libraries like composer have done the same. (#262) +- Accept port number 0 to be valid (#270) + +### Fixed + +- Fixed subsequent reads from `php://input` in ServerRequest (#247) +- Fixed readable/writable detection for certain stream modes (#248) +- Fixed encoding of special characters in the `userInfo` component of an URI (#253) + + +## [1.5.2] - 2018-12-04 + +### Fixed + +- Check body size when getting the message summary + + +## [1.5.1] - 2018-12-04 + +### Fixed + +- Get the summary of a body only if it is readable + + +## [1.5.0] - 2018-12-03 + +### Added + +- Response first-line to response string exception (fixes #145) +- A test for #129 behavior +- `get_message_body_summary` function in order to get the message summary +- `3gp` and `mkv` mime types + +### Changed + +- Clarify exception message when stream is detached + +### Deprecated + +- Deprecated parsing folded header lines as per RFC 7230 + +### Fixed + +- Fix `AppendStream::detach` to not close streams +- `InflateStream` preserves `isSeekable` attribute of the underlying stream +- `ServerRequest::getUriFromGlobals` to support URLs in query parameters + + +Several other fixes and improvements. + + +## [1.4.2] - 2017-03-20 + +### Fixed + +- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing calls to `trigger_error` when deprecated methods are invoked. -## 1.4.1 - 2017-02-27 -* Reverted BC break by reintroducing behavior to automagically fix a URI with a +## [1.4.1] - 2017-02-27 + +### Added + +- Rriggering of silenced deprecation warnings. + +### Fixed + +- Reverted BC break by reintroducing behavior to automagically fix a URI with a relative path and an authority by adding a leading slash to the path. It's only deprecated now. -* Added triggering of silenced deprecation warnings. -## 1.4.0 - 2017-02-21 -* Fix `Stream::read` when length parameter <= 0. -* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. -* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port. -* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. -* Allow `parse_response` to parse a response without delimiting space and reason. -* Ensure each URI modification results in a valid URI according to PSR-7 discussions. - Invalid modifications will throw an exception instead of returning a wrong URI or - doing some magic. - - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception - because the path of a URI with an authority must start with a slash "/" or be empty - - `(new Uri())->withScheme('http')` will return `'http://localhost'` -* Fix compatibility of URIs with `file` scheme and empty host. -* Added common URI utility methods based on RFC 3986 (see documentation in the readme): +## [1.4.0] - 2017-02-21 + +### Added + +- Added common URI utility methods based on RFC 3986 (see documentation in the readme): - `Uri::isDefaultPort` - `Uri::isAbsolute` - `Uri::isNetworkPathReference` @@ -37,69 +131,117 @@ - `UriNormalizer::normalize` - `UriNormalizer::isEquivalent` - `UriResolver::relativize` -* Deprecated `Uri::resolve` in favor of `UriResolver::resolve` -* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` -## 1.3.1 - 2016-06-25 +### Changed + +- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. +- Allow `parse_response` to parse a response without delimiting space and reason. +- Ensure each URI modification results in a valid URI according to PSR-7 discussions. + Invalid modifications will throw an exception instead of returning a wrong URI or + doing some magic. + - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception + because the path of a URI with an authority must start with a slash "/" or be empty + - `(new Uri())->withScheme('http')` will return `'http://localhost'` + +### Deprecated + +- `Uri::resolve` in favor of `UriResolver::resolve` +- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +### Fixed + +- `Stream::read` when length parameter <= 0. +- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. +- `ServerRequest::getUriFromGlobals` when `Host` header contains port. +- Compatibility of URIs with `file` scheme and empty host. -* Fix `Uri::__toString` for network path references, e.g. `//example.org`. -* Fix missing lowercase normalization for host. -* Fix handling of URI components in case they are `'0'` in a lot of places, + +## [1.3.1] - 2016-06-25 + +### Fixed + +- `Uri::__toString` for network path references, e.g. `//example.org`. +- Missing lowercase normalization for host. +- Handling of URI components in case they are `'0'` in a lot of places, e.g. as a user info password. -* Fix `Uri::withAddedHeader` to correctly merge headers with different case. -* Fix trimming of header values in `Uri::withAddedHeader`. Header values may +- `Uri::withAddedHeader` to correctly merge headers with different case. +- Trimming of header values in `Uri::withAddedHeader`. Header values may be surrounded by whitespace which should be ignored according to RFC 7230 Section 3.2.4. This does not apply to header names. -* Fix `Uri::withAddedHeader` with an array of header values. -* Fix `Uri::resolve` when base path has no slash and handling of fragment. -* Fix handling of encoding in `Uri::with(out)QueryValue` so one can pass the +- `Uri::withAddedHeader` with an array of header values. +- `Uri::resolve` when base path has no slash and handling of fragment. +- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the key/value both in encoded as well as decoded form to those methods. This is consistent with withPath, withQuery etc. -* Fix `ServerRequest::withoutAttribute` when attribute value is null. +- `ServerRequest::withoutAttribute` when attribute value is null. -## 1.3.0 - 2016-04-13 -* Added remaining interfaces needed for full PSR7 compatibility +## [1.3.0] - 2016-04-13 + +### Added + +- Remaining interfaces needed for full PSR7 compatibility (ServerRequestInterface, UploadedFileInterface, etc.). -* Added support for stream_for from scalars. -* Can now extend Uri. -* Fixed a bug in validating request methods by making it more permissive. +- Support for stream_for from scalars. + +### Changed -## 1.2.3 - 2016-02-18 +- Can now extend Uri. -* Fixed support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote +### Fixed +- A bug in validating request methods by making it more permissive. + + +## [1.2.3] - 2016-02-18 + +### Fixed + +- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote streams, which can sometimes return fewer bytes than requested with `fread`. -* Fixed handling of gzipped responses with FNAME headers. +- Handling of gzipped responses with FNAME headers. + -## 1.2.2 - 2016-01-22 +## [1.2.2] - 2016-01-22 -* Added support for URIs without any authority. -* Added support for HTTP 451 'Unavailable For Legal Reasons.' -* Added support for using '0' as a filename. -* Added support for including non-standard ports in Host headers. +### Added -## 1.2.1 - 2015-11-02 +- Support for URIs without any authority. +- Support for HTTP 451 'Unavailable For Legal Reasons.' +- Support for using '0' as a filename. +- Support for including non-standard ports in Host headers. -* Now supporting negative offsets when seeking to SEEK_END. -## 1.2.0 - 2015-08-15 +## [1.2.1] - 2015-11-02 -* Body as `"0"` is now properly added to a response. -* Now allowing forward seeking in CachingStream. -* Now properly parsing HTTP requests that contain proxy targets in +### Changes + +- Now supporting negative offsets when seeking to SEEK_END. + + +## [1.2.0] - 2015-08-15 + +### Changed + +- Body as `"0"` is now properly added to a response. +- Now allowing forward seeking in CachingStream. +- Now properly parsing HTTP requests that contain proxy targets in `parse_request`. -* functions.php is now conditionally required. -* user-info is no longer dropped when resolving URIs. +- functions.php is now conditionally required. +- user-info is no longer dropped when resolving URIs. + -## 1.1.0 - 2015-06-24 +## [1.1.0] - 2015-06-24 -* URIs can now be relative. -* `multipart/form-data` headers are now overridden case-insensitively. -* URI paths no longer encode the following characters because they are allowed +### Changed + +- URIs can now be relative. +- `multipart/form-data` headers are now overridden case-insensitively. +- URI paths no longer encode the following characters because they are allowed in URIs: "(", ")", "*", "!", "'" -* A port is no longer added to a URI when the scheme is missing and no port is +- A port is no longer added to a URI when the scheme is missing and no port is present. + ## 1.0.0 - 2015-05-19 Initial release. @@ -108,3 +250,21 @@ Currently unsupported: - `Psr\Http\Message\ServerRequestInterface` - `Psr\Http\Message\UploadedFileInterface` + + + +[Unreleased]: https://github.com/guzzle/psr7/compare/1.6.0...HEAD +[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 +[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 +[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 +[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 +[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 +[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md index 16499358..acfabfdc 100644 --- a/vendor/guzzlehttp/psr7/README.md +++ b/vendor/guzzlehttp/psr7/README.md @@ -23,11 +23,11 @@ Reads from multiple streams, one after the other. ```php use GuzzleHttp\Psr7; -$a = Psr7\stream_for('abc, '); -$b = Psr7\stream_for('123.'); +$a = Psr7\Utils::streamFor('abc, '); +$b = Psr7\Utils::streamFor('123.'); $composed = new Psr7\AppendStream([$a, $b]); -$composed->addStream(Psr7\stream_for(' Above all listen to me')); +$composed->addStream(Psr7\Utils::streamFor(' Above all listen to me')); echo $composed; // abc, 123. Above all listen to me. ``` @@ -65,7 +65,7 @@ then on disk. ```php use GuzzleHttp\Psr7; -$original = Psr7\stream_for(fopen('http://www.google.com', 'r')); +$original = Psr7\Utils::streamFor(fopen('http://www.google.com', 'r')); $stream = new Psr7\CachingStream($original); $stream->read(1024); @@ -89,7 +89,7 @@ stream becomes too full. use GuzzleHttp\Psr7; // Create an empty stream -$stream = Psr7\stream_for(); +$stream = Psr7\Utils::streamFor(); // Start dropping data when the stream has more than 10 bytes $dropping = new Psr7\DroppingStream($stream, 10); @@ -112,7 +112,7 @@ to create a concrete class for a simple extension point. use GuzzleHttp\Psr7; -$stream = Psr7\stream_for('hi'); +$stream = Psr7\Utils::streamFor('hi'); $fnStream = Psr7\FnStream::decorate($stream, [ 'rewind' => function () use ($stream) { echo 'About to rewind - '; @@ -167,7 +167,7 @@ chunks (e.g. Amazon S3's multipart upload API). ```php use GuzzleHttp\Psr7; -$original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+')); +$original = Psr7\Utils::streamFor(fopen('/tmp/test.txt', 'r+')); echo $original->getSize(); // >>> 1048576 @@ -197,7 +197,7 @@ NoSeekStream wraps a stream and does not allow seeking. ```php use GuzzleHttp\Psr7; -$original = Psr7\stream_for('foo'); +$original = Psr7\Utils::streamFor('foo'); $noSeek = new Psr7\NoSeekStream($original); echo $noSeek->read(3); @@ -271,7 +271,7 @@ This decorator could be added to any existing stream and used like so: ```php use GuzzleHttp\Psr7; -$original = Psr7\stream_for('foo'); +$original = Psr7\Utils::streamFor('foo'); $eofStream = new EofCallbackStream($original, function () { echo 'EOF!'; @@ -297,228 +297,292 @@ stream from a PSR-7 stream. ```php use GuzzleHttp\Psr7\StreamWrapper; -$stream = GuzzleHttp\Psr7\stream_for('hello!'); +$stream = GuzzleHttp\Psr7\Utils::streamFor('hello!'); $resource = StreamWrapper::getResource($stream); echo fread($resource, 6); // outputs hello! ``` -# Function API +# Static API -There are various functions available under the `GuzzleHttp\Psr7` namespace. +There are various static methods available under the `GuzzleHttp\Psr7` namespace. -## `function str` +## `GuzzleHttp\Psr7\Message::toString` -`function str(MessageInterface $message)` +`public static function toString(MessageInterface $message): string` Returns the string representation of an HTTP message. ```php $request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); -echo GuzzleHttp\Psr7\str($request); +echo GuzzleHttp\Psr7\Message::toString($request); ``` -## `function uri_for` +## `GuzzleHttp\Psr7\Message::bodySummary` -`function uri_for($uri)` +`public static function bodySummary(MessageInterface $message, int $truncateAt = 120): string|null` -This function accepts a string or `Psr\Http\Message\UriInterface` and returns a -UriInterface for the given value. If the value is already a `UriInterface`, it -is returned as-is. +Get a short summary of the message body. -```php -$uri = GuzzleHttp\Psr7\uri_for('http://example.com'); -assert($uri === GuzzleHttp\Psr7\uri_for($uri)); -``` +Will return `null` if the response is not printable. -## `function stream_for` +## `GuzzleHttp\Psr7\Message::rewindBody` -`function stream_for($resource = '', array $options = [])` +`public static function rewindBody(MessageInterface $message): void` -Create a new stream based on the input type. +Attempts to rewind a message body and throws an exception on failure. -Options is an associative array that can contain the following keys: +The body of the message will only be rewound if a call to `tell()` +returns a value other than `0`. -* - metadata: Array of custom metadata. -* - size: Size of the stream. -This method accepts the following `$resource` types: +## `GuzzleHttp\Psr7\Message::parseMessage` -- `Psr\Http\Message\StreamInterface`: Returns the value as-is. -- `string`: Creates a stream object that uses the given string as the contents. -- `resource`: Creates a stream object that wraps the given PHP stream resource. -- `Iterator`: If the provided value implements `Iterator`, then a read-only - stream object will be created that wraps the given iterable. Each time the - stream is read from, data from the iterator will fill a buffer and will be - continuously called until the buffer is equal to the requested read size. - Subsequent read calls will first read from the buffer and then call `next` - on the underlying iterator until it is exhausted. -- `object` with `__toString()`: If the object has the `__toString()` method, - the object will be cast to a string and then a stream will be returned that - uses the string value. -- `NULL`: When `null` is passed, an empty stream object is returned. -- `callable` When a callable is passed, a read-only stream object will be - created that invokes the given callable. The callable is invoked with the - number of suggested bytes to read. The callable can return any number of - bytes, but MUST return `false` when there is no more data to return. The - stream object that wraps the callable will invoke the callable until the - number of requested bytes are available. Any additional bytes will be - buffered and used in subsequent reads. +`public static function parseMessage(string $message): array` -```php -$stream = GuzzleHttp\Psr7\stream_for('foo'); -$stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r')); +Parses an HTTP message into an associative array. -$generator function ($bytes) { - for ($i = 0; $i < $bytes; $i++) { - yield ' '; - } -} +The array contains the "start-line" key containing the start line of +the message, "headers" key containing an associative array of header +array values, and a "body" key containing the body of the message. -$stream = GuzzleHttp\Psr7\stream_for($generator(100)); -``` +## `GuzzleHttp\Psr7\Message::parseRequestUri` -## `function parse_header` +`public static function parseRequestUri(string $path, array $headers): string` -`function parse_header($header)` +Constructs a URI for an HTTP request message. -Parse an array of header values containing ";" separated data into an array of -associative arrays representing the header key value pair data of the header. -When a parameter does not contain a value, but just contains a key, this -function will inject a key with a '' string value. +## `GuzzleHttp\Psr7\Message::parseRequest` -## `function normalize_header` +`public static function parseRequest(string $message): Request` -`function normalize_header($header)` +Parses a request message string into a request object. -Converts an array of header values that may contain comma separated headers -into an array of headers with no comma separated values. +## `GuzzleHttp\Psr7\Message::parseResponse` -## `function modify_request` +`public static function parseResponse(string $message): Response` -`function modify_request(RequestInterface $request, array $changes)` +Parses a response message string into a response object. -Clone and modify a request with the given changes. This method is useful for -reducing the number of clones needed to mutate a message. -The changes can be one of: +## `GuzzleHttp\Psr7\Header::parse` -- method: (string) Changes the HTTP method. -- set_headers: (array) Sets the given headers. -- remove_headers: (array) Remove the given headers. -- body: (mixed) Sets the given body. -- uri: (UriInterface) Set the URI. -- query: (string) Set the query string value of the URI. -- version: (string) Set the protocol version. +`public static function parse(string|array $header): array` +Parse an array of header values containing ";" separated data into an +array of associative arrays representing the header key value pair data +of the header. When a parameter does not contain a value, but just +contains a key, this function will inject a key with a '' string value. -## `function rewind_body` -`function rewind_body(MessageInterface $message)` +## `GuzzleHttp\Psr7\Header::normalize` -Attempts to rewind a message body and throws an exception on failure. The body -of the message will only be rewound if a call to `tell()` returns a value other -than `0`. +`public static function normalize(string|array $header): array` +Converts an array of header values that may contain comma separated +headers into an array of headers with no comma separated values. -## `function try_fopen` -`function try_fopen($filename, $mode)` +## `GuzzleHttp\Psr7\Query::parse` -Safely opens a PHP stream resource using a filename. +`public static function parse(string $str, int|bool $urlEncoding = true): array` -When fopen fails, PHP normally raises a warning. This function adds an error -handler that checks for errors and throws an exception instead. +Parse a query string into an associative array. + +If multiple values are found for the same key, the value of that key +value pair will become an array. This function does not parse nested +PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` +will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`. + + +## `GuzzleHttp\Psr7\Query::build` + +`public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986): string` + +Build a query string from an array of key value pairs. +This function can use the return value of `parse()` to build a query +string. This function does not modify the provided keys when an array is +encountered (like `http_build_query()` would). -## `function copy_to_string` -`function copy_to_string(StreamInterface $stream, $maxLen = -1)` +## `GuzzleHttp\Psr7\Utils::caselessRemove` -Copy the contents of a stream into a string until the given number of bytes -have been read. +`public static function caselessRemove(iterable $keys, $keys, array $data): array` +Remove the items given by the keys, case insensitively from the data. -## `function copy_to_stream` -`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)` +## `GuzzleHttp\Psr7\Utils::copyToStream` -Copy the contents of a stream into another stream until the given number of +`public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void` + +Copy the contents of a stream into another stream until the given number +of bytes have been read. + + +## `GuzzleHttp\Psr7\Utils::copyToString` + +`public static function copyToString(StreamInterface $stream, int $maxLen = -1): string` + +Copy the contents of a stream into a string until the given number of bytes have been read. -## `function hash` +## `GuzzleHttp\Psr7\Utils::hash` + +`public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string` -`function hash(StreamInterface $stream, $algo, $rawOutput = false)` +Calculate a hash of a stream. -Calculate a hash of a Stream. This method reads the entire stream to calculate -a rolling hash (based on PHP's hash_init functions). +This method reads the entire stream to calculate a rolling hash, based on +PHP's `hash_init` functions. -## `function readline` +## `GuzzleHttp\Psr7\Utils::modifyRequest` -`function readline(StreamInterface $stream, $maxLength = null)` +`public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface` + +Clone and modify a request with the given changes. + +This method is useful for reducing the number of clones needed to mutate +a message. + +- method: (string) Changes the HTTP method. +- set_headers: (array) Sets the given headers. +- remove_headers: (array) Remove the given headers. +- body: (mixed) Sets the given body. +- uri: (UriInterface) Set the URI. +- query: (string) Set the query string value of the URI. +- version: (string) Set the protocol version. + + +## `GuzzleHttp\Psr7\Utils::readLine` + +`public static function readLine(StreamInterface $stream, int $maxLength = null): string` Read a line from the stream up to the maximum allowed buffer length. -## `function parse_request` +## `GuzzleHttp\Psr7\Utils::streamFor` -`function parse_request($message)` +`public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource = '', array $options = []): StreamInterface` -Parses a request message string into a request object. +Create a new stream based on the input type. +Options is an associative array that can contain the following keys: -## `function parse_response` +- metadata: Array of custom metadata. +- size: Size of the stream. -`function parse_response($message)` +This method accepts the following `$resource` types: -Parses a response message string into a response object. +- `Psr\Http\Message\StreamInterface`: Returns the value as-is. +- `string`: Creates a stream object that uses the given string as the contents. +- `resource`: Creates a stream object that wraps the given PHP stream resource. +- `Iterator`: If the provided value implements `Iterator`, then a read-only + stream object will be created that wraps the given iterable. Each time the + stream is read from, data from the iterator will fill a buffer and will be + continuously called until the buffer is equal to the requested read size. + Subsequent read calls will first read from the buffer and then call `next` + on the underlying iterator until it is exhausted. +- `object` with `__toString()`: If the object has the `__toString()` method, + the object will be cast to a string and then a stream will be returned that + uses the string value. +- `NULL`: When `null` is passed, an empty stream object is returned. +- `callable` When a callable is passed, a read-only stream object will be + created that invokes the given callable. The callable is invoked with the + number of suggested bytes to read. The callable can return any number of + bytes, but MUST return `false` when there is no more data to return. The + stream object that wraps the callable will invoke the callable until the + number of requested bytes are available. Any additional bytes will be + buffered and used in subsequent reads. +```php +$stream = GuzzleHttp\Psr7\Utils::streamFor('foo'); +$stream = GuzzleHttp\Psr7\Utils::streamFor(fopen('/path/to/file', 'r')); -## `function parse_query` +$generator = function ($bytes) { + for ($i = 0; $i < $bytes; $i++) { + yield ' '; + } +} -`function parse_query($str, $urlEncoding = true)` +$stream = GuzzleHttp\Psr7\Utils::streamFor($generator(100)); +``` -Parse a query string into an associative array. -If multiple values are found for the same key, the value of that key value pair -will become an array. This function does not parse nested PHP style arrays into -an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into -`['foo[a]' => '1', 'foo[b]' => '2']`). +## `GuzzleHttp\Psr7\Utils::tryFopen` +`public static function tryFopen(string $filename, string $mode): resource` -## `function build_query` +Safely opens a PHP stream resource using a filename. -`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)` +When fopen fails, PHP normally raises a warning. This function adds an +error handler that checks for errors and throws an exception instead. -Build a query string from an array of key value pairs. -This function can use the return value of parse_query() to build a query string. -This function does not modify the provided keys when an array is encountered -(like http_build_query would). +## `GuzzleHttp\Psr7\Utils::uriFor` + +`public static function uriFor(string|UriInterface $uri): UriInterface` +Returns a UriInterface for the given value. -## `function mimetype_from_filename` +This function accepts a string or UriInterface and returns a +UriInterface for the given value. If the value is already a +UriInterface, it is returned as-is. -`function mimetype_from_filename($filename)` + +## `GuzzleHttp\Psr7\MimeType::fromFilename` + +`public static function fromFilename(string $filename): string|null` Determines the mimetype of a file by looking at its extension. -## `function mimetype_from_extension` +## `GuzzleHttp\Psr7\MimeType::fromExtension` -`function mimetype_from_extension($extension)` +`public static function fromExtension(string $extension): string|null` Maps a file extensions to a mimetype. +## Upgrading from Function API + +The static API was first introduced in 1.7.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API will be removed in 2.0.0. A migration table has been provided here for your convenience: + +| Original Function | Replacement Method | +|----------------|----------------| +| `str` | `Message::toString` | +| `uri_for` | `Utils::uriFor` | +| `stream_for` | `Utils::streamFor` | +| `parse_header` | `Header::parse` | +| `normalize_header` | `Header::normalize` | +| `modify_request` | `Utils::modifyRequest` | +| `rewind_body` | `Message::rewindBody` | +| `try_fopen` | `Utils::tryFopen` | +| `copy_to_string` | `Utils::copyToString` | +| `copy_to_stream` | `Utils::copyToStream` | +| `hash` | `Utils::hash` | +| `readline` | `Utils::readLine` | +| `parse_request` | `Message::parseRequest` | +| `parse_response` | `Message::parseResponse` | +| `parse_query` | `Query::parse` | +| `build_query` | `Query::build` | +| `mimetype_from_filename` | `MimeType::fromFilename` | +| `mimetype_from_extension` | `MimeType::fromExtension` | +| `_parse_message` | `Message::parseMessage` | +| `_parse_request_uri` | `Message::parseRequestUri` | +| `get_message_body_summary` | `Message::bodySummary` | +| `_caseless_remove` | `Utils::caselessRemove` | + + # Additional URI Methods Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, @@ -606,6 +670,12 @@ Creates a new URI with a specific query string value. Any existing query string provided key are removed and replaced with the given key value pair. A value of null will set the query string key without a value, e.g. "key" instead of "key=value". +### `GuzzleHttp\Psr7\Uri::withQueryValues` + +`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` + +Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an +associative array of key => value. ### `GuzzleHttp\Psr7\Uri::withoutQueryValue` diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json index b1c5a90b..58dcb07e 100644 --- a/vendor/guzzlehttp/psr7/composer.json +++ b/vendor/guzzlehttp/psr7/composer.json @@ -2,7 +2,7 @@ "name": "guzzlehttp/psr7", "type": "library", "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": ["request", "response", "message", "stream", "http", "uri", "url"], + "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"], "license": "MIT", "authors": [ { @@ -17,23 +17,33 @@ ], "require": { "php": ">=5.4.0", - "psr/http-message": "~1.0" + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10", + "ext-zlib": "*" }, "provide": { "psr/http-message-implementation": "1.0" }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" }, "files": ["src/functions_include.php"] }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\Psr7\\": "tests/" + } + }, "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.7-dev" } } } diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php index 23039fd7..86e7a23b 100644 --- a/vendor/guzzlehttp/psr7/src/AppendStream.php +++ b/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -1,4 +1,5 @@ pos = $this->current = 0; + $this->seekable = true; foreach ($this->streams as $stream) { $stream->close(); @@ -82,14 +83,24 @@ public function close() } /** - * Detaches each attached stream + * Detaches each attached stream. + * + * Returns null as it's not clear which underlying stream resource to return. * * {@inheritdoc} */ public function detach() { - $this->close(); - $this->detached = true; + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->detach(); + } + + $this->streams = []; + + return null; } public function tell() diff --git a/vendor/guzzlehttp/psr7/src/BufferStream.php b/vendor/guzzlehttp/psr7/src/BufferStream.php index af4d4c22..627e4a5f 100644 --- a/vendor/guzzlehttp/psr7/src/BufferStream.php +++ b/vendor/guzzlehttp/psr7/src/BufferStream.php @@ -1,4 +1,5 @@ close(); + + return null; } public function getSize() diff --git a/vendor/guzzlehttp/psr7/src/CachingStream.php b/vendor/guzzlehttp/psr7/src/CachingStream.php index ed68f086..244d2a06 100644 --- a/vendor/guzzlehttp/psr7/src/CachingStream.php +++ b/vendor/guzzlehttp/psr7/src/CachingStream.php @@ -1,4 +1,5 @@ 'strlen']); - copy_to_stream($this, $target); + Utils::copyToStream($this, $target); return $this->tell(); } diff --git a/vendor/guzzlehttp/psr7/src/DroppingStream.php b/vendor/guzzlehttp/psr7/src/DroppingStream.php index 8935c80d..e125642d 100644 --- a/vendor/guzzlehttp/psr7/src/DroppingStream.php +++ b/vendor/guzzlehttp/psr7/src/DroppingStream.php @@ -1,4 +1,5 @@ ]+>|[^=]+/', $kvp, $matches)) { + $m = $matches[0]; + if (isset($m[1])) { + $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); + } else { + $part[] = trim($m[0], $trimmed); + } + } + } + if ($part) { + $params[] = $part; + } + } + + return $params; + } + + /** + * Converts an array of header values that may contain comma separated + * headers into an array of headers with no comma separated values. + * + * @param string|array $header Header to normalize. + * + * @return array Returns the normalized header field values. + */ + public static function normalize($header) + { + if (!is_array($header)) { + return array_map('trim', explode(',', $header)); + } + + $result = []; + foreach ($header as $value) { + foreach ((array) $value as $v) { + if (strpos($v, ',') === false) { + $result[] = $v; + continue; + } + foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { + $result[] = trim($vv); + } + } + } + + return $result; + } +} diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php index 0051d3fe..c98b96f2 100644 --- a/vendor/guzzlehttp/psr7/src/InflateStream.php +++ b/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -1,4 +1,5 @@ stream = new Stream($resource); + $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } /** diff --git a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php index 02cec3af..13c7af5c 100644 --- a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php +++ b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php @@ -1,4 +1,5 @@ filename, $this->mode)); + return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); } } diff --git a/vendor/guzzlehttp/psr7/src/LimitStream.php b/vendor/guzzlehttp/psr7/src/LimitStream.php index 3c13d4f4..bef9161e 100644 --- a/vendor/guzzlehttp/psr7/src/LimitStream.php +++ b/vendor/guzzlehttp/psr7/src/LimitStream.php @@ -1,4 +1,5 @@ getMethod() . ' ' + . $message->getRequestTarget()) + . ' HTTP/' . $message->getProtocolVersion(); + if (!$message->hasHeader('host')) { + $msg .= "\r\nHost: " . $message->getUri()->getHost(); + } + } elseif ($message instanceof ResponseInterface) { + $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' + . $message->getStatusCode() . ' ' + . $message->getReasonPhrase(); + } else { + throw new \InvalidArgumentException('Unknown message type'); + } + + foreach ($message->getHeaders() as $name => $values) { + if (strtolower($name) === 'set-cookie') { + foreach ($values as $value) { + $msg .= "\r\n{$name}: " . $value; + } + } else { + $msg .= "\r\n{$name}: " . implode(', ', $values); + } + } + + return "{$msg}\r\n\r\n" . $message->getBody(); + } + + /** + * Get a short summary of the message body. + * + * Will return `null` if the response is not printable. + * + * @param MessageInterface $message The message to get the body summary + * @param int $truncateAt The maximum allowed size of the summary + * + * @return string|null + */ + public static function bodySummary(MessageInterface $message, $truncateAt = 120) + { + $body = $message->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read($truncateAt); + $body->rewind(); + + if ($size > $truncateAt) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/u', $summary)) { + return null; + } + + return $summary; + } + + /** + * Attempts to rewind a message body and throws an exception on failure. + * + * The body of the message will only be rewound if a call to `tell()` + * returns a value other than `0`. + * + * @param MessageInterface $message Message to rewind + * + * @throws \RuntimeException + */ + public static function rewindBody(MessageInterface $message) + { + $body = $message->getBody(); + + if ($body->tell()) { + $body->rewind(); + } + } + + /** + * Parses an HTTP message into an associative array. + * + * The array contains the "start-line" key containing the start line of + * the message, "headers" key containing an associative array of header + * array values, and a "body" key containing the body of the message. + * + * @param string $message HTTP request or response to parse. + * + * @return array + */ + public static function parseMessage($message) + { + if (!$message) { + throw new \InvalidArgumentException('Invalid message'); + } + + $message = ltrim($message, "\r\n"); + + $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); + + if ($messageParts === false || count($messageParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); + } + + list($rawHeaders, $body) = $messageParts; + $rawHeaders .= "\r\n"; // Put back the delimiter we split previously + $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); + + if ($headerParts === false || count($headerParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing status line'); + } + + list($startLine, $rawHeaders) = $headerParts; + + if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { + // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 + $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); + } + + /** @var array[] $headerLines */ + $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); + + // If these aren't the same, then one line didn't match and there's an invalid header. + if ($count !== substr_count($rawHeaders, "\n")) { + // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 + if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { + throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); + } + + throw new \InvalidArgumentException('Invalid header syntax'); + } + + $headers = []; + + foreach ($headerLines as $headerLine) { + $headers[$headerLine[1]][] = $headerLine[2]; + } + + return [ + 'start-line' => $startLine, + 'headers' => $headers, + 'body' => $body, + ]; + } + + /** + * Constructs a URI for an HTTP request message. + * + * @param string $path Path from the start-line + * @param array $headers Array of headers (each value an array). + * + * @return string + */ + public static function parseRequestUri($path, array $headers) + { + $hostKey = array_filter(array_keys($headers), function ($k) { + return strtolower($k) === 'host'; + }); + + // If no host is found, then a full URI cannot be constructed. + if (!$hostKey) { + return $path; + } + + $host = $headers[reset($hostKey)][0]; + $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; + + return $scheme . '://' . $host . '/' . ltrim($path, '/'); + } + + /** + * Parses a request message string into a request object. + * + * @param string $message Request message string. + * + * @return Request + */ + public static function parseRequest($message) + { + $data = self::parseMessage($message); + $matches = []; + if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { + throw new \InvalidArgumentException('Invalid request string'); + } + $parts = explode(' ', $data['start-line'], 3); + $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; + + $request = new Request( + $parts[0], + $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], + $data['headers'], + $data['body'], + $version + ); + + return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); + } + + /** + * Parses a response message string into a response object. + * + * @param string $message Response message string. + * + * @return Response + */ + public static function parseResponse($message) + { + $data = self::parseMessage($message); + // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space + // between status-code and reason-phrase is required. But browsers accept + // responses without space and reason as well. + if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { + throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); + } + $parts = explode(' ', $data['start-line'], 3); + + return new Response( + (int) $parts[1], + $data['headers'], + $data['body'], + explode('/', $parts[0])[1], + isset($parts[2]) ? $parts[2] : null + ); + } +} diff --git a/vendor/guzzlehttp/psr7/src/MessageTrait.php b/vendor/guzzlehttp/psr7/src/MessageTrait.php index 1e4da649..99203bb4 100644 --- a/vendor/guzzlehttp/psr7/src/MessageTrait.php +++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -1,4 +1,5 @@ trimHeaderValues($value); + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); $new = clone $this; @@ -85,11 +83,8 @@ public function withHeader($header, $value) public function withAddedHeader($header, $value) { - if (!is_array($value)) { - $value = [$value]; - } - - $value = $this->trimHeaderValues($value); + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); $new = clone $this; @@ -123,7 +118,7 @@ public function withoutHeader($header) public function getBody() { if (!$this->stream) { - $this->stream = stream_for(''); + $this->stream = Utils::streamFor(''); } return $this->stream; @@ -144,11 +139,13 @@ private function setHeaders(array $headers) { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { - if (!is_array($value)) { - $value = [$value]; + if (is_int($header)) { + // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec + // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. + $header = (string) $header; } - - $value = $this->trimHeaderValues($value); + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; @@ -160,6 +157,19 @@ private function setHeaders(array $headers) } } + private function normalizeHeaderValue($value) + { + if (!is_array($value)) { + return $this->trimHeaderValues([$value]); + } + + if (count($value) === 0) { + throw new \InvalidArgumentException('Header value can not be an empty array.'); + } + + return $this->trimHeaderValues($value); + } + /** * Trims whitespace from the header values. * @@ -177,7 +187,28 @@ private function setHeaders(array $headers) private function trimHeaderValues(array $values) { return array_map(function ($value) { - return trim($value, " \t"); - }, $values); + if (!is_scalar($value) && null !== $value) { + throw new \InvalidArgumentException(sprintf( + 'Header value must be scalar or null but %s provided.', + is_object($value) ? get_class($value) : gettype($value) + )); + } + + return trim((string) $value, " \t"); + }, array_values($values)); + } + + private function assertHeader($header) + { + if (!is_string($header)) { + throw new \InvalidArgumentException(sprintf( + 'Header name must be a string but %s provided.', + is_object($header) ? get_class($header) : gettype($header) + )); + } + + if ($header === '') { + throw new \InvalidArgumentException('Header name can not be empty.'); + } } } diff --git a/vendor/guzzlehttp/psr7/src/MimeType.php b/vendor/guzzlehttp/psr7/src/MimeType.php new file mode 100644 index 00000000..205c7b1f --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MimeType.php @@ -0,0 +1,140 @@ + 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aac' => 'audio/x-aac', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'asc' => 'text/plain', + 'asf' => 'video/x-ms-asf', + 'atom' => 'application/atom+xml', + 'avi' => 'video/x-msvideo', + 'bmp' => 'image/bmp', + 'bz2' => 'application/x-bzip2', + 'cer' => 'application/pkix-cert', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'css' => 'text/css', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'deb' => 'application/x-debian-package', + 'doc' => 'application/msword', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dvi' => 'application/x-dvi', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'etx' => 'text/x-setext', + 'flac' => 'audio/flac', + 'flv' => 'video/x-flv', + 'gif' => 'image/gif', + 'gz' => 'application/gzip', + 'htm' => 'text/html', + 'html' => 'text/html', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ini' => 'text/plain', + 'iso' => 'application/x-iso9660-image', + 'jar' => 'application/java-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'js' => 'text/javascript', + 'json' => 'application/json', + 'latex' => 'application/x-latex', + 'log' => 'text/plain', + 'm4a' => 'audio/mp4', + 'm4v' => 'video/mp4', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mov' => 'video/quicktime', + 'mkv' => 'video/x-matroska', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4v' => 'video/mp4', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'pbm' => 'image/x-portable-bitmap', + 'pdf' => 'application/pdf', + 'pgm' => 'image/x-portable-graymap', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'ppm' => 'image/x-portable-pixmap', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'ps' => 'application/postscript', + 'qt' => 'video/quicktime', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'svg' => 'image/svg+xml', + 'swf' => 'application/x-shockwave-flash', + 'tar' => 'application/x-tar', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'torrent' => 'application/x-bittorrent', + 'ttf' => 'application/x-font-ttf', + 'txt' => 'text/plain', + 'wav' => 'audio/x-wav', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wma' => 'audio/x-ms-wma', + 'wmv' => 'video/x-ms-wmv', + 'woff' => 'application/x-font-woff', + 'wsdl' => 'application/wsdl+xml', + 'xbm' => 'image/x-xbitmap', + 'xls' => 'application/vnd.ms-excel', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xml' => 'application/xml', + 'xpm' => 'image/x-xpixmap', + 'xwd' => 'image/x-xwindowdump', + 'yaml' => 'text/yaml', + 'yml' => 'text/yaml', + 'zip' => 'application/zip', + ]; + + $extension = strtolower($extension); + + return isset($mimetypes[$extension]) + ? $mimetypes[$extension] + : null; + } +} diff --git a/vendor/guzzlehttp/psr7/src/MultipartStream.php b/vendor/guzzlehttp/psr7/src/MultipartStream.php index c0fd584f..0cbfea35 100644 --- a/vendor/guzzlehttp/psr7/src/MultipartStream.php +++ b/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -1,4 +1,5 @@ addStream(stream_for("--{$this->boundary}--\r\n")); + $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); return $stream; } @@ -84,7 +85,7 @@ private function addElement(AppendStream $stream, array $element) } } - $element['contents'] = stream_for($element['contents']); + $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); @@ -100,9 +101,9 @@ private function addElement(AppendStream $stream, array $element) isset($element['headers']) ? $element['headers'] : [] ); - $stream->addStream(stream_for($this->getHeaders($headers))); + $stream->addStream(Utils::streamFor($this->getHeaders($headers))); $stream->addStream($body); - $stream->addStream(stream_for("\r\n")); + $stream->addStream(Utils::streamFor("\r\n")); } /** @@ -131,7 +132,7 @@ private function createElement($name, StreamInterface $stream, $filename, array // Set a default Content-Type if one was not supplied $type = $this->getHeader($headers, 'content-type'); if (!$type && ($filename === '0' || $filename)) { - if ($type = mimetype_from_filename($filename)) { + if ($type = MimeType::fromFilename($filename)) { $headers['Content-Type'] = $type; } } diff --git a/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/vendor/guzzlehttp/psr7/src/NoSeekStream.php index 23322180..4b04b4c0 100644 --- a/vendor/guzzlehttp/psr7/src/NoSeekStream.php +++ b/vendor/guzzlehttp/psr7/src/NoSeekStream.php @@ -1,4 +1,5 @@ tellPos = false; $this->source = null; + + return null; } public function getSize() diff --git a/vendor/guzzlehttp/psr7/src/Query.php b/vendor/guzzlehttp/psr7/src/Query.php new file mode 100644 index 00000000..99e09305 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Query.php @@ -0,0 +1,108 @@ + '1', 'foo[b]' => '2'])`. + * + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded + * + * @return array + */ + public static function parse($str, $urlEncoding = true) + { + $result = []; + + if ($str === '') { + return $result; + } + + if ($urlEncoding === true) { + $decoder = function ($value) { + return rawurldecode(str_replace('+', ' ', $value)); + }; + } elseif ($urlEncoding === PHP_QUERY_RFC3986) { + $decoder = 'rawurldecode'; + } elseif ($urlEncoding === PHP_QUERY_RFC1738) { + $decoder = 'urldecode'; + } else { + $decoder = function ($str) { return $str; }; + } + + foreach (explode('&', $str) as $kvp) { + $parts = explode('=', $kvp, 2); + $key = $decoder($parts[0]); + $value = isset($parts[1]) ? $decoder($parts[1]) : null; + if (!isset($result[$key])) { + $result[$key] = $value; + } else { + if (!is_array($result[$key])) { + $result[$key] = [$result[$key]]; + } + $result[$key][] = $value; + } + } + + return $result; + } + + /** + * Build a query string from an array of key value pairs. + * + * This function can use the return value of `parse()` to build a query + * string. This function does not modify the provided keys when an array is + * encountered (like `http_build_query()` would). + * + * @param array $params Query string parameters. + * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 + * to encode using RFC3986, or PHP_QUERY_RFC1738 + * to encode using RFC1738. + * @return string + */ + public static function build(array $params, $encoding = PHP_QUERY_RFC3986) + { + if (!$params) { + return ''; + } + + if ($encoding === false) { + $encoder = function ($str) { return $str; }; + } elseif ($encoding === PHP_QUERY_RFC3986) { + $encoder = 'rawurlencode'; + } elseif ($encoding === PHP_QUERY_RFC1738) { + $encoder = 'urlencode'; + } else { + throw new \InvalidArgumentException('Invalid type'); + } + + $qs = ''; + foreach ($params as $k => $v) { + $k = $encoder($k); + if (!is_array($v)) { + $qs .= $k; + if ($v !== null) { + $qs .= '=' . $encoder($v); + } + $qs .= '&'; + } else { + foreach ($v as $vv) { + $qs .= $k; + if ($vv !== null) { + $qs .= '=' . $encoder($vv); + } + $qs .= '&'; + } + } + } + + return $qs ? (string) substr($qs, 0, -1) : ''; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php index 08285484..89fbb1e6 100644 --- a/vendor/guzzlehttp/psr7/src/Request.php +++ b/vendor/guzzlehttp/psr7/src/Request.php @@ -1,4 +1,5 @@ assertMethod($method); if (!($uri instanceof UriInterface)) { $uri = new Uri($uri); } @@ -45,12 +47,12 @@ public function __construct( $this->setHeaders($headers); $this->protocol = $version; - if (!$this->hasHeader('Host')) { + if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } if ($body !== '' && $body !== null) { - $this->stream = stream_for($body); + $this->stream = Utils::streamFor($body); } } @@ -91,6 +93,7 @@ public function getMethod() public function withMethod($method) { + $this->assertMethod($method); $new = clone $this; $new->method = strtoupper($method); return $new; @@ -110,7 +113,7 @@ public function withUri(UriInterface $uri, $preserveHost = false) $new = clone $this; $new->uri = $uri; - if (!$preserveHost) { + if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } @@ -139,4 +142,11 @@ private function updateHostFromUri() // See: http://tools.ietf.org/html/rfc7230#section-5.4 $this->headers = [$header => [$host]] + $this->headers; } + + private function assertMethod($method) + { + if (!is_string($method) || $method === '') { + throw new \InvalidArgumentException('Method must be a non-empty string.'); + } + } } diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php index 2830c6c9..36b85fb7 100644 --- a/vendor/guzzlehttp/psr7/src/Response.php +++ b/vendor/guzzlehttp/psr7/src/Response.php @@ -1,4 +1,5 @@ statusCode = (int) $status; + $this->assertStatusCodeIsInteger($status); + $status = (int) $status; + $this->assertStatusCodeRange($status); + + $this->statusCode = $status; if ($body !== '' && $body !== null) { - $this->stream = stream_for($body); + $this->stream = Utils::streamFor($body); } $this->setHeaders($headers); @@ -121,12 +126,30 @@ public function getReasonPhrase() public function withStatus($code, $reasonPhrase = '') { + $this->assertStatusCodeIsInteger($code); + $code = (int) $code; + $this->assertStatusCodeRange($code); + $new = clone $this; - $new->statusCode = (int) $code; + $new->statusCode = $code; if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { $reasonPhrase = self::$phrases[$new->statusCode]; } - $new->reasonPhrase = $reasonPhrase; + $new->reasonPhrase = (string) $reasonPhrase; return $new; } + + private function assertStatusCodeIsInteger($statusCode) + { + if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) { + throw new \InvalidArgumentException('Status code must be an integer value.'); + } + } + + private function assertStatusCodeRange($statusCode) + { + if ($statusCode < 100 || $statusCode >= 600) { + throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); + } + } } diff --git a/vendor/guzzlehttp/psr7/src/Rfc7230.php b/vendor/guzzlehttp/psr7/src/Rfc7230.php new file mode 100644 index 00000000..505e4742 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -0,0 +1,18 @@ +@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; + const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; +} diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php index 575aab84..72c5566c 100644 --- a/vendor/guzzlehttp/psr7/src/ServerRequest.php +++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -79,8 +79,10 @@ public function __construct( * Return an UploadedFile instance array. * * @param array $files A array which respect $_FILES structure - * @throws InvalidArgumentException for unrecognized values + * * @return array + * + * @throws InvalidArgumentException for unrecognized values */ public static function normalizeFiles(array $files) { @@ -166,9 +168,9 @@ private static function normalizeNestedFileSpec(array $files = []) public static function fromGlobals() { $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; - $headers = function_exists('getallheaders') ? getallheaders() : []; + $headers = getallheaders(); $uri = self::getUriFromGlobals(); - $body = new LazyOpenStream('php://input', 'r+'); + $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); @@ -180,23 +182,41 @@ public static function fromGlobals() ->withUploadedFiles(self::normalizeFiles($_FILES)); } + private static function extractHostAndPortFromAuthority($authority) + { + $uri = 'http://'.$authority; + $parts = parse_url($uri); + if (false === $parts) { + return [null, null]; + } + + $host = isset($parts['host']) ? $parts['host'] : null; + $port = isset($parts['port']) ? $parts['port'] : null; + + return [$host, $port]; + } + /** * Get a Uri populated with values from $_SERVER. * * @return UriInterface */ - public static function getUriFromGlobals() { + public static function getUriFromGlobals() + { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = false; if (isset($_SERVER['HTTP_HOST'])) { - $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']); - $uri = $uri->withHost($hostHeaderParts[0]); - if (isset($hostHeaderParts[1])) { + list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); + if ($host !== null) { + $uri = $uri->withHost($host); + } + + if ($port !== null) { $hasPort = true; - $uri = $uri->withPort($hostHeaderParts[1]); + $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); @@ -210,7 +230,7 @@ public static function getUriFromGlobals() { $hasQuery = false; if (isset($_SERVER['REQUEST_URI'])) { - $requestUriParts = explode('?', $_SERVER['REQUEST_URI']); + $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = true; diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php index e3366287..3865d6d6 100644 --- a/vendor/guzzlehttp/psr7/src/Stream.php +++ b/vendor/guzzlehttp/psr7/src/Stream.php @@ -1,4 +1,5 @@ [ - 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, - 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, - 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true, - 'x+t' => true, 'c+t' => true, 'a+' => true - ], - 'write' => [ - 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, - 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, - 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true, - 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true - ] - ]; - /** * This constructor accepts an associative array of options. * @@ -65,20 +61,11 @@ public function __construct($stream, $options = []) $this->stream = $stream; $meta = stream_get_meta_data($this->stream); $this->seekable = $meta['seekable']; - $this->readable = isset(self::$readWriteHash['read'][$meta['mode']]); - $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]); + $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']); + $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']); $this->uri = $this->getMetadata('uri'); } - public function __get($name) - { - if ($name == 'stream') { - throw new \RuntimeException('The stream is detached'); - } - - throw new \BadMethodCallException('No value for ' . $name); - } - /** * Closes the stream when the destructed */ @@ -90,8 +77,10 @@ public function __destruct() public function __toString() { try { - $this->seek(0); - return (string) stream_get_contents($this->stream); + if ($this->isSeekable()) { + $this->seek(0); + } + return $this->getContents(); } catch (\Exception $e) { return ''; } @@ -99,6 +88,10 @@ public function __toString() public function getContents() { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + $contents = stream_get_contents($this->stream); if ($contents === false) { @@ -173,11 +166,19 @@ public function isSeekable() public function eof() { - return !$this->stream || feof($this->stream); + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + return feof($this->stream); } public function tell() { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + $result = ftell($this->stream); if ($result === false) { @@ -194,9 +195,15 @@ public function rewind() public function seek($offset, $whence = SEEK_SET) { + $whence = (int) $whence; + + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); - } elseif (fseek($this->stream, $offset, $whence) === -1) { + } + if (fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . var_export($whence, true)); } @@ -204,6 +211,9 @@ public function seek($offset, $whence = SEEK_SET) public function read($length) { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } @@ -225,6 +235,9 @@ public function read($length) public function write($string) { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } diff --git a/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php index daec6f52..093023b1 100644 --- a/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php +++ b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @@ -1,4 +1,5 @@ ['stream' => $stream] - ])); + ]); } /** @@ -94,12 +108,21 @@ public function stream_seek($offset, $whence) return true; } + public function stream_cast($cast_as) + { + $stream = clone($this->stream); + + return $stream->detach(); + } + public function stream_stat() { static $modeMap = [ 'r' => 33060, + 'rb' => 33060, 'r+' => 33206, - 'w' => 33188 + 'w' => 33188, + 'wb' => 33188 ]; return [ @@ -118,4 +141,23 @@ public function stream_stat() 'blocks' => 0 ]; } + + public function url_stat($path, $flags) + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } } diff --git a/vendor/guzzlehttp/psr7/src/UploadedFile.php b/vendor/guzzlehttp/psr7/src/UploadedFile.php index e62bd5c8..a0ea59e0 100644 --- a/vendor/guzzlehttp/psr7/src/UploadedFile.php +++ b/vendor/guzzlehttp/psr7/src/UploadedFile.php @@ -1,4 +1,5 @@ file, $targetPath) : move_uploaded_file($this->file, $targetPath); } else { - copy_to_stream( + Utils::copyToStream( $this->getStream(), new LazyOpenStream($targetPath, 'w') ); diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php index f46c1db9..a0d73917 100644 --- a/vendor/guzzlehttp/psr7/src/Uri.php +++ b/vendor/guzzlehttp/psr7/src/Uri.php @@ -1,4 +1,5 @@ getQuery(); - if ($current === '') { - return $uri; - } - - $decodedKey = rawurldecode($key); - $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { - return rawurldecode(explode('=', $part)[0]) !== $decodedKey; - }); + $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(implode('&', $result)); } @@ -331,26 +324,29 @@ public static function withoutQueryValue(UriInterface $uri, $key) */ public static function withQueryValue(UriInterface $uri, $key, $value) { - $current = $uri->getQuery(); + $result = self::getFilteredQueryString($uri, [$key]); - if ($current === '') { - $result = []; - } else { - $decodedKey = rawurldecode($key); - $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { - return rawurldecode(explode('=', $part)[0]) !== $decodedKey; - }); - } + $result[] = self::generateQueryString($key, $value); - // Query string separators ("=", "&") within the key or value need to be encoded - // (while preventing double-encoding) before setting the query string. All other - // chars that need percent-encoding will be encoded by withQuery(). - $key = strtr($key, self::$replaceQuery); + return $uri->withQuery(implode('&', $result)); + } - if ($value !== null) { - $result[] = $key . '=' . strtr($value, self::$replaceQuery); - } else { - $result[] = $key; + /** + * Creates a new URI with multiple specific query string values. + * + * It has the same behavior as withQueryValue() but for an associative array of key => value. + * + * @param UriInterface $uri URI to use as a base. + * @param array $keyValueArray Associative array of key and values + * + * @return UriInterface + */ + public static function withQueryValues(UriInterface $uri, array $keyValueArray) + { + $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); + + foreach ($keyValueArray as $key => $value) { + $result[] = self::generateQueryString($key, $value); } return $uri->withQuery(implode('&', $result)); @@ -442,9 +438,9 @@ public function withScheme($scheme) public function withUserInfo($user, $password = null) { - $info = $user; - if ($password != '') { - $info .= ':' . $password; + $info = $this->filterUserInfoComponent($user); + if ($password !== null) { + $info .= ':' . $this->filterUserInfoComponent($password); } if ($this->userInfo === $info) { @@ -542,7 +538,9 @@ private function applyParts(array $parts) $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; - $this->userInfo = isset($parts['user']) ? $parts['user'] : ''; + $this->userInfo = isset($parts['user']) + ? $this->filterUserInfoComponent($parts['user']) + : ''; $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; @@ -559,7 +557,7 @@ private function applyParts(array $parts) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { - $this->userInfo .= ':' . $parts['pass']; + $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); } $this->removeDefaultPort(); @@ -581,6 +579,26 @@ private function filterScheme($scheme) return strtolower($scheme); } + /** + * @param string $component + * + * @return string + * + * @throws \InvalidArgumentException If the user info is invalid. + */ + private function filterUserInfoComponent($component) + { + if (!is_string($component)) { + throw new \InvalidArgumentException('User info must be a string'); + } + + return preg_replace_callback( + '/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $component + ); + } + /** * @param string $host * @@ -611,15 +629,56 @@ private function filterPort($port) } $port = (int) $port; - if (1 > $port || 0xffff < $port) { + if (0 > $port || 0xffff < $port) { throw new \InvalidArgumentException( - sprintf('Invalid port: %d. Must be between 1 and 65535', $port) + sprintf('Invalid port: %d. Must be between 0 and 65535', $port) ); } return $port; } + /** + * @param UriInterface $uri + * @param array $keys + * + * @return array + */ + private static function getFilteredQueryString(UriInterface $uri, array $keys) + { + $current = $uri->getQuery(); + + if ($current === '') { + return []; + } + + $decodedKeys = array_map('rawurldecode', $keys); + + return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { + return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); + }); + } + + /** + * @param string $key + * @param string|null $value + * + * @return string + */ + private static function generateQueryString($key, $value) + { + // Query string separators ("=", "&") within the key or value need to be encoded + // (while preventing double-encoding) before setting the query string. All other + // chars that need percent-encoding will be encoded by withQuery(). + $queryString = strtr($key, self::$replaceQuery); + + if ($value !== null) { + $queryString .= '=' . strtr($value, self::$replaceQuery); + } + + return $queryString; + } + private function removeDefaultPort() { if ($this->port !== null && self::isDefaultPort($this)) { diff --git a/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/vendor/guzzlehttp/psr7/src/UriNormalizer.php index 384c29e5..2b9174a5 100644 --- a/vendor/guzzlehttp/psr7/src/UriNormalizer.php +++ b/vendor/guzzlehttp/psr7/src/UriNormalizer.php @@ -1,4 +1,5 @@ $keys + * + * @return array + */ + public static function caselessRemove($keys, array $data) + { + $result = []; + + foreach ($keys as &$key) { + $key = strtolower($key); + } + + foreach ($data as $k => $v) { + if (!in_array(strtolower($k), $keys)) { + $result[$k] = $v; + } + } + + return $result; + } + + /** + * Copy the contents of a stream into another stream until the given number + * of bytes have been read. + * + * @param StreamInterface $source Stream to read from + * @param StreamInterface $dest Stream to write to + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * + * @throws \RuntimeException on error. + */ + public static function copyToStream(StreamInterface $source, StreamInterface $dest, $maxLen = -1) + { + $bufferSize = 8192; + + if ($maxLen === -1) { + while (!$source->eof()) { + if (!$dest->write($source->read($bufferSize))) { + break; + } + } + } else { + $remaining = $maxLen; + while ($remaining > 0 && !$source->eof()) { + $buf = $source->read(min($bufferSize, $remaining)); + $len = strlen($buf); + if (!$len) { + break; + } + $remaining -= $len; + $dest->write($buf); + } + } + } + + /** + * Copy the contents of a stream into a string until the given number of + * bytes have been read. + * + * @param StreamInterface $stream Stream to read + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * @return string + * + * @throws \RuntimeException on error. + */ + public static function copyToString(StreamInterface $stream, $maxLen = -1) + { + $buffer = ''; + + if ($maxLen === -1) { + while (!$stream->eof()) { + $buf = $stream->read(1048576); + // Using a loose equality here to match on '' and false. + if ($buf == null) { + break; + } + $buffer .= $buf; + } + return $buffer; + } + + $len = 0; + while (!$stream->eof() && $len < $maxLen) { + $buf = $stream->read($maxLen - $len); + // Using a loose equality here to match on '' and false. + if ($buf == null) { + break; + } + $buffer .= $buf; + $len = strlen($buffer); + } + + return $buffer; + } + + /** + * Calculate a hash of a stream. + * + * This method reads the entire stream to calculate a rolling hash, based + * on PHP's `hash_init` functions. + * + * @param StreamInterface $stream Stream to calculate the hash for + * @param string $algo Hash algorithm (e.g. md5, crc32, etc) + * @param bool $rawOutput Whether or not to use raw output + * + * @return string Returns the hash of the stream + * + * @throws \RuntimeException on error. + */ + public static function hash(StreamInterface $stream, $algo, $rawOutput = false) + { + $pos = $stream->tell(); + + if ($pos > 0) { + $stream->rewind(); + } + + $ctx = hash_init($algo); + while (!$stream->eof()) { + hash_update($ctx, $stream->read(1048576)); + } + + $out = hash_final($ctx, (bool) $rawOutput); + $stream->seek($pos); + + return $out; + } + + /** + * Clone and modify a request with the given changes. + * + * This method is useful for reducing the number of clones needed to mutate + * a message. + * + * The changes can be one of: + * - method: (string) Changes the HTTP method. + * - set_headers: (array) Sets the given headers. + * - remove_headers: (array) Remove the given headers. + * - body: (mixed) Sets the given body. + * - uri: (UriInterface) Set the URI. + * - query: (string) Set the query string value of the URI. + * - version: (string) Set the protocol version. + * + * @param RequestInterface $request Request to clone and modify. + * @param array $changes Changes to apply. + * + * @return RequestInterface + */ + public static function modifyRequest(RequestInterface $request, array $changes) + { + if (!$changes) { + return $request; + } + + $headers = $request->getHeaders(); + + if (!isset($changes['uri'])) { + $uri = $request->getUri(); + } else { + // Remove the host header if one is on the URI + if ($host = $changes['uri']->getHost()) { + $changes['set_headers']['Host'] = $host; + + if ($port = $changes['uri']->getPort()) { + $standardPorts = ['http' => 80, 'https' => 443]; + $scheme = $changes['uri']->getScheme(); + if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { + $changes['set_headers']['Host'] .= ':'.$port; + } + } + } + $uri = $changes['uri']; + } + + if (!empty($changes['remove_headers'])) { + $headers = self::caselessRemove($changes['remove_headers'], $headers); + } + + if (!empty($changes['set_headers'])) { + $headers = self::caselessRemove(array_keys($changes['set_headers']), $headers); + $headers = $changes['set_headers'] + $headers; + } + + if (isset($changes['query'])) { + $uri = $uri->withQuery($changes['query']); + } + + if ($request instanceof ServerRequestInterface) { + return (new ServerRequest( + isset($changes['method']) ? $changes['method'] : $request->getMethod(), + $uri, + $headers, + isset($changes['body']) ? $changes['body'] : $request->getBody(), + isset($changes['version']) + ? $changes['version'] + : $request->getProtocolVersion(), + $request->getServerParams() + )) + ->withParsedBody($request->getParsedBody()) + ->withQueryParams($request->getQueryParams()) + ->withCookieParams($request->getCookieParams()) + ->withUploadedFiles($request->getUploadedFiles()); + } + + return new Request( + isset($changes['method']) ? $changes['method'] : $request->getMethod(), + $uri, + $headers, + isset($changes['body']) ? $changes['body'] : $request->getBody(), + isset($changes['version']) + ? $changes['version'] + : $request->getProtocolVersion() + ); + } + + /** + * Read a line from the stream up to the maximum allowed buffer length. + * + * @param StreamInterface $stream Stream to read from + * @param int|null $maxLength Maximum buffer length + * + * @return string + */ + public static function readLine(StreamInterface $stream, $maxLength = null) + { + $buffer = ''; + $size = 0; + + while (!$stream->eof()) { + // Using a loose equality here to match on '' and false. + if (null == ($byte = $stream->read(1))) { + return $buffer; + } + $buffer .= $byte; + // Break when a new line is found or the max length - 1 is reached + if ($byte === "\n" || ++$size === $maxLength - 1) { + break; + } + } + + return $buffer; + } + + /** + * Create a new stream based on the input type. + * + * Options is an associative array that can contain the following keys: + * - metadata: Array of custom metadata. + * - size: Size of the stream. + * + * This method accepts the following `$resource` types: + * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. + * - `string`: Creates a stream object that uses the given string as the contents. + * - `resource`: Creates a stream object that wraps the given PHP stream resource. + * - `Iterator`: If the provided value implements `Iterator`, then a read-only + * stream object will be created that wraps the given iterable. Each time the + * stream is read from, data from the iterator will fill a buffer and will be + * continuously called until the buffer is equal to the requested read size. + * Subsequent read calls will first read from the buffer and then call `next` + * on the underlying iterator until it is exhausted. + * - `object` with `__toString()`: If the object has the `__toString()` method, + * the object will be cast to a string and then a stream will be returned that + * uses the string value. + * - `NULL`: When `null` is passed, an empty stream object is returned. + * - `callable` When a callable is passed, a read-only stream object will be + * created that invokes the given callable. The callable is invoked with the + * number of suggested bytes to read. The callable can return any number of + * bytes, but MUST return `false` when there is no more data to return. The + * stream object that wraps the callable will invoke the callable until the + * number of requested bytes are available. Any additional bytes will be + * buffered and used in subsequent reads. + * + * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data + * @param array $options Additional options + * + * @return StreamInterface + * + * @throws \InvalidArgumentException if the $resource arg is not valid. + */ + public static function streamFor($resource = '', array $options = []) + { + if (is_scalar($resource)) { + $stream = fopen('php://temp', 'r+'); + if ($resource !== '') { + fwrite($stream, $resource); + fseek($stream, 0); + } + return new Stream($stream, $options); + } + + switch (gettype($resource)) { + case 'resource': + return new Stream($resource, $options); + case 'object': + if ($resource instanceof StreamInterface) { + return $resource; + } elseif ($resource instanceof \Iterator) { + return new PumpStream(function () use ($resource) { + if (!$resource->valid()) { + return false; + } + $result = $resource->current(); + $resource->next(); + return $result; + }, $options); + } elseif (method_exists($resource, '__toString')) { + return Utils::streamFor((string) $resource, $options); + } + break; + case 'NULL': + return new Stream(fopen('php://temp', 'r+'), $options); + } + + if (is_callable($resource)) { + return new PumpStream($resource, $options); + } + + throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); + } + + /** + * Safely opens a PHP stream resource using a filename. + * + * When fopen fails, PHP normally raises a warning. This function adds an + * error handler that checks for errors and throws an exception instead. + * + * @param string $filename File to open + * @param string $mode Mode used to open the file + * + * @return resource + * + * @throws \RuntimeException if the file cannot be opened + */ + public static function tryFopen($filename, $mode) + { + $ex = null; + set_error_handler(function () use ($filename, $mode, &$ex) { + $ex = new \RuntimeException(sprintf( + 'Unable to open %s using mode %s: %s', + $filename, + $mode, + func_get_args()[1] + )); + }); + + $handle = fopen($filename, $mode); + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $handle; + } + + /** + * Returns a UriInterface for the given value. + * + * This function accepts a string or UriInterface and returns a + * UriInterface for the given value. If the value is already a + * UriInterface, it is returned as-is. + * + * @param string|UriInterface $uri + * + * @return UriInterface + * + * @throws \InvalidArgumentException + */ + public static function uriFor($uri) + { + if ($uri instanceof UriInterface) { + return $uri; + } + + if (is_string($uri)) { + return new Uri($uri); + } + + throw new \InvalidArgumentException('URI must be a string or UriInterface'); + } +} diff --git a/vendor/guzzlehttp/psr7/src/functions.php b/vendor/guzzlehttp/psr7/src/functions.php index e40348d6..e4cc1361 100644 --- a/vendor/guzzlehttp/psr7/src/functions.php +++ b/vendor/guzzlehttp/psr7/src/functions.php @@ -1,10 +1,9 @@ getMethod() . ' ' - . $message->getRequestTarget()) - . ' HTTP/' . $message->getProtocolVersion(); - if (!$message->hasHeader('host')) { - $msg .= "\r\nHost: " . $message->getUri()->getHost(); - } - } elseif ($message instanceof ResponseInterface) { - $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' - . $message->getStatusCode() . ' ' - . $message->getReasonPhrase(); - } else { - throw new \InvalidArgumentException('Unknown message type'); - } - - foreach ($message->getHeaders() as $name => $values) { - $msg .= "\r\n{$name}: " . implode(', ', $values); - } - - return "{$msg}\r\n\r\n" . $message->getBody(); + return Message::toString($message); } /** * Returns a UriInterface for the given value. * - * This function accepts a string or {@see Psr\Http\Message\UriInterface} and - * returns a UriInterface for the given value. If the value is already a - * `UriInterface`, it is returned as-is. + * This function accepts a string or UriInterface and returns a + * UriInterface for the given value. If the value is already a + * UriInterface, it is returned as-is. * * @param string|UriInterface $uri * * @return UriInterface + * * @throws \InvalidArgumentException + * + * @deprecated uri_for will be removed in guzzlehttp/psr7:2.0. Use Utils::uriFor instead. */ function uri_for($uri) { - if ($uri instanceof UriInterface) { - return $uri; - } elseif (is_string($uri)) { - return new Uri($uri); - } - - throw new \InvalidArgumentException('URI must be a string or UriInterface'); + return Utils::uriFor($uri); } /** @@ -69,86 +48,57 @@ function uri_for($uri) * - metadata: Array of custom metadata. * - size: Size of the stream. * - * @param resource|string|null|int|float|bool|StreamInterface|callable $resource Entity body data - * @param array $options Additional options + * This method accepts the following `$resource` types: + * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. + * - `string`: Creates a stream object that uses the given string as the contents. + * - `resource`: Creates a stream object that wraps the given PHP stream resource. + * - `Iterator`: If the provided value implements `Iterator`, then a read-only + * stream object will be created that wraps the given iterable. Each time the + * stream is read from, data from the iterator will fill a buffer and will be + * continuously called until the buffer is equal to the requested read size. + * Subsequent read calls will first read from the buffer and then call `next` + * on the underlying iterator until it is exhausted. + * - `object` with `__toString()`: If the object has the `__toString()` method, + * the object will be cast to a string and then a stream will be returned that + * uses the string value. + * - `NULL`: When `null` is passed, an empty stream object is returned. + * - `callable` When a callable is passed, a read-only stream object will be + * created that invokes the given callable. The callable is invoked with the + * number of suggested bytes to read. The callable can return any number of + * bytes, but MUST return `false` when there is no more data to return. The + * stream object that wraps the callable will invoke the callable until the + * number of requested bytes are available. Any additional bytes will be + * buffered and used in subsequent reads. + * + * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data + * @param array $options Additional options + * + * @return StreamInterface * - * @return Stream * @throws \InvalidArgumentException if the $resource arg is not valid. + * + * @deprecated stream_for will be removed in guzzlehttp/psr7:2.0. Use Utils::streamFor instead. */ function stream_for($resource = '', array $options = []) { - if (is_scalar($resource)) { - $stream = fopen('php://temp', 'r+'); - if ($resource !== '') { - fwrite($stream, $resource); - fseek($stream, 0); - } - return new Stream($stream, $options); - } - - switch (gettype($resource)) { - case 'resource': - return new Stream($resource, $options); - case 'object': - if ($resource instanceof StreamInterface) { - return $resource; - } elseif ($resource instanceof \Iterator) { - return new PumpStream(function () use ($resource) { - if (!$resource->valid()) { - return false; - } - $result = $resource->current(); - $resource->next(); - return $result; - }, $options); - } elseif (method_exists($resource, '__toString')) { - return stream_for((string) $resource, $options); - } - break; - case 'NULL': - return new Stream(fopen('php://temp', 'r+'), $options); - } - - if (is_callable($resource)) { - return new PumpStream($resource, $options); - } - - throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); + return Utils::streamFor($resource, $options); } /** * Parse an array of header values containing ";" separated data into an - * array of associative arrays representing the header key value pair - * data of the header. When a parameter does not contain a value, but just + * array of associative arrays representing the header key value pair data + * of the header. When a parameter does not contain a value, but just * contains a key, this function will inject a key with a '' string value. * * @param string|array $header Header to parse into components. * * @return array Returns the parsed header values. + * + * @deprecated parse_header will be removed in guzzlehttp/psr7:2.0. Use Header::parse instead. */ function parse_header($header) { - static $trimmed = "\"' \n\t\r"; - $params = $matches = []; - - foreach (normalize_header($header) as $val) { - $part = []; - foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { - if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { - $m = $matches[0]; - if (isset($m[1])) { - $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); - } else { - $part[] = trim($m[0], $trimmed); - } - } - } - if ($part) { - $params[] = $part; - } - } - - return $params; + return Header::parse($header); } /** @@ -158,32 +108,20 @@ function parse_header($header) * @param string|array $header Header to normalize. * * @return array Returns the normalized header field values. + * + * @deprecated normalize_header will be removed in guzzlehttp/psr7:2.0. Use Header::normalize instead. */ function normalize_header($header) { - if (!is_array($header)) { - return array_map('trim', explode(',', $header)); - } - - $result = []; - foreach ($header as $value) { - foreach ((array) $value as $v) { - if (strpos($v, ',') === false) { - $result[] = $v; - continue; - } - foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { - $result[] = trim($vv); - } - } - } - - return $result; + return Header::normalize($header); } /** * Clone and modify a request with the given changes. * + * This method is useful for reducing the number of clones needed to mutate a + * message. + * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. @@ -197,68 +135,12 @@ function normalize_header($header) * @param array $changes Changes to apply. * * @return RequestInterface + * + * @deprecated modify_request will be removed in guzzlehttp/psr7:2.0. Use Utils::modifyRequest instead. */ function modify_request(RequestInterface $request, array $changes) { - if (!$changes) { - return $request; - } - - $headers = $request->getHeaders(); - - if (!isset($changes['uri'])) { - $uri = $request->getUri(); - } else { - // Remove the host header if one is on the URI - if ($host = $changes['uri']->getHost()) { - $changes['set_headers']['Host'] = $host; - - if ($port = $changes['uri']->getPort()) { - $standardPorts = ['http' => 80, 'https' => 443]; - $scheme = $changes['uri']->getScheme(); - if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { - $changes['set_headers']['Host'] .= ':'.$port; - } - } - } - $uri = $changes['uri']; - } - - if (!empty($changes['remove_headers'])) { - $headers = _caseless_remove($changes['remove_headers'], $headers); - } - - if (!empty($changes['set_headers'])) { - $headers = _caseless_remove(array_keys($changes['set_headers']), $headers); - $headers = $changes['set_headers'] + $headers; - } - - if (isset($changes['query'])) { - $uri = $uri->withQuery($changes['query']); - } - - if ($request instanceof ServerRequestInterface) { - return new ServerRequest( - isset($changes['method']) ? $changes['method'] : $request->getMethod(), - $uri, - $headers, - isset($changes['body']) ? $changes['body'] : $request->getBody(), - isset($changes['version']) - ? $changes['version'] - : $request->getProtocolVersion(), - $request->getServerParams() - ); - } - - return new Request( - isset($changes['method']) ? $changes['method'] : $request->getMethod(), - $uri, - $headers, - isset($changes['body']) ? $changes['body'] : $request->getBody(), - isset($changes['version']) - ? $changes['version'] - : $request->getProtocolVersion() - ); + return Utils::modifyRequest($request, $changes); } /** @@ -270,14 +152,12 @@ function modify_request(RequestInterface $request, array $changes) * @param MessageInterface $message Message to rewind * * @throws \RuntimeException + * + * @deprecated rewind_body will be removed in guzzlehttp/psr7:2.0. Use Message::rewindBody instead. */ function rewind_body(MessageInterface $message) { - $body = $message->getBody(); - - if ($body->tell()) { - $body->rewind(); - } + Message::rewindBody($message); } /** @@ -290,29 +170,14 @@ function rewind_body(MessageInterface $message) * @param string $mode Mode used to open the file * * @return resource + * * @throws \RuntimeException if the file cannot be opened + * + * @deprecated try_fopen will be removed in guzzlehttp/psr7:2.0. Use Utils::tryFopen instead. */ function try_fopen($filename, $mode) { - $ex = null; - set_error_handler(function () use ($filename, $mode, &$ex) { - $ex = new \RuntimeException(sprintf( - 'Unable to open %s using mode %s: %s', - $filename, - $mode, - func_get_args()[1] - )); - }); - - $handle = fopen($filename, $mode); - restore_error_handler(); - - if ($ex) { - /** @var $ex \RuntimeException */ - throw $ex; - } - - return $handle; + return Utils::tryFopen($filename, $mode); } /** @@ -323,36 +188,14 @@ function try_fopen($filename, $mode) * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * @return string + * * @throws \RuntimeException on error. + * + * @deprecated copy_to_string will be removed in guzzlehttp/psr7:2.0. Use Utils::copyToString instead. */ function copy_to_string(StreamInterface $stream, $maxLen = -1) { - $buffer = ''; - - if ($maxLen === -1) { - while (!$stream->eof()) { - $buf = $stream->read(1048576); - // Using a loose equality here to match on '' and false. - if ($buf == null) { - break; - } - $buffer .= $buf; - } - return $buffer; - } - - $len = 0; - while (!$stream->eof() && $len < $maxLen) { - $buf = $stream->read($maxLen - $len); - // Using a loose equality here to match on '' and false. - if ($buf == null) { - break; - } - $buffer .= $buf; - $len = strlen($buffer); - } - - return $buffer; + return Utils::copyToString($stream, $maxLen); } /** @@ -365,92 +208,48 @@ function copy_to_string(StreamInterface $stream, $maxLen = -1) * to read the entire stream. * * @throws \RuntimeException on error. + * + * @deprecated copy_to_stream will be removed in guzzlehttp/psr7:2.0. Use Utils::copyToStream instead. */ -function copy_to_stream( - StreamInterface $source, - StreamInterface $dest, - $maxLen = -1 -) { - $bufferSize = 8192; - - if ($maxLen === -1) { - while (!$source->eof()) { - if (!$dest->write($source->read($bufferSize))) { - break; - } - } - } else { - $remaining = $maxLen; - while ($remaining > 0 && !$source->eof()) { - $buf = $source->read(min($bufferSize, $remaining)); - $len = strlen($buf); - if (!$len) { - break; - } - $remaining -= $len; - $dest->write($buf); - } - } +function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1) +{ + return Utils::copyToStream($source, $dest, $maxLen); } /** - * Calculate a hash of a Stream + * Calculate a hash of a stream. + * + * This method reads the entire stream to calculate a rolling hash, based on + * PHP's `hash_init` functions. * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @return string Returns the hash of the stream + * * @throws \RuntimeException on error. + * + * @deprecated hash will be removed in guzzlehttp/psr7:2.0. Use Utils::hash instead. */ -function hash( - StreamInterface $stream, - $algo, - $rawOutput = false -) { - $pos = $stream->tell(); - - if ($pos > 0) { - $stream->rewind(); - } - - $ctx = hash_init($algo); - while (!$stream->eof()) { - hash_update($ctx, $stream->read(1048576)); - } - - $out = hash_final($ctx, (bool) $rawOutput); - $stream->seek($pos); - - return $out; +function hash(StreamInterface $stream, $algo, $rawOutput = false) +{ + return Utils::hash($stream, $algo, $rawOutput); } /** - * Read a line from the stream up to the maximum allowed buffer length + * Read a line from the stream up to the maximum allowed buffer length. * * @param StreamInterface $stream Stream to read from - * @param int $maxLength Maximum buffer length + * @param int|null $maxLength Maximum buffer length * - * @return string|bool + * @return string + * + * @deprecated readline will be removed in guzzlehttp/psr7:2.0. Use Utils::readLine instead. */ function readline(StreamInterface $stream, $maxLength = null) { - $buffer = ''; - $size = 0; - - while (!$stream->eof()) { - // Using a loose equality here to match on '' and false. - if (null == ($byte = $stream->read(1))) { - return $buffer; - } - $buffer .= $byte; - // Break when a new line is found or the max length - 1 is reached - if ($byte === "\n" || ++$size === $maxLength - 1) { - break; - } - } - - return $buffer; + return Utils::readLine($stream, $maxLength); } /** @@ -459,26 +258,12 @@ function readline(StreamInterface $stream, $maxLength = null) * @param string $message Request message string. * * @return Request + * + * @deprecated parse_request will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequest instead. */ function parse_request($message) { - $data = _parse_message($message); - $matches = []; - if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { - throw new \InvalidArgumentException('Invalid request string'); - } - $parts = explode(' ', $data['start-line'], 3); - $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; - - $request = new Request( - $parts[0], - $matches[1] === '/' ? _parse_request_uri($parts[1], $data['headers']) : $parts[1], - $data['headers'], - $data['body'], - $version - ); - - return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); + return Message::parseRequest($message); } /** @@ -487,139 +272,66 @@ function parse_request($message) * @param string $message Response message string. * * @return Response + * + * @deprecated parse_response will be removed in guzzlehttp/psr7:2.0. Use Message::parseResponse instead. */ function parse_response($message) { - $data = _parse_message($message); - // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space - // between status-code and reason-phrase is required. But browsers accept - // responses without space and reason as well. - if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { - throw new \InvalidArgumentException('Invalid response string'); - } - $parts = explode(' ', $data['start-line'], 3); - - return new Response( - $parts[1], - $data['headers'], - $data['body'], - explode('/', $parts[0])[1], - isset($parts[2]) ? $parts[2] : null - ); + return Message::parseResponse($message); } /** * Parse a query string into an associative array. * - * If multiple values are found for the same key, the value of that key - * value pair will become an array. This function does not parse nested - * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will - * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']). + * If multiple values are found for the same key, the value of that key value + * pair will become an array. This function does not parse nested PHP style + * arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed + * into `['foo[a]' => '1', 'foo[b]' => '2'])`. * - * @param string $str Query string to parse - * @param bool|string $urlEncoding How the query string is encoded + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded * * @return array + * + * @deprecated parse_query will be removed in guzzlehttp/psr7:2.0. Use Query::parse instead. */ function parse_query($str, $urlEncoding = true) { - $result = []; - - if ($str === '') { - return $result; - } - - if ($urlEncoding === true) { - $decoder = function ($value) { - return rawurldecode(str_replace('+', ' ', $value)); - }; - } elseif ($urlEncoding == PHP_QUERY_RFC3986) { - $decoder = 'rawurldecode'; - } elseif ($urlEncoding == PHP_QUERY_RFC1738) { - $decoder = 'urldecode'; - } else { - $decoder = function ($str) { return $str; }; - } - - foreach (explode('&', $str) as $kvp) { - $parts = explode('=', $kvp, 2); - $key = $decoder($parts[0]); - $value = isset($parts[1]) ? $decoder($parts[1]) : null; - if (!isset($result[$key])) { - $result[$key] = $value; - } else { - if (!is_array($result[$key])) { - $result[$key] = [$result[$key]]; - } - $result[$key][] = $value; - } - } - - return $result; + return Query::parse($str, $urlEncoding); } /** * Build a query string from an array of key value pairs. * - * This function can use the return value of parse_query() to build a query + * This function can use the return value of `parse_query()` to build a query * string. This function does not modify the provided keys when an array is - * encountered (like http_build_query would). + * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * @return string + * + * @deprecated build_query will be removed in guzzlehttp/psr7:2.0. Use Query::build instead. */ function build_query(array $params, $encoding = PHP_QUERY_RFC3986) { - if (!$params) { - return ''; - } - - if ($encoding === false) { - $encoder = function ($str) { return $str; }; - } elseif ($encoding === PHP_QUERY_RFC3986) { - $encoder = 'rawurlencode'; - } elseif ($encoding === PHP_QUERY_RFC1738) { - $encoder = 'urlencode'; - } else { - throw new \InvalidArgumentException('Invalid type'); - } - - $qs = ''; - foreach ($params as $k => $v) { - $k = $encoder($k); - if (!is_array($v)) { - $qs .= $k; - if ($v !== null) { - $qs .= '=' . $encoder($v); - } - $qs .= '&'; - } else { - foreach ($v as $vv) { - $qs .= $k; - if ($vv !== null) { - $qs .= '=' . $encoder($vv); - } - $qs .= '&'; - } - } - } - - return $qs ? (string) substr($qs, 0, -1) : ''; + return Query::build($params, $encoding); } /** * Determines the mimetype of a file by looking at its extension. * - * @param $filename + * @param string $filename + * + * @return string|null * - * @return null|string + * @deprecated mimetype_from_filename will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromFilename instead. */ function mimetype_from_filename($filename) { - return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION)); + return MimeType::fromFilename($filename); } /** @@ -628,116 +340,13 @@ function mimetype_from_filename($filename) * @param $extension string The file extension. * * @return string|null + * * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types + * @deprecated mimetype_from_extension will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromExtension instead. */ function mimetype_from_extension($extension) { - static $mimetypes = [ - '7z' => 'application/x-7z-compressed', - 'aac' => 'audio/x-aac', - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'asc' => 'text/plain', - 'asf' => 'video/x-ms-asf', - 'atom' => 'application/atom+xml', - 'avi' => 'video/x-msvideo', - 'bmp' => 'image/bmp', - 'bz2' => 'application/x-bzip2', - 'cer' => 'application/pkix-cert', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'css' => 'text/css', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'deb' => 'application/x-debian-package', - 'doc' => 'application/msword', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dvi' => 'application/x-dvi', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'etx' => 'text/x-setext', - 'flac' => 'audio/flac', - 'flv' => 'video/x-flv', - 'gif' => 'image/gif', - 'gz' => 'application/gzip', - 'htm' => 'text/html', - 'html' => 'text/html', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ini' => 'text/plain', - 'iso' => 'application/x-iso9660-image', - 'jar' => 'application/java-archive', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'js' => 'text/javascript', - 'json' => 'application/json', - 'latex' => 'application/x-latex', - 'log' => 'text/plain', - 'm4a' => 'audio/mp4', - 'm4v' => 'video/mp4', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mov' => 'video/quicktime', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4v' => 'video/mp4', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'oga' => 'audio/ogg', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'pbm' => 'image/x-portable-bitmap', - 'pdf' => 'application/pdf', - 'pgm' => 'image/x-portable-graymap', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'ppm' => 'image/x-portable-pixmap', - 'ppt' => 'application/vnd.ms-powerpoint', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'ps' => 'application/postscript', - 'qt' => 'video/quicktime', - 'rar' => 'application/x-rar-compressed', - 'ras' => 'image/x-cmu-raster', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'svg' => 'image/svg+xml', - 'swf' => 'application/x-shockwave-flash', - 'tar' => 'application/x-tar', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'torrent' => 'application/x-bittorrent', - 'ttf' => 'application/x-font-ttf', - 'txt' => 'text/plain', - 'wav' => 'audio/x-wav', - 'webm' => 'video/webm', - 'wma' => 'audio/x-ms-wma', - 'wmv' => 'video/x-ms-wmv', - 'woff' => 'application/x-font-woff', - 'wsdl' => 'application/wsdl+xml', - 'xbm' => 'image/x-xbitmap', - 'xls' => 'application/vnd.ms-excel', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xml' => 'application/xml', - 'xpm' => 'image/x-xpixmap', - 'xwd' => 'image/x-xwindowdump', - 'yaml' => 'text/yaml', - 'yml' => 'text/yaml', - 'zip' => 'application/zip', - ]; - - $extension = strtolower($extension); - - return isset($mimetypes[$extension]) - ? $mimetypes[$extension] - : null; + return MimeType::fromExtension($extension); } /** @@ -750,37 +359,13 @@ function mimetype_from_extension($extension) * @param string $message HTTP request or response to parse. * * @return array + * * @internal + * @deprecated _parse_message will be removed in guzzlehttp/psr7:2.0. Use Message::parseMessage instead. */ function _parse_message($message) { - if (!$message) { - throw new \InvalidArgumentException('Invalid message'); - } - - // Iterate over each line in the message, accounting for line endings - $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); - $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => '']; - array_shift($lines); - - for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { - $line = $lines[$i]; - // If two line breaks were encountered, then this is the end of body - if (empty($line)) { - if ($i < $totalLines - 1) { - $result['body'] = implode('', array_slice($lines, $i + 2)); - } - break; - } - if (strpos($line, ':')) { - $parts = explode(':', $line, 2); - $key = trim($parts[0]); - $value = isset($parts[1]) ? trim($parts[1]) : ''; - $result['headers'][$key][] = $value; - } - } - - return $result; + return Message::parseMessage($message); } /** @@ -790,39 +375,43 @@ function _parse_message($message) * @param array $headers Array of headers (each value an array). * * @return string + * * @internal + * @deprecated _parse_request_uri will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequestUri instead. */ function _parse_request_uri($path, array $headers) { - $hostKey = array_filter(array_keys($headers), function ($k) { - return strtolower($k) === 'host'; - }); - - // If no host is found, then a full URI cannot be constructed. - if (!$hostKey) { - return $path; - } - - $host = $headers[reset($hostKey)][0]; - $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; + return Message::parseRequestUri($path, $headers); +} - return $scheme . '://' . $host . '/' . ltrim($path, '/'); +/** + * Get a short summary of the message body. + * + * Will return `null` if the response is not printable. + * + * @param MessageInterface $message The message to get the body summary + * @param int $truncateAt The maximum allowed size of the summary + * + * @return string|null + * + * @deprecated get_message_body_summary will be removed in guzzlehttp/psr7:2.0. Use Message::bodySummary instead. + */ +function get_message_body_summary(MessageInterface $message, $truncateAt = 120) +{ + return Message::bodySummary($message, $truncateAt); } -/** @internal */ +/** + * Remove the items given by the keys, case insensitively from the data. + * + * @param iterable $keys + * + * @return array + * + * @internal + * @deprecated _caseless_remove will be removed in guzzlehttp/psr7:2.0. Use Utils::caselessRemove instead. + */ function _caseless_remove($keys, array $data) { - $result = []; - - foreach ($keys as &$key) { - $key = strtolower($key); - } - - foreach ($data as $k => $v) { - if (!in_array(strtolower($k), $keys)) { - $result[$k] = $v; - } - } - - return $result; + return Utils::caselessRemove($keys, $data); } diff --git a/vendor/league/oauth2-client/LICENSE b/vendor/league/oauth2-client/LICENSE new file mode 100644 index 00000000..7dfa39b7 --- /dev/null +++ b/vendor/league/oauth2-client/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2020 Alex Bilbie + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/league/oauth2-client/README.md b/vendor/league/oauth2-client/README.md new file mode 100644 index 00000000..ea655f61 --- /dev/null +++ b/vendor/league/oauth2-client/README.md @@ -0,0 +1,271 @@ +# OAuth 2.0 Client + +This package makes it simple to integrate your application with [OAuth 2.0](http://oauth.net/2/) service providers. + +[![Gitter Chat](https://img.shields.io/badge/gitter-join_chat-brightgreen.svg?style=flat-square)](https://gitter.im/thephpleague/oauth2-client) +[![Source Code](https://img.shields.io/badge/source-thephpleague/oauth2--client-blue.svg?style=flat-square)](https://github.com/thephpleague/oauth2-client) +[![Latest Version](https://img.shields.io/github/release/thephpleague/oauth2-client.svg?style=flat-square)](https://github.com/thephpleague/oauth2-client/releases) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](https://github.com/thephpleague/oauth2-client/blob/master/LICENSE) +[![Build Status](https://img.shields.io/github/workflow/status/thephpleague/oauth2-client/CI?label=CI&logo=github&style=flat-square)](https://github.com/thephpleague/oauth2-client/actions?query=workflow%3ACI) +[![Codecov Code Coverage](https://img.shields.io/codecov/c/gh/thephpleague/oauth2-client?label=codecov&logo=codecov&style=flat-square)](https://codecov.io/gh/thephpleague/oauth2-client) +[![Total Downloads](https://img.shields.io/packagist/dt/league/oauth2-client.svg?style=flat-square)](https://packagist.org/packages/league/oauth2-client) + +--- + +We are all used to seeing those "Connect with Facebook/Google/etc." buttons around the internet, and social network integration is an important feature of most web applications these days. Many of these sites use an authentication and authorization standard called OAuth 2.0 ([RFC 6749](http://tools.ietf.org/html/rfc6749)). + +This OAuth 2.0 client library will work with any OAuth provider that conforms to the OAuth 2.0 standard. Out-of-the-box, we provide a `GenericProvider` that may be used to connect to any service provider that uses [Bearer tokens](http://tools.ietf.org/html/rfc6750) (see example below). + +Many service providers provide additional functionality above and beyond the OAuth 2.0 standard. For this reason, this library may be easily extended and wrapped to support this additional behavior. We provide links to [all known provider clients extending this library](docs/providers/thirdparty.md) (i.e. Facebook, GitHub, Google, Instagram, LinkedIn, etc.). If your provider isn't in the list, feel free to add it. + +This package is compliant with [PSR-1][], [PSR-2][], [PSR-4][], and [PSR-7][]. If you notice compliance oversights, please send a patch via pull request. If you're interesting in contributing to this library, please take a look at our [contributing guidelines](CONTRIBUTING.md). + +## Requirements + +The following versions of PHP are supported. + +* PHP 5.6 +* PHP 7.0 +* PHP 7.1 +* PHP 7.2 +* PHP 7.3 +* PHP 7.4 +* PHP 8.0 + +## Providers + +A list of official PHP League providers, as well as third-party providers, may be found in the [providers list README](docs/providers/thirdparty.md). + +To build your own provider, please refer to the [provider guide README](README.PROVIDER-GUIDE.md). + +## Usage + +**In most cases, you'll want to use a specific provider client library rather than this base library.** + +Take a look at [providers list README](docs/providers/thirdparty.md) to see a list of provider client libraries. + +If using Composer to require a specific provider client library, you **do not need to also require this library**. Composer will handle the dependencies for you. + +### Authorization Code Grant + +The following example uses the out-of-the-box `GenericProvider` provided by this library. If you're looking for a specific provider (i.e. Facebook, Google, GitHub, etc.), take a look at our [list of provider client libraries](docs/providers/thirdparty.md). **HINT: You're probably looking for a specific provider.** + +The authorization code grant type is the most common grant type used when authenticating users with a third-party service. This grant type utilizes a client (this library), a server (the service provider), and a resource owner (the user with credentials to a protected—or owned—resource) to request access to resources owned by the user. This is often referred to as _3-legged OAuth_, since there are three parties involved. + +The following example illustrates this using [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. When running this code, you will be redirected to Lock'd In, where you'll be prompted to authorize the client to make requests to a resource on your behalf. + +Now, you don't really have an account on Lock'd In, but for the sake of this example, imagine that you are already logged in on Lock'd In when you are redirected there. + +```php +$provider = new \League\OAuth2\Client\Provider\GenericProvider([ + 'clientId' => 'demoapp', // The client ID assigned to you by the provider + 'clientSecret' => 'demopass', // The client password assigned to you by the provider + 'redirectUri' => 'http://example.com/your-redirect-url/', + 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize', + 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token', + 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource' +]); + +// If we don't have an authorization code then get one +if (!isset($_GET['code'])) { + + // Fetch the authorization URL from the provider; this returns the + // urlAuthorize option and generates and applies any necessary parameters + // (e.g. state). + $authorizationUrl = $provider->getAuthorizationUrl(); + + // Get the state generated for you and store it to the session. + $_SESSION['oauth2state'] = $provider->getState(); + + // Redirect the user to the authorization URL. + header('Location: ' . $authorizationUrl); + exit; + +// Check given state against previously stored one to mitigate CSRF attack +} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) { + + if (isset($_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + } + + exit('Invalid state'); + +} else { + + try { + + // Try to get an access token using the authorization code grant. + $accessToken = $provider->getAccessToken('authorization_code', [ + 'code' => $_GET['code'] + ]); + + // We have an access token, which we may use in authenticated + // requests against the service provider's API. + echo 'Access Token: ' . $accessToken->getToken() . "
"; + echo 'Refresh Token: ' . $accessToken->getRefreshToken() . "
"; + echo 'Expired in: ' . $accessToken->getExpires() . "
"; + echo 'Already expired? ' . ($accessToken->hasExpired() ? 'expired' : 'not expired') . "
"; + + // Using the access token, we may look up details about the + // resource owner. + $resourceOwner = $provider->getResourceOwner($accessToken); + + var_export($resourceOwner->toArray()); + + // The provider provides a way to get an authenticated API request for + // the service, using the access token; it returns an object conforming + // to Psr\Http\Message\RequestInterface. + $request = $provider->getAuthenticatedRequest( + 'GET', + 'http://brentertainment.com/oauth2/lockdin/resource', + $accessToken + ); + + } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { + + // Failed to get the access token or user details. + exit($e->getMessage()); + + } + +} +``` + +### Refreshing a Token + +Once your application is authorized, you can refresh an expired token using a refresh token rather than going through the entire process of obtaining a brand new token. To do so, simply reuse this refresh token from your data store to request a refresh. + +_This example uses [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. See authorization code example above, for more details._ + +```php +$provider = new \League\OAuth2\Client\Provider\GenericProvider([ + 'clientId' => 'demoapp', // The client ID assigned to you by the provider + 'clientSecret' => 'demopass', // The client password assigned to you by the provider + 'redirectUri' => 'http://example.com/your-redirect-url/', + 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize', + 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token', + 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource' +]); + +$existingAccessToken = getAccessTokenFromYourDataStore(); + +if ($existingAccessToken->hasExpired()) { + $newAccessToken = $provider->getAccessToken('refresh_token', [ + 'refresh_token' => $existingAccessToken->getRefreshToken() + ]); + + // Purge old access token and store new access token to your data store. +} +``` + +### Resource Owner Password Credentials Grant + +Some service providers allow you to skip the authorization code step to exchange a user's credentials (username and password) for an access token. This is referred to as the "resource owner password credentials" grant type. + +According to [section 1.3.3](http://tools.ietf.org/html/rfc6749#section-1.3.3) of the OAuth 2.0 standard (emphasis added): + +> The credentials **should only be used when there is a high degree of trust** +> between the resource owner and the client (e.g., the client is part of the +> device operating system or a highly privileged application), and when other +> authorization grant types are not available (such as an authorization code). + +**We do not advise using this grant type if the service provider supports the authorization code grant type (see above), as this reinforces the [password anti-pattern](https://agentile.com/the-password-anti-pattern) by allowing users to think it's okay to trust third-party applications with their usernames and passwords.** + +That said, there are use-cases where the resource owner password credentials grant is acceptable and useful. Here's an example using it with [Brent Shaffer's](https://github.com/bshaffer) demo OAuth 2.0 application named **Lock'd In**. See authorization code example above, for more details about the Lock'd In demo application. + +``` php +$provider = new \League\OAuth2\Client\Provider\GenericProvider([ + 'clientId' => 'demoapp', // The client ID assigned to you by the provider + 'clientSecret' => 'demopass', // The client password assigned to you by the provider + 'redirectUri' => 'http://example.com/your-redirect-url/', + 'urlAuthorize' => 'http://brentertainment.com/oauth2/lockdin/authorize', + 'urlAccessToken' => 'http://brentertainment.com/oauth2/lockdin/token', + 'urlResourceOwnerDetails' => 'http://brentertainment.com/oauth2/lockdin/resource' +]); + +try { + + // Try to get an access token using the resource owner password credentials grant. + $accessToken = $provider->getAccessToken('password', [ + 'username' => 'demouser', + 'password' => 'testpass' + ]); + +} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { + + // Failed to get the access token + exit($e->getMessage()); + +} +``` + +### Client Credentials Grant + +When your application is acting on its own behalf to access resources it controls/owns in a service provider, it may use the client credentials grant type. This is best used when the credentials for your application are stored privately and never exposed (e.g. through the web browser, etc.) to end-users. This grant type functions similarly to the resource owner password credentials grant type, but it does not request a user's username or password. It uses only the client ID and secret issued to your client by the service provider. + +Unlike earlier examples, the following does not work against a functioning demo service provider. It is provided for the sake of example only. + +``` php +// Note: the GenericProvider requires the `urlAuthorize` option, even though +// it's not used in the OAuth 2.0 client credentials grant type. + +$provider = new \League\OAuth2\Client\Provider\GenericProvider([ + 'clientId' => 'XXXXXX', // The client ID assigned to you by the provider + 'clientSecret' => 'XXXXXX', // The client password assigned to you by the provider + 'redirectUri' => 'http://my.example.com/your-redirect-url/', + 'urlAuthorize' => 'http://service.example.com/authorize', + 'urlAccessToken' => 'http://service.example.com/token', + 'urlResourceOwnerDetails' => 'http://service.example.com/resource' +]); + +try { + + // Try to get an access token using the client credentials grant. + $accessToken = $provider->getAccessToken('client_credentials'); + +} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) { + + // Failed to get the access token + exit($e->getMessage()); + +} +``` + +### Using a proxy + +It is possible to use a proxy to debug HTTP calls made to a provider. All you need to do is set the `proxy` and `verify` options when creating your Provider instance. Make sure you enable SSL proxying in your proxy. + +``` php +$provider = new \League\OAuth2\Client\Provider\GenericProvider([ + 'clientId' => 'XXXXXX', // The client ID assigned to you by the provider + 'clientSecret' => 'XXXXXX', // The client password assigned to you by the provider + 'redirectUri' => 'http://my.example.com/your-redirect-url/', + 'urlAuthorize' => 'http://service.example.com/authorize', + 'urlAccessToken' => 'http://service.example.com/token', + 'urlResourceOwnerDetails' => 'http://service.example.com/resource', + 'proxy' => '192.168.0.1:8888', + 'verify' => false +]); +``` + +## Install + +Via Composer + +``` bash +$ composer require league/oauth2-client +``` + +## Contributing + +Please see [CONTRIBUTING](https://github.com/thephpleague/oauth2-client/blob/master/CONTRIBUTING.md) for details. + +## License + +The MIT License (MIT). Please see [License File](https://github.com/thephpleague/oauth2-client/blob/master/LICENSE) for more information. + + +[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md +[PSR-2]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md +[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md +[PSR-7]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-7-http-message.md diff --git a/vendor/league/oauth2-client/composer.json b/vendor/league/oauth2-client/composer.json new file mode 100644 index 00000000..321a2c26 --- /dev/null +++ b/vendor/league/oauth2-client/composer.json @@ -0,0 +1,58 @@ +{ + "name": "league/oauth2-client", + "description": "OAuth 2.0 Client Library", + "license": "MIT", + "config": { + "sort-packages": true + }, + "require": { + "php": "^5.6 || ^7.0 || ^8.0", + "guzzlehttp/guzzle": "^6.0 || ^7.0", + "paragonie/random_compat": "^1 || ^2 || ^9.99" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^5.7 || ^6.0 || ^9.3", + "squizlabs/php_codesniffer": "^2.3 || ^3.0" + }, + "keywords": [ + "oauth", + "oauth2", + "authorization", + "authentication", + "idp", + "identity", + "sso", + "single sign on" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Woody Gilk", + "homepage": "https://github.com/shadowhand", + "role": "Contributor" + } + + ], + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "League\\OAuth2\\Client\\Test\\": "test/src/" + } + }, + "extra": { + "branch-alias": { + "dev-2.x": "2.0.x-dev" + } + } +} diff --git a/vendor/league/oauth2-client/src/Grant/AbstractGrant.php b/vendor/league/oauth2-client/src/Grant/AbstractGrant.php new file mode 100644 index 00000000..2c0244ba --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/AbstractGrant.php @@ -0,0 +1,80 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant; + +use League\OAuth2\Client\Tool\RequiredParameterTrait; + +/** + * Represents a type of authorization grant. + * + * An authorization grant is a credential representing the resource + * owner's authorization (to access its protected resources) used by the + * client to obtain an access token. OAuth 2.0 defines four + * grant types -- authorization code, implicit, resource owner password + * credentials, and client credentials -- as well as an extensibility + * mechanism for defining additional types. + * + * @link http://tools.ietf.org/html/rfc6749#section-1.3 Authorization Grant (RFC 6749, §1.3) + */ +abstract class AbstractGrant +{ + use RequiredParameterTrait; + + /** + * Returns the name of this grant, eg. 'grant_name', which is used as the + * grant type when encoding URL query parameters. + * + * @return string + */ + abstract protected function getName(); + + /** + * Returns a list of all required request parameters. + * + * @return array + */ + abstract protected function getRequiredRequestParameters(); + + /** + * Returns this grant's name as its string representation. This allows for + * string interpolation when building URL query parameters. + * + * @return string + */ + public function __toString() + { + return $this->getName(); + } + + /** + * Prepares an access token request's parameters by checking that all + * required parameters are set, then merging with any given defaults. + * + * @param array $defaults + * @param array $options + * @return array + */ + public function prepareRequestParameters(array $defaults, array $options) + { + $defaults['grant_type'] = $this->getName(); + + $required = $this->getRequiredRequestParameters(); + $provided = array_merge($defaults, $options); + + $this->checkRequiredParameters($required, $provided); + + return $provided; + } +} diff --git a/vendor/league/oauth2-client/src/Grant/AuthorizationCode.php b/vendor/league/oauth2-client/src/Grant/AuthorizationCode.php new file mode 100644 index 00000000..c49460c0 --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/AuthorizationCode.php @@ -0,0 +1,41 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant; + +/** + * Represents an authorization code grant. + * + * @link http://tools.ietf.org/html/rfc6749#section-1.3.1 Authorization Code (RFC 6749, §1.3.1) + */ +class AuthorizationCode extends AbstractGrant +{ + /** + * @inheritdoc + */ + protected function getName() + { + return 'authorization_code'; + } + + /** + * @inheritdoc + */ + protected function getRequiredRequestParameters() + { + return [ + 'code', + ]; + } +} diff --git a/vendor/league/oauth2-client/src/Grant/ClientCredentials.php b/vendor/league/oauth2-client/src/Grant/ClientCredentials.php new file mode 100644 index 00000000..dc78c4fd --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/ClientCredentials.php @@ -0,0 +1,39 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant; + +/** + * Represents a client credentials grant. + * + * @link http://tools.ietf.org/html/rfc6749#section-1.3.4 Client Credentials (RFC 6749, §1.3.4) + */ +class ClientCredentials extends AbstractGrant +{ + /** + * @inheritdoc + */ + protected function getName() + { + return 'client_credentials'; + } + + /** + * @inheritdoc + */ + protected function getRequiredRequestParameters() + { + return []; + } +} diff --git a/vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php b/vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php new file mode 100644 index 00000000..c3c4e677 --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/Exception/InvalidGrantException.php @@ -0,0 +1,26 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant\Exception; + +use InvalidArgumentException; + +/** + * Exception thrown if the grant does not extend from AbstractGrant. + * + * @see League\OAuth2\Client\Grant\AbstractGrant + */ +class InvalidGrantException extends InvalidArgumentException +{ +} diff --git a/vendor/league/oauth2-client/src/Grant/GrantFactory.php b/vendor/league/oauth2-client/src/Grant/GrantFactory.php new file mode 100644 index 00000000..71990e83 --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/GrantFactory.php @@ -0,0 +1,104 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant; + +use League\OAuth2\Client\Grant\Exception\InvalidGrantException; + +/** + * Represents a factory used when retrieving an authorization grant type. + */ +class GrantFactory +{ + /** + * @var array + */ + protected $registry = []; + + /** + * Defines a grant singleton in the registry. + * + * @param string $name + * @param AbstractGrant $grant + * @return self + */ + public function setGrant($name, AbstractGrant $grant) + { + $this->registry[$name] = $grant; + + return $this; + } + + /** + * Returns a grant singleton by name. + * + * If the grant has not be registered, a default grant will be loaded. + * + * @param string $name + * @return AbstractGrant + */ + public function getGrant($name) + { + if (empty($this->registry[$name])) { + $this->registerDefaultGrant($name); + } + + return $this->registry[$name]; + } + + /** + * Registers a default grant singleton by name. + * + * @param string $name + * @return self + */ + protected function registerDefaultGrant($name) + { + // PascalCase the grant. E.g: 'authorization_code' becomes 'AuthorizationCode' + $class = str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $name))); + $class = 'League\\OAuth2\\Client\\Grant\\' . $class; + + $this->checkGrant($class); + + return $this->setGrant($name, new $class); + } + + /** + * Determines if a variable is a valid grant. + * + * @param mixed $class + * @return boolean + */ + public function isGrant($class) + { + return is_subclass_of($class, AbstractGrant::class); + } + + /** + * Checks if a variable is a valid grant. + * + * @throws InvalidGrantException + * @param mixed $class + * @return void + */ + public function checkGrant($class) + { + if (!$this->isGrant($class)) { + throw new InvalidGrantException(sprintf( + 'Grant "%s" must extend AbstractGrant', + is_object($class) ? get_class($class) : $class + )); + } + } +} diff --git a/vendor/league/oauth2-client/src/Grant/Password.php b/vendor/league/oauth2-client/src/Grant/Password.php new file mode 100644 index 00000000..6543b2eb --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/Password.php @@ -0,0 +1,42 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant; + +/** + * Represents a resource owner password credentials grant. + * + * @link http://tools.ietf.org/html/rfc6749#section-1.3.3 Resource Owner Password Credentials (RFC 6749, §1.3.3) + */ +class Password extends AbstractGrant +{ + /** + * @inheritdoc + */ + protected function getName() + { + return 'password'; + } + + /** + * @inheritdoc + */ + protected function getRequiredRequestParameters() + { + return [ + 'username', + 'password', + ]; + } +} diff --git a/vendor/league/oauth2-client/src/Grant/RefreshToken.php b/vendor/league/oauth2-client/src/Grant/RefreshToken.php new file mode 100644 index 00000000..81921823 --- /dev/null +++ b/vendor/league/oauth2-client/src/Grant/RefreshToken.php @@ -0,0 +1,41 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Grant; + +/** + * Represents a refresh token grant. + * + * @link http://tools.ietf.org/html/rfc6749#section-6 Refreshing an Access Token (RFC 6749, §6) + */ +class RefreshToken extends AbstractGrant +{ + /** + * @inheritdoc + */ + protected function getName() + { + return 'refresh_token'; + } + + /** + * @inheritdoc + */ + protected function getRequiredRequestParameters() + { + return [ + 'refresh_token', + ]; + } +} diff --git a/vendor/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php b/vendor/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php new file mode 100644 index 00000000..3da40656 --- /dev/null +++ b/vendor/league/oauth2-client/src/OptionProvider/HttpBasicAuthOptionProvider.php @@ -0,0 +1,42 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\OptionProvider; + +use InvalidArgumentException; + +/** + * Add http basic auth into access token request options + * @link https://tools.ietf.org/html/rfc6749#section-2.3.1 + */ +class HttpBasicAuthOptionProvider extends PostAuthOptionProvider +{ + /** + * @inheritdoc + */ + public function getAccessTokenOptions($method, array $params) + { + if (empty($params['client_id']) || empty($params['client_secret'])) { + throw new InvalidArgumentException('clientId and clientSecret are required for http basic auth'); + } + + $encodedCredentials = base64_encode(sprintf('%s:%s', $params['client_id'], $params['client_secret'])); + unset($params['client_id'], $params['client_secret']); + + $options = parent::getAccessTokenOptions($method, $params); + $options['headers']['Authorization'] = 'Basic ' . $encodedCredentials; + + return $options; + } +} diff --git a/vendor/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php b/vendor/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php new file mode 100644 index 00000000..1126d25a --- /dev/null +++ b/vendor/league/oauth2-client/src/OptionProvider/OptionProviderInterface.php @@ -0,0 +1,30 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\OptionProvider; + +/** + * Interface for access token options provider + */ +interface OptionProviderInterface +{ + /** + * Builds request options used for requesting an access token. + * + * @param string $method + * @param array $params + * @return array + */ + public function getAccessTokenOptions($method, array $params); +} diff --git a/vendor/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php b/vendor/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php new file mode 100644 index 00000000..12d920ec --- /dev/null +++ b/vendor/league/oauth2-client/src/OptionProvider/PostAuthOptionProvider.php @@ -0,0 +1,51 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\OptionProvider; + +use League\OAuth2\Client\Provider\AbstractProvider; +use League\OAuth2\Client\Tool\QueryBuilderTrait; + +/** + * Provide options for access token + */ +class PostAuthOptionProvider implements OptionProviderInterface +{ + use QueryBuilderTrait; + + /** + * @inheritdoc + */ + public function getAccessTokenOptions($method, array $params) + { + $options = ['headers' => ['content-type' => 'application/x-www-form-urlencoded']]; + + if ($method === AbstractProvider::METHOD_POST) { + $options['body'] = $this->getAccessTokenBody($params); + } + + return $options; + } + + /** + * Returns the request body for requesting an access token. + * + * @param array $params + * @return string + */ + protected function getAccessTokenBody(array $params) + { + return $this->buildQueryString($params); + } +} diff --git a/vendor/league/oauth2-client/src/Provider/AbstractProvider.php b/vendor/league/oauth2-client/src/Provider/AbstractProvider.php new file mode 100644 index 00000000..d1679998 --- /dev/null +++ b/vendor/league/oauth2-client/src/Provider/AbstractProvider.php @@ -0,0 +1,843 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Provider; + +use GuzzleHttp\Client as HttpClient; +use GuzzleHttp\ClientInterface as HttpClientInterface; +use GuzzleHttp\Exception\BadResponseException; +use League\OAuth2\Client\Grant\AbstractGrant; +use League\OAuth2\Client\Grant\GrantFactory; +use League\OAuth2\Client\OptionProvider\OptionProviderInterface; +use League\OAuth2\Client\OptionProvider\PostAuthOptionProvider; +use League\OAuth2\Client\Provider\Exception\IdentityProviderException; +use League\OAuth2\Client\Token\AccessToken; +use League\OAuth2\Client\Token\AccessTokenInterface; +use League\OAuth2\Client\Tool\ArrayAccessorTrait; +use League\OAuth2\Client\Tool\GuardedPropertyTrait; +use League\OAuth2\Client\Tool\QueryBuilderTrait; +use League\OAuth2\Client\Tool\RequestFactory; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use UnexpectedValueException; + +/** + * Represents a service provider (authorization server). + * + * @link http://tools.ietf.org/html/rfc6749#section-1.1 Roles (RFC 6749, §1.1) + */ +abstract class AbstractProvider +{ + use ArrayAccessorTrait; + use GuardedPropertyTrait; + use QueryBuilderTrait; + + /** + * @var string Key used in a token response to identify the resource owner. + */ + const ACCESS_TOKEN_RESOURCE_OWNER_ID = null; + + /** + * @var string HTTP method used to fetch access tokens. + */ + const METHOD_GET = 'GET'; + + /** + * @var string HTTP method used to fetch access tokens. + */ + const METHOD_POST = 'POST'; + + /** + * @var string + */ + protected $clientId; + + /** + * @var string + */ + protected $clientSecret; + + /** + * @var string + */ + protected $redirectUri; + + /** + * @var string + */ + protected $state; + + /** + * @var GrantFactory + */ + protected $grantFactory; + + /** + * @var RequestFactory + */ + protected $requestFactory; + + /** + * @var HttpClientInterface + */ + protected $httpClient; + + /** + * @var OptionProviderInterface + */ + protected $optionProvider; + + /** + * Constructs an OAuth 2.0 service provider. + * + * @param array $options An array of options to set on this provider. + * Options include `clientId`, `clientSecret`, `redirectUri`, and `state`. + * Individual providers may introduce more options, as needed. + * @param array $collaborators An array of collaborators that may be used to + * override this provider's default behavior. Collaborators include + * `grantFactory`, `requestFactory`, and `httpClient`. + * Individual providers may introduce more collaborators, as needed. + */ + public function __construct(array $options = [], array $collaborators = []) + { + // We'll let the GuardedPropertyTrait handle mass assignment of incoming + // options, skipping any blacklisted properties defined in the provider + $this->fillProperties($options); + + if (empty($collaborators['grantFactory'])) { + $collaborators['grantFactory'] = new GrantFactory(); + } + $this->setGrantFactory($collaborators['grantFactory']); + + if (empty($collaborators['requestFactory'])) { + $collaborators['requestFactory'] = new RequestFactory(); + } + $this->setRequestFactory($collaborators['requestFactory']); + + if (empty($collaborators['httpClient'])) { + $client_options = $this->getAllowedClientOptions($options); + + $collaborators['httpClient'] = new HttpClient( + array_intersect_key($options, array_flip($client_options)) + ); + } + $this->setHttpClient($collaborators['httpClient']); + + if (empty($collaborators['optionProvider'])) { + $collaborators['optionProvider'] = new PostAuthOptionProvider(); + } + $this->setOptionProvider($collaborators['optionProvider']); + } + + /** + * Returns the list of options that can be passed to the HttpClient + * + * @param array $options An array of options to set on this provider. + * Options include `clientId`, `clientSecret`, `redirectUri`, and `state`. + * Individual providers may introduce more options, as needed. + * @return array The options to pass to the HttpClient constructor + */ + protected function getAllowedClientOptions(array $options) + { + $client_options = ['timeout', 'proxy']; + + // Only allow turning off ssl verification if it's for a proxy + if (!empty($options['proxy'])) { + $client_options[] = 'verify'; + } + + return $client_options; + } + + /** + * Sets the grant factory instance. + * + * @param GrantFactory $factory + * @return self + */ + public function setGrantFactory(GrantFactory $factory) + { + $this->grantFactory = $factory; + + return $this; + } + + /** + * Returns the current grant factory instance. + * + * @return GrantFactory + */ + public function getGrantFactory() + { + return $this->grantFactory; + } + + /** + * Sets the request factory instance. + * + * @param RequestFactory $factory + * @return self + */ + public function setRequestFactory(RequestFactory $factory) + { + $this->requestFactory = $factory; + + return $this; + } + + /** + * Returns the request factory instance. + * + * @return RequestFactory + */ + public function getRequestFactory() + { + return $this->requestFactory; + } + + /** + * Sets the HTTP client instance. + * + * @param HttpClientInterface $client + * @return self + */ + public function setHttpClient(HttpClientInterface $client) + { + $this->httpClient = $client; + + return $this; + } + + /** + * Returns the HTTP client instance. + * + * @return HttpClientInterface + */ + public function getHttpClient() + { + return $this->httpClient; + } + + /** + * Sets the option provider instance. + * + * @param OptionProviderInterface $provider + * @return self + */ + public function setOptionProvider(OptionProviderInterface $provider) + { + $this->optionProvider = $provider; + + return $this; + } + + /** + * Returns the option provider instance. + * + * @return OptionProviderInterface + */ + public function getOptionProvider() + { + return $this->optionProvider; + } + + /** + * Returns the current value of the state parameter. + * + * This can be accessed by the redirect handler during authorization. + * + * @return string + */ + public function getState() + { + return $this->state; + } + + /** + * Returns the base URL for authorizing a client. + * + * Eg. https://oauth.service.com/authorize + * + * @return string + */ + abstract public function getBaseAuthorizationUrl(); + + /** + * Returns the base URL for requesting an access token. + * + * Eg. https://oauth.service.com/token + * + * @param array $params + * @return string + */ + abstract public function getBaseAccessTokenUrl(array $params); + + /** + * Returns the URL for requesting the resource owner's details. + * + * @param AccessToken $token + * @return string + */ + abstract public function getResourceOwnerDetailsUrl(AccessToken $token); + + /** + * Returns a new random string to use as the state parameter in an + * authorization flow. + * + * @param int $length Length of the random string to be generated. + * @return string + */ + protected function getRandomState($length = 32) + { + // Converting bytes to hex will always double length. Hence, we can reduce + // the amount of bytes by half to produce the correct length. + return bin2hex(random_bytes($length / 2)); + } + + /** + * Returns the default scopes used by this provider. + * + * This should only be the scopes that are required to request the details + * of the resource owner, rather than all the available scopes. + * + * @return array + */ + abstract protected function getDefaultScopes(); + + /** + * Returns the string that should be used to separate scopes when building + * the URL for requesting an access token. + * + * @return string Scope separator, defaults to ',' + */ + protected function getScopeSeparator() + { + return ','; + } + + /** + * Returns authorization parameters based on provided options. + * + * @param array $options + * @return array Authorization parameters + */ + protected function getAuthorizationParameters(array $options) + { + if (empty($options['state'])) { + $options['state'] = $this->getRandomState(); + } + + if (empty($options['scope'])) { + $options['scope'] = $this->getDefaultScopes(); + } + + $options += [ + 'response_type' => 'code', + 'approval_prompt' => 'auto' + ]; + + if (is_array($options['scope'])) { + $separator = $this->getScopeSeparator(); + $options['scope'] = implode($separator, $options['scope']); + } + + // Store the state as it may need to be accessed later on. + $this->state = $options['state']; + + // Business code layer might set a different redirect_uri parameter + // depending on the context, leave it as-is + if (!isset($options['redirect_uri'])) { + $options['redirect_uri'] = $this->redirectUri; + } + + $options['client_id'] = $this->clientId; + + return $options; + } + + /** + * Builds the authorization URL's query string. + * + * @param array $params Query parameters + * @return string Query string + */ + protected function getAuthorizationQuery(array $params) + { + return $this->buildQueryString($params); + } + + /** + * Builds the authorization URL. + * + * @param array $options + * @return string Authorization URL + */ + public function getAuthorizationUrl(array $options = []) + { + $base = $this->getBaseAuthorizationUrl(); + $params = $this->getAuthorizationParameters($options); + $query = $this->getAuthorizationQuery($params); + + return $this->appendQuery($base, $query); + } + + /** + * Redirects the client for authorization. + * + * @param array $options + * @param callable|null $redirectHandler + * @return mixed + */ + public function authorize( + array $options = [], + callable $redirectHandler = null + ) { + $url = $this->getAuthorizationUrl($options); + if ($redirectHandler) { + return $redirectHandler($url, $this); + } + + // @codeCoverageIgnoreStart + header('Location: ' . $url); + exit; + // @codeCoverageIgnoreEnd + } + + /** + * Appends a query string to a URL. + * + * @param string $url The URL to append the query to + * @param string $query The HTTP query string + * @return string The resulting URL + */ + protected function appendQuery($url, $query) + { + $query = trim($query, '?&'); + + if ($query) { + $glue = strstr($url, '?') === false ? '?' : '&'; + return $url . $glue . $query; + } + + return $url; + } + + /** + * Returns the method to use when requesting an access token. + * + * @return string HTTP method + */ + protected function getAccessTokenMethod() + { + return self::METHOD_POST; + } + + /** + * Returns the key used in the access token response to identify the resource owner. + * + * @return string|null Resource owner identifier key + */ + protected function getAccessTokenResourceOwnerId() + { + return static::ACCESS_TOKEN_RESOURCE_OWNER_ID; + } + + /** + * Builds the access token URL's query string. + * + * @param array $params Query parameters + * @return string Query string + */ + protected function getAccessTokenQuery(array $params) + { + return $this->buildQueryString($params); + } + + /** + * Checks that a provided grant is valid, or attempts to produce one if the + * provided grant is a string. + * + * @param AbstractGrant|string $grant + * @return AbstractGrant + */ + protected function verifyGrant($grant) + { + if (is_string($grant)) { + return $this->grantFactory->getGrant($grant); + } + + $this->grantFactory->checkGrant($grant); + return $grant; + } + + /** + * Returns the full URL to use when requesting an access token. + * + * @param array $params Query parameters + * @return string + */ + protected function getAccessTokenUrl(array $params) + { + $url = $this->getBaseAccessTokenUrl($params); + + if ($this->getAccessTokenMethod() === self::METHOD_GET) { + $query = $this->getAccessTokenQuery($params); + return $this->appendQuery($url, $query); + } + + return $url; + } + + /** + * Returns a prepared request for requesting an access token. + * + * @param array $params Query string parameters + * @return RequestInterface + */ + protected function getAccessTokenRequest(array $params) + { + $method = $this->getAccessTokenMethod(); + $url = $this->getAccessTokenUrl($params); + $options = $this->optionProvider->getAccessTokenOptions($this->getAccessTokenMethod(), $params); + + return $this->getRequest($method, $url, $options); + } + + /** + * Requests an access token using a specified grant and option set. + * + * @param mixed $grant + * @param array $options + * @throws IdentityProviderException + * @return AccessTokenInterface + */ + public function getAccessToken($grant, array $options = []) + { + $grant = $this->verifyGrant($grant); + + $params = [ + 'client_id' => $this->clientId, + 'client_secret' => $this->clientSecret, + 'redirect_uri' => $this->redirectUri, + ]; + + $params = $grant->prepareRequestParameters($params, $options); + $request = $this->getAccessTokenRequest($params); + $response = $this->getParsedResponse($request); + if (false === is_array($response)) { + throw new UnexpectedValueException( + 'Invalid response received from Authorization Server. Expected JSON.' + ); + } + $prepared = $this->prepareAccessTokenResponse($response); + $token = $this->createAccessToken($prepared, $grant); + + return $token; + } + + /** + * Returns a PSR-7 request instance that is not authenticated. + * + * @param string $method + * @param string $url + * @param array $options + * @return RequestInterface + */ + public function getRequest($method, $url, array $options = []) + { + return $this->createRequest($method, $url, null, $options); + } + + /** + * Returns an authenticated PSR-7 request instance. + * + * @param string $method + * @param string $url + * @param AccessTokenInterface|string $token + * @param array $options Any of "headers", "body", and "protocolVersion". + * @return RequestInterface + */ + public function getAuthenticatedRequest($method, $url, $token, array $options = []) + { + return $this->createRequest($method, $url, $token, $options); + } + + /** + * Creates a PSR-7 request instance. + * + * @param string $method + * @param string $url + * @param AccessTokenInterface|string|null $token + * @param array $options + * @return RequestInterface + */ + protected function createRequest($method, $url, $token, array $options) + { + $defaults = [ + 'headers' => $this->getHeaders($token), + ]; + + $options = array_merge_recursive($defaults, $options); + $factory = $this->getRequestFactory(); + + return $factory->getRequestWithOptions($method, $url, $options); + } + + /** + * Sends a request instance and returns a response instance. + * + * WARNING: This method does not attempt to catch exceptions caused by HTTP + * errors! It is recommended to wrap this method in a try/catch block. + * + * @param RequestInterface $request + * @return ResponseInterface + */ + public function getResponse(RequestInterface $request) + { + return $this->getHttpClient()->send($request); + } + + /** + * Sends a request and returns the parsed response. + * + * @param RequestInterface $request + * @throws IdentityProviderException + * @return mixed + */ + public function getParsedResponse(RequestInterface $request) + { + try { + $response = $this->getResponse($request); + } catch (BadResponseException $e) { + $response = $e->getResponse(); + } + + $parsed = $this->parseResponse($response); + + $this->checkResponse($response, $parsed); + + return $parsed; + } + + /** + * Attempts to parse a JSON response. + * + * @param string $content JSON content from response body + * @return array Parsed JSON data + * @throws UnexpectedValueException if the content could not be parsed + */ + protected function parseJson($content) + { + $content = json_decode($content, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new UnexpectedValueException(sprintf( + "Failed to parse JSON response: %s", + json_last_error_msg() + )); + } + + return $content; + } + + /** + * Returns the content type header of a response. + * + * @param ResponseInterface $response + * @return string Semi-colon separated join of content-type headers. + */ + protected function getContentType(ResponseInterface $response) + { + return join(';', (array) $response->getHeader('content-type')); + } + + /** + * Parses the response according to its content-type header. + * + * @throws UnexpectedValueException + * @param ResponseInterface $response + * @return array + */ + protected function parseResponse(ResponseInterface $response) + { + $content = (string) $response->getBody(); + $type = $this->getContentType($response); + + if (strpos($type, 'urlencoded') !== false) { + parse_str($content, $parsed); + return $parsed; + } + + // Attempt to parse the string as JSON regardless of content type, + // since some providers use non-standard content types. Only throw an + // exception if the JSON could not be parsed when it was expected to. + try { + return $this->parseJson($content); + } catch (UnexpectedValueException $e) { + if (strpos($type, 'json') !== false) { + throw $e; + } + + if ($response->getStatusCode() == 500) { + throw new UnexpectedValueException( + 'An OAuth server error was encountered that did not contain a JSON body', + 0, + $e + ); + } + + return $content; + } + } + + /** + * Checks a provider response for errors. + * + * @throws IdentityProviderException + * @param ResponseInterface $response + * @param array|string $data Parsed response data + * @return void + */ + abstract protected function checkResponse(ResponseInterface $response, $data); + + /** + * Prepares an parsed access token response for a grant. + * + * Custom mapping of expiration, etc should be done here. Always call the + * parent method when overloading this method. + * + * @param mixed $result + * @return array + */ + protected function prepareAccessTokenResponse(array $result) + { + if ($this->getAccessTokenResourceOwnerId() !== null) { + $result['resource_owner_id'] = $this->getValueByKey( + $result, + $this->getAccessTokenResourceOwnerId() + ); + } + return $result; + } + + /** + * Creates an access token from a response. + * + * The grant that was used to fetch the response can be used to provide + * additional context. + * + * @param array $response + * @param AbstractGrant $grant + * @return AccessTokenInterface + */ + protected function createAccessToken(array $response, AbstractGrant $grant) + { + return new AccessToken($response); + } + + /** + * Generates a resource owner object from a successful resource owner + * details request. + * + * @param array $response + * @param AccessToken $token + * @return ResourceOwnerInterface + */ + abstract protected function createResourceOwner(array $response, AccessToken $token); + + /** + * Requests and returns the resource owner of given access token. + * + * @param AccessToken $token + * @return ResourceOwnerInterface + */ + public function getResourceOwner(AccessToken $token) + { + $response = $this->fetchResourceOwnerDetails($token); + + return $this->createResourceOwner($response, $token); + } + + /** + * Requests resource owner details. + * + * @param AccessToken $token + * @return mixed + */ + protected function fetchResourceOwnerDetails(AccessToken $token) + { + $url = $this->getResourceOwnerDetailsUrl($token); + + $request = $this->getAuthenticatedRequest(self::METHOD_GET, $url, $token); + + $response = $this->getParsedResponse($request); + + if (false === is_array($response)) { + throw new UnexpectedValueException( + 'Invalid response received from Authorization Server. Expected JSON.' + ); + } + + return $response; + } + + /** + * Returns the default headers used by this provider. + * + * Typically this is used to set 'Accept' or 'Content-Type' headers. + * + * @return array + */ + protected function getDefaultHeaders() + { + return []; + } + + /** + * Returns the authorization headers used by this provider. + * + * Typically this is "Bearer" or "MAC". For more information see: + * http://tools.ietf.org/html/rfc6749#section-7.1 + * + * No default is provided, providers must overload this method to activate + * authorization headers. + * + * @param mixed|null $token Either a string or an access token instance + * @return array + */ + protected function getAuthorizationHeaders($token = null) + { + return []; + } + + /** + * Returns all headers used by this provider for a request. + * + * The request will be authenticated if an access token is provided. + * + * @param mixed|null $token object or string + * @return array + */ + public function getHeaders($token = null) + { + if ($token) { + return array_merge( + $this->getDefaultHeaders(), + $this->getAuthorizationHeaders($token) + ); + } + + return $this->getDefaultHeaders(); + } +} diff --git a/vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php b/vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php new file mode 100644 index 00000000..52b7e035 --- /dev/null +++ b/vendor/league/oauth2-client/src/Provider/Exception/IdentityProviderException.php @@ -0,0 +1,48 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Provider\Exception; + +/** + * Exception thrown if the provider response contains errors. + */ +class IdentityProviderException extends \Exception +{ + /** + * @var mixed + */ + protected $response; + + /** + * @param string $message + * @param int $code + * @param array|string $response The response body + */ + public function __construct($message, $code, $response) + { + $this->response = $response; + + parent::__construct($message, $code); + } + + /** + * Returns the exception's response body. + * + * @return array|string + */ + public function getResponseBody() + { + return $this->response; + } +} diff --git a/vendor/league/oauth2-client/src/Provider/GenericProvider.php b/vendor/league/oauth2-client/src/Provider/GenericProvider.php new file mode 100644 index 00000000..74393ffd --- /dev/null +++ b/vendor/league/oauth2-client/src/Provider/GenericProvider.php @@ -0,0 +1,233 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Provider; + +use InvalidArgumentException; +use League\OAuth2\Client\Provider\Exception\IdentityProviderException; +use League\OAuth2\Client\Token\AccessToken; +use League\OAuth2\Client\Tool\BearerAuthorizationTrait; +use Psr\Http\Message\ResponseInterface; + +/** + * Represents a generic service provider that may be used to interact with any + * OAuth 2.0 service provider, using Bearer token authentication. + */ +class GenericProvider extends AbstractProvider +{ + use BearerAuthorizationTrait; + + /** + * @var string + */ + private $urlAuthorize; + + /** + * @var string + */ + private $urlAccessToken; + + /** + * @var string + */ + private $urlResourceOwnerDetails; + + /** + * @var string + */ + private $accessTokenMethod; + + /** + * @var string + */ + private $accessTokenResourceOwnerId; + + /** + * @var array|null + */ + private $scopes = null; + + /** + * @var string + */ + private $scopeSeparator; + + /** + * @var string + */ + private $responseError = 'error'; + + /** + * @var string + */ + private $responseCode; + + /** + * @var string + */ + private $responseResourceOwnerId = 'id'; + + /** + * @param array $options + * @param array $collaborators + */ + public function __construct(array $options = [], array $collaborators = []) + { + $this->assertRequiredOptions($options); + + $possible = $this->getConfigurableOptions(); + $configured = array_intersect_key($options, array_flip($possible)); + + foreach ($configured as $key => $value) { + $this->$key = $value; + } + + // Remove all options that are only used locally + $options = array_diff_key($options, $configured); + + parent::__construct($options, $collaborators); + } + + /** + * Returns all options that can be configured. + * + * @return array + */ + protected function getConfigurableOptions() + { + return array_merge($this->getRequiredOptions(), [ + 'accessTokenMethod', + 'accessTokenResourceOwnerId', + 'scopeSeparator', + 'responseError', + 'responseCode', + 'responseResourceOwnerId', + 'scopes', + ]); + } + + /** + * Returns all options that are required. + * + * @return array + */ + protected function getRequiredOptions() + { + return [ + 'urlAuthorize', + 'urlAccessToken', + 'urlResourceOwnerDetails', + ]; + } + + /** + * Verifies that all required options have been passed. + * + * @param array $options + * @return void + * @throws InvalidArgumentException + */ + private function assertRequiredOptions(array $options) + { + $missing = array_diff_key(array_flip($this->getRequiredOptions()), $options); + + if (!empty($missing)) { + throw new InvalidArgumentException( + 'Required options not defined: ' . implode(', ', array_keys($missing)) + ); + } + } + + /** + * @inheritdoc + */ + public function getBaseAuthorizationUrl() + { + return $this->urlAuthorize; + } + + /** + * @inheritdoc + */ + public function getBaseAccessTokenUrl(array $params) + { + return $this->urlAccessToken; + } + + /** + * @inheritdoc + */ + public function getResourceOwnerDetailsUrl(AccessToken $token) + { + return $this->urlResourceOwnerDetails; + } + + /** + * @inheritdoc + */ + public function getDefaultScopes() + { + return $this->scopes; + } + + /** + * @inheritdoc + */ + protected function getAccessTokenMethod() + { + return $this->accessTokenMethod ?: parent::getAccessTokenMethod(); + } + + /** + * @inheritdoc + */ + protected function getAccessTokenResourceOwnerId() + { + return $this->accessTokenResourceOwnerId ?: parent::getAccessTokenResourceOwnerId(); + } + + /** + * @inheritdoc + */ + protected function getScopeSeparator() + { + return $this->scopeSeparator ?: parent::getScopeSeparator(); + } + + /** + * @inheritdoc + */ + protected function checkResponse(ResponseInterface $response, $data) + { + if (!empty($data[$this->responseError])) { + $error = $data[$this->responseError]; + if (!is_string($error)) { + $error = var_export($error, true); + } + $code = $this->responseCode && !empty($data[$this->responseCode])? $data[$this->responseCode] : 0; + if (!is_int($code)) { + $code = intval($code); + } + throw new IdentityProviderException($error, $code, $data); + } + } + + /** + * @inheritdoc + */ + protected function createResourceOwner(array $response, AccessToken $token) + { + return new GenericResourceOwner($response, $this->responseResourceOwnerId); + } +} diff --git a/vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php b/vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php new file mode 100644 index 00000000..f8766148 --- /dev/null +++ b/vendor/league/oauth2-client/src/Provider/GenericResourceOwner.php @@ -0,0 +1,61 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Provider; + +/** + * Represents a generic resource owner for use with the GenericProvider. + */ +class GenericResourceOwner implements ResourceOwnerInterface +{ + /** + * @var array + */ + protected $response; + + /** + * @var string + */ + protected $resourceOwnerId; + + /** + * @param array $response + * @param string $resourceOwnerId + */ + public function __construct(array $response, $resourceOwnerId) + { + $this->response = $response; + $this->resourceOwnerId = $resourceOwnerId; + } + + /** + * Returns the identifier of the authorized resource owner. + * + * @return mixed + */ + public function getId() + { + return $this->response[$this->resourceOwnerId]; + } + + /** + * Returns the raw resource owner response. + * + * @return array + */ + public function toArray() + { + return $this->response; + } +} diff --git a/vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php b/vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php new file mode 100644 index 00000000..82844242 --- /dev/null +++ b/vendor/league/oauth2-client/src/Provider/ResourceOwnerInterface.php @@ -0,0 +1,36 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Provider; + +/** + * Classes implementing `ResourceOwnerInterface` may be used to represent + * the resource owner authenticated with a service provider. + */ +interface ResourceOwnerInterface +{ + /** + * Returns the identifier of the authorized resource owner. + * + * @return mixed + */ + public function getId(); + + /** + * Return all of the owner details available as an array. + * + * @return array + */ + public function toArray(); +} diff --git a/vendor/league/oauth2-client/src/Token/AccessToken.php b/vendor/league/oauth2-client/src/Token/AccessToken.php new file mode 100644 index 00000000..81533c30 --- /dev/null +++ b/vendor/league/oauth2-client/src/Token/AccessToken.php @@ -0,0 +1,243 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Token; + +use InvalidArgumentException; +use RuntimeException; + +/** + * Represents an access token. + * + * @link http://tools.ietf.org/html/rfc6749#section-1.4 Access Token (RFC 6749, §1.4) + */ +class AccessToken implements AccessTokenInterface, ResourceOwnerAccessTokenInterface +{ + /** + * @var string + */ + protected $accessToken; + + /** + * @var int + */ + protected $expires; + + /** + * @var string + */ + protected $refreshToken; + + /** + * @var string + */ + protected $resourceOwnerId; + + /** + * @var array + */ + protected $values = []; + + /** + * @var int + */ + private static $timeNow; + + /** + * Set the time now. This should only be used for testing purposes. + * + * @param int $timeNow the time in seconds since epoch + * @return void + */ + public static function setTimeNow($timeNow) + { + self::$timeNow = $timeNow; + } + + /** + * Reset the time now if it was set for test purposes. + * + * @return void + */ + public static function resetTimeNow() + { + self::$timeNow = null; + } + + /** + * @return int + */ + public function getTimeNow() + { + return self::$timeNow ? self::$timeNow : time(); + } + + /** + * Constructs an access token. + * + * @param array $options An array of options returned by the service provider + * in the access token request. The `access_token` option is required. + * @throws InvalidArgumentException if `access_token` is not provided in `$options`. + */ + public function __construct(array $options = []) + { + if (empty($options['access_token'])) { + throw new InvalidArgumentException('Required option not passed: "access_token"'); + } + + $this->accessToken = $options['access_token']; + + if (!empty($options['resource_owner_id'])) { + $this->resourceOwnerId = $options['resource_owner_id']; + } + + if (!empty($options['refresh_token'])) { + $this->refreshToken = $options['refresh_token']; + } + + // We need to know when the token expires. Show preference to + // 'expires_in' since it is defined in RFC6749 Section 5.1. + // Defer to 'expires' if it is provided instead. + if (isset($options['expires_in'])) { + if (!is_numeric($options['expires_in'])) { + throw new \InvalidArgumentException('expires_in value must be an integer'); + } + + $this->expires = $options['expires_in'] != 0 ? $this->getTimeNow() + $options['expires_in'] : 0; + } elseif (!empty($options['expires'])) { + // Some providers supply the seconds until expiration rather than + // the exact timestamp. Take a best guess at which we received. + $expires = $options['expires']; + + if (!$this->isExpirationTimestamp($expires)) { + $expires += $this->getTimeNow(); + } + + $this->expires = $expires; + } + + // Capture any additional values that might exist in the token but are + // not part of the standard response. Vendors will sometimes pass + // additional user data this way. + $this->values = array_diff_key($options, array_flip([ + 'access_token', + 'resource_owner_id', + 'refresh_token', + 'expires_in', + 'expires', + ])); + } + + /** + * Check if a value is an expiration timestamp or second value. + * + * @param integer $value + * @return bool + */ + protected function isExpirationTimestamp($value) + { + // If the given value is larger than the original OAuth 2 draft date, + // assume that it is meant to be a (possible expired) timestamp. + $oauth2InceptionDate = 1349067600; // 2012-10-01 + return ($value > $oauth2InceptionDate); + } + + /** + * @inheritdoc + */ + public function getToken() + { + return $this->accessToken; + } + + /** + * @inheritdoc + */ + public function getRefreshToken() + { + return $this->refreshToken; + } + + /** + * @inheritdoc + */ + public function getExpires() + { + return $this->expires; + } + + /** + * @inheritdoc + */ + public function getResourceOwnerId() + { + return $this->resourceOwnerId; + } + + /** + * @inheritdoc + */ + public function hasExpired() + { + $expires = $this->getExpires(); + + if (empty($expires)) { + throw new RuntimeException('"expires" is not set on the token'); + } + + return $expires < time(); + } + + /** + * @inheritdoc + */ + public function getValues() + { + return $this->values; + } + + /** + * @inheritdoc + */ + public function __toString() + { + return (string) $this->getToken(); + } + + /** + * @inheritdoc + */ + public function jsonSerialize() + { + $parameters = $this->values; + + if ($this->accessToken) { + $parameters['access_token'] = $this->accessToken; + } + + if ($this->refreshToken) { + $parameters['refresh_token'] = $this->refreshToken; + } + + if ($this->expires) { + $parameters['expires'] = $this->expires; + } + + if ($this->resourceOwnerId) { + $parameters['resource_owner_id'] = $this->resourceOwnerId; + } + + return $parameters; + } +} diff --git a/vendor/league/oauth2-client/src/Token/AccessTokenInterface.php b/vendor/league/oauth2-client/src/Token/AccessTokenInterface.php new file mode 100644 index 00000000..c5f13350 --- /dev/null +++ b/vendor/league/oauth2-client/src/Token/AccessTokenInterface.php @@ -0,0 +1,72 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Token; + +use JsonSerializable; +use RuntimeException; + +interface AccessTokenInterface extends JsonSerializable +{ + /** + * Returns the access token string of this instance. + * + * @return string + */ + public function getToken(); + + /** + * Returns the refresh token, if defined. + * + * @return string|null + */ + public function getRefreshToken(); + + /** + * Returns the expiration timestamp in seconds, if defined. + * + * @return integer|null + */ + public function getExpires(); + + /** + * Checks if this token has expired. + * + * @return boolean true if the token has expired, false otherwise. + * @throws RuntimeException if 'expires' is not set on the token. + */ + public function hasExpired(); + + /** + * Returns additional vendor values stored in the token. + * + * @return array + */ + public function getValues(); + + /** + * Returns a string representation of the access token + * + * @return string + */ + public function __toString(); + + /** + * Returns an array of parameters to serialize when this is serialized with + * json_encode(). + * + * @return array + */ + public function jsonSerialize(); +} diff --git a/vendor/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php b/vendor/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php new file mode 100644 index 00000000..51e4ce41 --- /dev/null +++ b/vendor/league/oauth2-client/src/Token/ResourceOwnerAccessTokenInterface.php @@ -0,0 +1,25 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Token; + +interface ResourceOwnerAccessTokenInterface extends AccessTokenInterface +{ + /** + * Returns the resource owner identifier, if defined. + * + * @return string|null + */ + public function getResourceOwnerId(); +} diff --git a/vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php b/vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php new file mode 100644 index 00000000..a18198cf --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/ArrayAccessorTrait.php @@ -0,0 +1,52 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +/** + * Provides generic array navigation tools. + */ +trait ArrayAccessorTrait +{ + /** + * Returns a value by key using dot notation. + * + * @param array $data + * @param string $key + * @param mixed|null $default + * @return mixed + */ + private function getValueByKey(array $data, $key, $default = null) + { + if (!is_string($key) || empty($key) || !count($data)) { + return $default; + } + + if (strpos($key, '.') !== false) { + $keys = explode('.', $key); + + foreach ($keys as $innerKey) { + if (!is_array($data) || !array_key_exists($innerKey, $data)) { + return $default; + } + + $data = $data[$innerKey]; + } + + return $data; + } + + return array_key_exists($key, $data) ? $data[$key] : $default; + } +} diff --git a/vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php b/vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php new file mode 100644 index 00000000..081c7c86 --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/BearerAuthorizationTrait.php @@ -0,0 +1,36 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +use League\OAuth2\Client\Token\AccessTokenInterface; + +/** + * Enables `Bearer` header authorization for providers. + * + * @link http://tools.ietf.org/html/rfc6750 Bearer Token Usage (RFC 6750) + */ +trait BearerAuthorizationTrait +{ + /** + * Returns authorization headers for the 'bearer' grant. + * + * @param AccessTokenInterface|string|null $token Either a string or an access token instance + * @return array + */ + protected function getAuthorizationHeaders($token = null) + { + return ['Authorization' => 'Bearer ' . $token]; + } +} diff --git a/vendor/league/oauth2-client/src/Tool/GuardedPropertyTrait.php b/vendor/league/oauth2-client/src/Tool/GuardedPropertyTrait.php new file mode 100644 index 00000000..02c9ba5f --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/GuardedPropertyTrait.php @@ -0,0 +1,70 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +/** + * Provides support for blacklisting explicit properties from the + * mass assignment behavior. + */ +trait GuardedPropertyTrait +{ + /** + * The properties that aren't mass assignable. + * + * @var array + */ + protected $guarded = []; + + /** + * Attempts to mass assign the given options to explicitly defined properties, + * skipping over any properties that are defined in the guarded array. + * + * @param array $options + * @return mixed + */ + protected function fillProperties(array $options = []) + { + if (isset($options['guarded'])) { + unset($options['guarded']); + } + + foreach ($options as $option => $value) { + if (property_exists($this, $option) && !$this->isGuarded($option)) { + $this->{$option} = $value; + } + } + } + + /** + * Returns current guarded properties. + * + * @return array + */ + public function getGuarded() + { + return $this->guarded; + } + + /** + * Determines if the given property is guarded. + * + * @param string $property + * @return bool + */ + public function isGuarded($property) + { + return in_array($property, $this->getGuarded()); + } +} diff --git a/vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php b/vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php new file mode 100644 index 00000000..f8dcd77c --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/MacAuthorizationTrait.php @@ -0,0 +1,83 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +use League\OAuth2\Client\Token\AccessToken; +use League\OAuth2\Client\Token\AccessTokenInterface; + +/** + * Enables `MAC` header authorization for providers. + * + * @link http://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac-05 Message Authentication Code (MAC) Tokens + */ +trait MacAuthorizationTrait +{ + /** + * Returns the id of this token for MAC generation. + * + * @param AccessToken $token + * @return string + */ + abstract protected function getTokenId(AccessToken $token); + + /** + * Returns the MAC signature for the current request. + * + * @param string $id + * @param integer $ts + * @param string $nonce + * @return string + */ + abstract protected function getMacSignature($id, $ts, $nonce); + + /** + * Returns a new random string to use as the state parameter in an + * authorization flow. + * + * @param int $length Length of the random string to be generated. + * @return string + */ + abstract protected function getRandomState($length = 32); + + /** + * Returns the authorization headers for the 'mac' grant. + * + * @param AccessTokenInterface|string|null $token Either a string or an access token instance + * @return array + * @codeCoverageIgnore + * + * @todo This is currently untested and provided only as an example. If you + * complete the implementation, please create a pull request for + * https://github.com/thephpleague/oauth2-client + */ + protected function getAuthorizationHeaders($token = null) + { + if ($token === null) { + return []; + } + + $ts = time(); + $id = $this->getTokenId($token); + $nonce = $this->getRandomState(16); + $mac = $this->getMacSignature($id, $ts, $nonce); + + $parts = []; + foreach (compact('id', 'ts', 'nonce', 'mac') as $key => $value) { + $parts[] = sprintf('%s="%s"', $key, $value); + } + + return ['Authorization' => 'MAC ' . implode(', ', $parts)]; + } +} diff --git a/vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php b/vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php new file mode 100644 index 00000000..f81b511f --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/ProviderRedirectTrait.php @@ -0,0 +1,122 @@ +redirectLimit) { + $attempts++; + $response = $this->getHttpClient()->send($request, [ + 'allow_redirects' => false + ]); + + if ($this->isRedirect($response)) { + $redirectUrl = new Uri($response->getHeader('Location')[0]); + $request = $request->withUri($redirectUrl); + } else { + break; + } + } + + return $response; + } + + /** + * Returns the HTTP client instance. + * + * @return GuzzleHttp\ClientInterface + */ + abstract public function getHttpClient(); + + /** + * Retrieves current redirect limit. + * + * @return integer + */ + public function getRedirectLimit() + { + return $this->redirectLimit; + } + + /** + * Determines if a given response is a redirect. + * + * @param ResponseInterface $response + * + * @return boolean + */ + protected function isRedirect(ResponseInterface $response) + { + $statusCode = $response->getStatusCode(); + + return $statusCode > 300 && $statusCode < 400 && $response->hasHeader('Location'); + } + + /** + * Sends a request instance and returns a response instance. + * + * WARNING: This method does not attempt to catch exceptions caused by HTTP + * errors! It is recommended to wrap this method in a try/catch block. + * + * @param RequestInterface $request + * @return ResponseInterface + */ + public function getResponse(RequestInterface $request) + { + try { + $response = $this->followRequestRedirects($request); + } catch (BadResponseException $e) { + $response = $e->getResponse(); + } + + return $response; + } + + /** + * Updates the redirect limit. + * + * @param integer $limit + * @return League\OAuth2\Client\Provider\AbstractProvider + * @throws InvalidArgumentException + */ + public function setRedirectLimit($limit) + { + if (!is_int($limit)) { + throw new InvalidArgumentException('redirectLimit must be an integer.'); + } + + if ($limit < 1) { + throw new InvalidArgumentException('redirectLimit must be greater than or equal to one.'); + } + + $this->redirectLimit = $limit; + + return $this; + } +} diff --git a/vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php b/vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php new file mode 100644 index 00000000..ebccdffc --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/QueryBuilderTrait.php @@ -0,0 +1,33 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +/** + * Provides a standard way to generate query strings. + */ +trait QueryBuilderTrait +{ + /** + * Build a query string from an array. + * + * @param array $params + * + * @return string + */ + protected function buildQueryString(array $params) + { + return http_build_query($params, null, '&', \PHP_QUERY_RFC3986); + } +} diff --git a/vendor/league/oauth2-client/src/Tool/RequestFactory.php b/vendor/league/oauth2-client/src/Tool/RequestFactory.php new file mode 100644 index 00000000..1af43429 --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/RequestFactory.php @@ -0,0 +1,87 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +use GuzzleHttp\Psr7\Request; + +/** + * Used to produce PSR-7 Request instances. + * + * @link https://github.com/guzzle/guzzle/pull/1101 + */ +class RequestFactory +{ + /** + * Creates a PSR-7 Request instance. + * + * @param null|string $method HTTP method for the request. + * @param null|string $uri URI for the request. + * @param array $headers Headers for the message. + * @param string|resource|StreamInterface $body Message body. + * @param string $version HTTP protocol version. + * + * @return Request + */ + public function getRequest( + $method, + $uri, + array $headers = [], + $body = null, + $version = '1.1' + ) { + return new Request($method, $uri, $headers, $body, $version); + } + + /** + * Parses simplified options. + * + * @param array $options Simplified options. + * + * @return array Extended options for use with getRequest. + */ + protected function parseOptions(array $options) + { + // Should match default values for getRequest + $defaults = [ + 'headers' => [], + 'body' => null, + 'version' => '1.1', + ]; + + return array_merge($defaults, $options); + } + + /** + * Creates a request using a simplified array of options. + * + * @param null|string $method + * @param null|string $uri + * @param array $options + * + * @return Request + */ + public function getRequestWithOptions($method, $uri, array $options = []) + { + $options = $this->parseOptions($options); + + return $this->getRequest( + $method, + $uri, + $options['headers'], + $options['body'], + $options['version'] + ); + } +} diff --git a/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php b/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php new file mode 100644 index 00000000..47da9771 --- /dev/null +++ b/vendor/league/oauth2-client/src/Tool/RequiredParameterTrait.php @@ -0,0 +1,56 @@ + + * @license http://opensource.org/licenses/MIT MIT + * @link http://thephpleague.com/oauth2-client/ Documentation + * @link https://packagist.org/packages/league/oauth2-client Packagist + * @link https://github.com/thephpleague/oauth2-client GitHub + */ + +namespace League\OAuth2\Client\Tool; + +use BadMethodCallException; + +/** + * Provides functionality to check for required parameters. + */ +trait RequiredParameterTrait +{ + /** + * Checks for a required parameter in a hash. + * + * @throws BadMethodCallException + * @param string $name + * @param array $params + * @return void + */ + private function checkRequiredParameter($name, array $params) + { + if (!isset($params[$name])) { + throw new BadMethodCallException(sprintf( + 'Required parameter not passed: "%s"', + $name + )); + } + } + + /** + * Checks for multiple required parameters in a hash. + * + * @throws InvalidArgumentException + * @param array $names + * @param array $params + * @return void + */ + private function checkRequiredParameters(array $names, array $params) + { + foreach ($names as $name) { + $this->checkRequiredParameter($name, $params); + } + } +} diff --git a/vendor/league/oauth2-facebook/LICENSE b/vendor/league/oauth2-facebook/LICENSE new file mode 100755 index 00000000..dd7005d9 --- /dev/null +++ b/vendor/league/oauth2-facebook/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Sammy Kaye Powers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/league/oauth2-facebook/composer.json b/vendor/league/oauth2-facebook/composer.json new file mode 100755 index 00000000..816b678f --- /dev/null +++ b/vendor/league/oauth2-facebook/composer.json @@ -0,0 +1,40 @@ +{ + "name": "league/oauth2-facebook", + "description": "Facebook OAuth 2.0 Client Provider for The PHP League OAuth2-Client", + "license": "MIT", + "authors": [ + { + "name": "Sammy Kaye Powers", + "email": "me@sammyk.me", + "homepage": "http://www.sammyk.me" + } + ], + "keywords": [ + "oauth", + "oauth2", + "client", + "authorization", + "authentication", + "facebook" + ], + "require": { + "php": "^5.6 || ^7.0", + "league/oauth2-client": "^2.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^5.7|^6.0", + "mockery/mockery": "~1.3.0", + "squizlabs/php_codesniffer": "~3.0" + }, + "autoload": { + "psr-4": { + "League\\OAuth2\\Client\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "League\\OAuth2\\Client\\Test\\": "tests/src/" + } + } +} diff --git a/vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php b/vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php new file mode 100644 index 00000000..aa064908 --- /dev/null +++ b/vendor/league/oauth2-facebook/src/Grant/FbExchangeToken.php @@ -0,0 +1,23 @@ +graphApiVersion = $options['graphApiVersion']; + + if (!empty($options['enableBetaTier']) && $options['enableBetaTier'] === true) { + $this->enableBetaMode = true; + } + } + + public function getBaseAuthorizationUrl() + { + return $this->getBaseFacebookUrl().$this->graphApiVersion.'/dialog/oauth'; + } + + public function getBaseAccessTokenUrl(array $params) + { + return $this->getBaseGraphUrl().$this->graphApiVersion.'/oauth/access_token'; + } + + public function getDefaultScopes() + { + return ['public_profile', 'email']; + } + + public function getResourceOwnerDetailsUrl(AccessToken $token) + { + $fields = [ + 'id', 'name', 'first_name', 'last_name', + 'email', 'hometown', 'picture.type(large){url,is_silhouette}', + 'gender', 'age_range' + ]; + + // backwards compatibility less than 2.8 + if (version_compare(substr($this->graphApiVersion, 1), '2.8') < 0) { + $fields[] = 'bio'; + } + + $appSecretProof = AppSecretProof::create($this->clientSecret, $token->getToken()); + + return $this->getBaseGraphUrl().$this->graphApiVersion.'/me?fields='.implode(',', $fields) + .'&access_token='.$token.'&appsecret_proof='.$appSecretProof; + } + + public function getAccessToken($grant = 'authorization_code', array $params = []) + { + if (isset($params['refresh_token'])) { + throw new FacebookProviderException('Facebook does not support token refreshing.'); + } + + return parent::getAccessToken($grant, $params); + } + + /** + * Exchanges a short-lived access token with a long-lived access-token. + * + * @param string $accessToken + * + * @return \League\OAuth2\Client\Token\AccessToken + * + * @throws FacebookProviderException + */ + public function getLongLivedAccessToken($accessToken) + { + $params = [ + 'fb_exchange_token' => (string) $accessToken, + ]; + + return $this->getAccessToken('fb_exchange_token', $params); + } + + protected function createResourceOwner(array $response, AccessToken $token) + { + return new FacebookUser($response); + } + + protected function checkResponse(ResponseInterface $response, $data) + { + if (!empty($data['error'])) { + $message = $data['error']['type'].': '.$data['error']['message']; + throw new IdentityProviderException($message, $data['error']['code'], $data); + } + } + + /** + * @inheritdoc + */ + protected function getContentType(ResponseInterface $response) + { + $type = parent::getContentType($response); + + // Fix for Facebook's pseudo-JSONP support + if (strpos($type, 'javascript') !== false) { + return 'application/json'; + } + + // Fix for Facebook's pseudo-urlencoded support + if (strpos($type, 'plain') !== false) { + return 'application/x-www-form-urlencoded'; + } + + return $type; + } + + /** + * Get the base Facebook URL. + * + * @return string + */ + private function getBaseFacebookUrl() + { + return $this->enableBetaMode ? static::BASE_FACEBOOK_URL_BETA : static::BASE_FACEBOOK_URL; + } + + /** + * Get the base Graph API URL. + * + * @return string + */ + private function getBaseGraphUrl() + { + return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL; + } +} diff --git a/vendor/league/oauth2-facebook/src/Provider/FacebookUser.php b/vendor/league/oauth2-facebook/src/Provider/FacebookUser.php new file mode 100755 index 00000000..0798ee50 --- /dev/null +++ b/vendor/league/oauth2-facebook/src/Provider/FacebookUser.php @@ -0,0 +1,224 @@ +data = $response; + + if (!empty($response['picture']['data']['url'])) { + $this->data['picture_url'] = $response['picture']['data']['url']; + } + + if (isset($response['picture']['data']['is_silhouette'])) { + $this->data['is_silhouette'] = $response['picture']['data']['is_silhouette']; + } + + if (!empty($response['cover']['source'])) { + $this->data['cover_photo_url'] = $response['cover']['source']; + } + } + + /** + * Returns the ID for the user as a string if present. + * + * @return string|null + */ + public function getId() + { + return $this->getField('id'); + } + + /** + * Returns the name for the user as a string if present. + * + * @return string|null + */ + public function getName() + { + return $this->getField('name'); + } + + /** + * Returns the first name for the user as a string if present. + * + * @return string|null + */ + public function getFirstName() + { + return $this->getField('first_name'); + } + + /** + * Returns the last name for the user as a string if present. + * + * @return string|null + */ + public function getLastName() + { + return $this->getField('last_name'); + } + + /** + * Returns the email for the user as a string if present. + * + * @return string|null + */ + public function getEmail() + { + return $this->getField('email'); + } + + /** + * Returns the current location of the user as an array. + * + * @return array|null + */ + public function getHometown() + { + return $this->getField('hometown'); + } + + /** + * Returns the "about me" bio for the user as a string if present. + * + * @return string|null + * @deprecated The bio field was removed in Graph v2.8 + */ + public function getBio() + { + return $this->getField('bio'); + } + + /** + * Returns if user has not defined a specific avatar + * + * @return boolean + */ + + public function isDefaultPicture() + { + return $this->getField('is_silhouette'); + } + + /** + * Returns the profile picture of the user as a string if present. + * + * @return string|null + */ + public function getPictureUrl() + { + return $this->getField('picture_url'); + } + + /** + * Returns the cover photo URL of the user as a string if present. + * + * @return string|null + * @deprecated + */ + public function getCoverPhotoUrl() + { + return $this->getField('cover_photo_url'); + } + + /** + * Returns the gender for the user as a string if present. + * + * @return string|null + */ + public function getGender() + { + return $this->getField('gender'); + } + + /** + * Returns the locale of the user as a string if available. + * + * @return string|null + * @deprecated + */ + public function getLocale() + { + return $this->getField('locale'); + } + + /** + * Returns the Facebook URL for the user as a string if available. + * + * @return string|null + */ + public function getLink() + { + return $this->getField('link'); + } + + /** + * Returns the current timezone offset from UTC (from -24 to 24) + * + * @return float|null + * @deprecated + */ + public function getTimezone() + { + return $this->getField('timezone'); + } + + /** + * Returns the lower bound of the user's age range + * + * @return integer|null + */ + public function getMinAge() + { + if (isset($this->data['age_range']['min'])) { + return $this->data['age_range']['min']; + } + return null; + } + + /** + * Returns the upper bound of the user's age range + * + * @return integer|null + */ + public function getMaxAge() + { + if (isset($this->data['age_range']['max'])) { + return $this->data['age_range']['max']; + } + return null; + } + + /** + * Returns all the data obtained about the user. + * + * @return array + */ + public function toArray() + { + return $this->data; + } + + /** + * Returns a field from the Graph node data. + * + * @param string $key + * + * @return mixed|null + */ + private function getField($key) + { + return isset($this->data[$key]) ? $this->data[$key] : null; + } +} diff --git a/vendor/monolog/monolog/.php_cs b/vendor/monolog/monolog/.php_cs deleted file mode 100644 index 366ccd08..00000000 --- a/vendor/monolog/monolog/.php_cs +++ /dev/null @@ -1,59 +0,0 @@ - - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -$finder = Symfony\CS\Finder::create() - ->files() - ->name('*.php') - ->exclude('Fixtures') - ->in(__DIR__.'/src') - ->in(__DIR__.'/tests') -; - -return Symfony\CS\Config::create() - ->setUsingCache(true) - //->setUsingLinter(false) - ->setRiskyAllowed(true) - ->setRules(array( - '@PSR2' => true, - 'binary_operator_spaces' => true, - 'blank_line_before_return' => true, - 'header_comment' => array('header' => $header), - 'include' => true, - 'long_array_syntax' => true, - 'method_separation' => true, - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_blank_lines_between_uses' => true, - 'no_duplicate_semicolons' => true, - 'no_extra_consecutive_blank_lines' => true, - 'no_leading_import_slash' => true, - 'no_leading_namespace_whitespace' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_unused_imports' => true, - 'object_operator_without_whitespace' => true, - 'phpdoc_align' => true, - 'phpdoc_indent' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_package' => true, - 'phpdoc_order' => true, - 'phpdoc_scalar' => true, - 'phpdoc_trim' => true, - 'phpdoc_type_to_var' => true, - 'psr0' => true, - 'single_blank_line_before_namespace' => true, - 'spaces_cast' => true, - 'standardize_not_equals' => true, - 'ternary_operator_spaces' => true, - 'trailing_comma_in_multiline_array' => true, - 'whitespacy_lines' => true, - )) - ->finder($finder) -; diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md index cd1142d1..757643df 100644 --- a/vendor/monolog/monolog/CHANGELOG.md +++ b/vendor/monolog/monolog/CHANGELOG.md @@ -1,3 +1,76 @@ +### 1.25.5 (2020-07-23) + + * Fixed array access on null in RavenHandler + * Fixed unique_id in WebProcessor not being disableable + +### 1.25.4 (2020-05-22) + + * Fixed GitProcessor type error when there is no git repo present + * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" + * Fixed support for relative paths in RotatingFileHandler + +### 1.25.3 (2019-12-20) + + * Fixed formatting of resources in JsonFormatter + * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) + * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it + * Fixed Turkish locale messing up the conversion of level names to their constant values + +### 1.25.2 (2019-11-13) + + * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable + * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler + * Fixed BrowserConsoleHandler formatting when using multiple styles + * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings + * Fixed normalization of SoapFault objects containing non-strings as "detail" + * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding + +### 1.25.1 (2019-09-06) + + * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too. + +### 1.25.0 (2019-09-06) + + * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead + * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead + * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead + * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though. + * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler + * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records + * Fixed issue in SignalHandler restarting syscalls functionality + * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases + * Fixed ZendMonitorHandler to work with the latest Zend Server versions + * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). + +### 1.24.0 (2018-11-05) + + * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings. + * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors + * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers) + * Added a way to log signals being received using Monolog\SignalHandler + * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler + * Added InsightOpsHandler to migrate users of the LogEntriesHandler + * Added protection to NormalizerHandler against circular and very deep structures, it now stops normalizing at a depth of 9 + * Added capture of stack traces to ErrorHandler when logging PHP errors + * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts + * Added forwarding of context info to FluentdFormatter + * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example + * Added ability to extend/override BrowserConsoleHandler + * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility + * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility + * Dropped official support for HHVM in test builds + * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain + * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases + * Fixed HipChatHandler bug where slack dropped messages randomly + * Fixed normalization of objects in Slack handlers + * Fixed support for PHP7's Throwable in NewRelicHandler + * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory + * Fixed table row styling issues in HtmlFormatter + * Fixed RavenHandler dropping the message when logging exception + * Fixed WhatFailureGroupHandler skipping processors when using handleBatch + and implement it where possible + * Fixed display of anonymous class names + ### 1.23.0 (2017-06-19) * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument diff --git a/vendor/monolog/monolog/README.md b/vendor/monolog/monolog/README.md index 7d8ade52..a578eb22 100644 --- a/vendor/monolog/monolog/README.md +++ b/vendor/monolog/monolog/README.md @@ -2,7 +2,6 @@ [![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) [![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) -[![Reference Status](https://www.versioneye.com/php/monolog:monolog/reference_badge.svg)](https://www.versioneye.com/php/monolog:monolog/references) Monolog sends your logs to files, sockets, inboxes, databases and various @@ -91,5 +90,5 @@ Monolog is licensed under the MIT License - see the `LICENSE` file for details ### Acknowledgements -This library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/) +This library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/) library, although most concepts have been adjusted to fit to the PHP world. diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json index 3b0c8805..e171e202 100644 --- a/vendor/monolog/monolog/composer.json +++ b/vendor/monolog/monolog/composer.json @@ -26,10 +26,8 @@ "php-amqplib/php-amqplib": "~2.4", "swiftmailer/swiftmailer": "^5.3|^6.0", "php-console/php-console": "^3.1.3", - "phpunit/phpunit-mock-objects": "2.3.0", - "jakub-onderka/php-parallel-lint": "0.9" + "php-parallel-lint/php-parallel-lint": "^1.0" }, - "_": "phpunit/phpunit-mock-objects required in 2.3.0 due to https://github.com/sebastianbergmann/phpunit-mock-objects/issues/223 - needs hhvm 3.8+ on travis", "suggest": { "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", "sentry/sentry": "Allow sending log messages to a Sentry server", @@ -59,8 +57,9 @@ }, "scripts": { "test": [ - "parallel-lint . --exclude vendor", + "parallel-lint . --exclude vendor --exclude src/Monolog/Handler/FormattableHandlerInterface.php --exclude src/Monolog/Handler/FormattableHandlerTrait.php --exclude src/Monolog/Handler/ProcessableHandlerInterface.php --exclude src/Monolog/Handler/ProcessableHandlerTrait.php", "phpunit" ] - } + }, + "lock": false } diff --git a/vendor/monolog/monolog/doc/01-usage.md b/vendor/monolog/monolog/doc/01-usage.md deleted file mode 100644 index 8e2551f3..00000000 --- a/vendor/monolog/monolog/doc/01-usage.md +++ /dev/null @@ -1,231 +0,0 @@ -# Using Monolog - -- [Installation](#installation) -- [Core Concepts](#core-concepts) -- [Log Levels](#log-levels) -- [Configuring a logger](#configuring-a-logger) -- [Adding extra data in the records](#adding-extra-data-in-the-records) -- [Leveraging channels](#leveraging-channels) -- [Customizing the log format](#customizing-the-log-format) - -## Installation - -Monolog is available on Packagist ([monolog/monolog](http://packagist.org/packages/monolog/monolog)) -and as such installable via [Composer](http://getcomposer.org/). - -```bash -composer require monolog/monolog -``` - -If you do not use Composer, you can grab the code from GitHub, and use any -PSR-0 compatible autoloader (e.g. the [Symfony2 ClassLoader component](https://github.com/symfony/ClassLoader)) -to load Monolog classes. - -## Core Concepts - -Every `Logger` instance has a channel (name) and a stack of handlers. Whenever -you add a record to the logger, it traverses the handler stack. Each handler -decides whether it fully handled the record, and if so, the propagation of the -record ends there. - -This allows for flexible logging setups, for example having a `StreamHandler` at -the bottom of the stack that will log anything to disk, and on top of that add -a `MailHandler` that will send emails only when an error message is logged. -Handlers also have a `$bubble` property which defines whether they block the -record or not if they handled it. In this example, setting the `MailHandler`'s -`$bubble` argument to false means that records handled by the `MailHandler` will -not propagate to the `StreamHandler` anymore. - -You can create many `Logger`s, each defining a channel (e.g.: db, request, -router, ..) and each of them combining various handlers, which can be shared -or not. The channel is reflected in the logs and allows you to easily see or -filter records. - -Each Handler also has a Formatter, a default one with settings that make sense -will be created if you don't set one. The formatters normalize and format -incoming records so that they can be used by the handlers to output useful -information. - -Custom severity levels are not available. Only the eight -[RFC 5424](http://tools.ietf.org/html/rfc5424) levels (debug, info, notice, -warning, error, critical, alert, emergency) are present for basic filtering -purposes, but for sorting and other use cases that would require -flexibility, you should add Processors to the Logger that can add extra -information (tags, user ip, ..) to the records before they are handled. - -## Log Levels - -Monolog supports the logging levels described by [RFC 5424](http://tools.ietf.org/html/rfc5424). - -- **DEBUG** (100): Detailed debug information. - -- **INFO** (200): Interesting events. Examples: User logs in, SQL logs. - -- **NOTICE** (250): Normal but significant events. - -- **WARNING** (300): Exceptional occurrences that are not errors. Examples: - Use of deprecated APIs, poor use of an API, undesirable things that are not - necessarily wrong. - -- **ERROR** (400): Runtime errors that do not require immediate action but - should typically be logged and monitored. - -- **CRITICAL** (500): Critical conditions. Example: Application component - unavailable, unexpected exception. - -- **ALERT** (550): Action must be taken immediately. Example: Entire website - down, database unavailable, etc. This should trigger the SMS alerts and wake - you up. - -- **EMERGENCY** (600): Emergency: system is unusable. - -## Configuring a logger - -Here is a basic setup to log to a file and to firephp on the DEBUG level: - -```php -pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG)); -$logger->pushHandler(new FirePHPHandler()); - -// You can now use your logger -$logger->addInfo('My logger is now ready'); -``` - -Let's explain it. The first step is to create the logger instance which will -be used in your code. The argument is a channel name, which is useful when -you use several loggers (see below for more details about it). - -The logger itself does not know how to handle a record. It delegates it to -some handlers. The code above registers two handlers in the stack to allow -handling records in two different ways. - -Note that the FirePHPHandler is called first as it is added on top of the -stack. This allows you to temporarily add a logger with bubbling disabled if -you want to override other configured loggers. - -> If you use Monolog standalone and are looking for an easy way to -> configure many handlers, the [theorchard/monolog-cascade](https://github.com/theorchard/monolog-cascade) -> can help you build complex logging configs via PHP arrays, yaml or json configs. - -## Adding extra data in the records - -Monolog provides two different ways to add extra informations along the simple -textual message. - -### Using the logging context - -The first way is the context, allowing to pass an array of data along the -record: - -```php -addInfo('Adding a new user', array('username' => 'Seldaek')); -``` - -Simple handlers (like the StreamHandler for instance) will simply format -the array to a string but richer handlers can take advantage of the context -(FirePHP is able to display arrays in pretty way for instance). - -### Using processors - -The second way is to add extra data for all records by using a processor. -Processors can be any callable. They will get the record as parameter and -must return it after having eventually changed the `extra` part of it. Let's -write a processor adding some dummy data in the record: - -```php -pushProcessor(function ($record) { - $record['extra']['dummy'] = 'Hello world!'; - - return $record; -}); -``` - -Monolog provides some built-in processors that can be used in your project. -Look at the [dedicated chapter](https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#processors) for the list. - -> Tip: processors can also be registered on a specific handler instead of - the logger to apply only for this handler. - -## Leveraging channels - -Channels are a great way to identify to which part of the application a record -is related. This is useful in big applications (and is leveraged by -MonologBundle in Symfony2). - -Picture two loggers sharing a handler that writes to a single log file. -Channels would allow you to identify the logger that issued every record. -You can easily grep through the log files filtering this or that channel. - -```php -pushHandler($stream); -$logger->pushHandler($firephp); - -// Create a logger for the security-related stuff with a different channel -$securityLogger = new Logger('security'); -$securityLogger->pushHandler($stream); -$securityLogger->pushHandler($firephp); - -// Or clone the first one to only change the channel -$securityLogger = $logger->withName('security'); -``` - -## Customizing the log format - -In Monolog it's easy to customize the format of the logs written into files, -sockets, mails, databases and other handlers. Most of the handlers use the - -```php -$record['formatted'] -``` - -value to be automatically put into the log device. This value depends on the -formatter settings. You can choose between predefined formatter classes or -write your own (e.g. a multiline text file for human-readable output). - -To configure a predefined formatter class, just set it as the handler's field: - -```php -// the default date format is "Y-m-d H:i:s" -$dateFormat = "Y n j, g:i a"; -// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n" -$output = "%datetime% > %level_name% > %message% %context% %extra%\n"; -// finally, create a formatter -$formatter = new LineFormatter($output, $dateFormat); - -// Create a handler -$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG); -$stream->setFormatter($formatter); -// bind it to a logger object -$securityLogger = new Logger('security'); -$securityLogger->pushHandler($stream); -``` - -You may also reuse the same formatter between multiple handlers and share those -handlers between multiple loggers. - -[Handlers, Formatters and Processors](02-handlers-formatters-processors.md) → diff --git a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md b/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md deleted file mode 100644 index bea968ac..00000000 --- a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md +++ /dev/null @@ -1,157 +0,0 @@ -# Handlers, Formatters and Processors - -- [Handlers](#handlers) - - [Log to files and syslog](#log-to-files-and-syslog) - - [Send alerts and emails](#send-alerts-and-emails) - - [Log specific servers and networked logging](#log-specific-servers-and-networked-logging) - - [Logging in development](#logging-in-development) - - [Log to databases](#log-to-databases) - - [Wrappers / Special Handlers](#wrappers--special-handlers) -- [Formatters](#formatters) -- [Processors](#processors) -- [Third Party Packages](#third-party-packages) - -## Handlers - -### Log to files and syslog - -- _StreamHandler_: Logs records into any PHP stream, use this for log files. -- _RotatingFileHandler_: Logs records to a file and creates one logfile per day. - It will also delete files older than `$maxFiles`. You should use - [logrotate](http://linuxcommand.org/man_pages/logrotate8.html) for high profile - setups though, this is just meant as a quick and dirty solution. -- _SyslogHandler_: Logs records to the syslog. -- _ErrorLogHandler_: Logs records to PHP's - [`error_log()`](http://docs.php.net/manual/en/function.error-log.php) function. - -### Send alerts and emails - -- _NativeMailerHandler_: Sends emails using PHP's - [`mail()`](http://php.net/manual/en/function.mail.php) function. -- _SwiftMailerHandler_: Sends emails using a [`Swift_Mailer`](http://swiftmailer.org/) instance. -- _PushoverHandler_: Sends mobile notifications via the [Pushover](https://www.pushover.net/) API. -- _HipChatHandler_: Logs records to a [HipChat](http://hipchat.com) chat room using its API. -- _FlowdockHandler_: Logs records to a [Flowdock](https://www.flowdock.com/) account. -- _SlackHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slack API. -- _SlackbotHandler_: Logs records to a [Slack](https://www.slack.com/) account using the Slackbot incoming hook. -- _SlackWebhookHandler_: Logs records to a [Slack](https://www.slack.com/) account using Slack Webhooks. -- _MandrillHandler_: Sends emails via the Mandrill API using a [`Swift_Message`](http://swiftmailer.org/) instance. -- _FleepHookHandler_: Logs records to a [Fleep](https://fleep.io/) conversation using Webhooks. -- _IFTTTHandler_: Notifies an [IFTTT](https://ifttt.com/maker) trigger with the log channel, level name and message. - -### Log specific servers and networked logging - -- _SocketHandler_: Logs records to [sockets](http://php.net/fsockopen), use this - for UNIX and TCP sockets. See an [example](sockets.md). -- _AmqpHandler_: Logs records to an [amqp](http://www.amqp.org/) compatible - server. Requires the [php-amqp](http://pecl.php.net/package/amqp) extension (1.0+). -- _GelfHandler_: Logs records to a [Graylog2](http://www.graylog2.org) server. -- _CubeHandler_: Logs records to a [Cube](http://square.github.com/cube/) server. -- _RavenHandler_: Logs records to a [Sentry](http://getsentry.com/) server using - [raven](https://packagist.org/packages/raven/raven). -- _ZendMonitorHandler_: Logs records to the Zend Monitor present in Zend Server. -- _NewRelicHandler_: Logs records to a [NewRelic](http://newrelic.com/) application. -- _LogglyHandler_: Logs records to a [Loggly](http://www.loggly.com/) account. -- _RollbarHandler_: Logs records to a [Rollbar](https://rollbar.com/) account. -- _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server. -- _LogEntriesHandler_: Logs records to a [LogEntries](http://logentries.com/) account. - -### Logging in development - -- _FirePHPHandler_: Handler for [FirePHP](http://www.firephp.org/), providing - inline `console` messages within [FireBug](http://getfirebug.com/). -- _ChromePHPHandler_: Handler for [ChromePHP](http://www.chromephp.com/), providing - inline `console` messages within Chrome. -- _BrowserConsoleHandler_: Handler to send logs to browser's Javascript `console` with - no browser extension required. Most browsers supporting `console` API are supported. -- _PHPConsoleHandler_: Handler for [PHP Console](https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef), providing - inline `console` and notification popup messages within Chrome. - -### Log to databases - -- _RedisHandler_: Logs records to a [redis](http://redis.io) server. -- _MongoDBHandler_: Handler to write records in MongoDB via a - [Mongo](http://pecl.php.net/package/mongo) extension connection. -- _CouchDBHandler_: Logs records to a CouchDB server. -- _DoctrineCouchDBHandler_: Logs records to a CouchDB server via the Doctrine CouchDB ODM. -- _ElasticSearchHandler_: Logs records to an Elastic Search server. -- _DynamoDbHandler_: Logs records to a DynamoDB table with the [AWS SDK](https://github.com/aws/aws-sdk-php). - -### Wrappers / Special Handlers - -- _FingersCrossedHandler_: A very interesting wrapper. It takes a logger as - parameter and will accumulate log records of all levels until a record - exceeds the defined severity level. At which point it delivers all records, - including those of lower severity, to the handler it wraps. This means that - until an error actually happens you will not see anything in your logs, but - when it happens you will have the full information, including debug and info - records. This provides you with all the information you need, but only when - you need it. -- _DeduplicationHandler_: Useful if you are sending notifications or emails - when critical errors occur. It takes a logger as parameter and will - accumulate log records of all levels until the end of the request (or - `flush()` is called). At that point it delivers all records to the handler - it wraps, but only if the records are unique over a given time period - (60seconds by default). If the records are duplicates they are simply - discarded. The main use of this is in case of critical failure like if your - database is unreachable for example all your requests will fail and that - can result in a lot of notifications being sent. Adding this handler reduces - the amount of notifications to a manageable level. -- _WhatFailureGroupHandler_: This handler extends the _GroupHandler_ ignoring - exceptions raised by each child handler. This allows you to ignore issues - where a remote tcp connection may have died but you do not want your entire - application to crash and may wish to continue to log to other handlers. -- _BufferHandler_: This handler will buffer all the log records it receives - until `close()` is called at which point it will call `handleBatch()` on the - handler it wraps with all the log messages at once. This is very useful to - send an email with all records at once for example instead of having one mail - for every log record. -- _GroupHandler_: This handler groups other handlers. Every record received is - sent to all the handlers it is configured with. -- _FilterHandler_: This handler only lets records of the given levels through - to the wrapped handler. -- _SamplingHandler_: Wraps around another handler and lets you sample records - if you only want to store some of them. -- _NullHandler_: Any record it can handle will be thrown away. This can be used - to put on top of an existing handler stack to disable it temporarily. -- _PsrHandler_: Can be used to forward log records to an existing PSR-3 logger -- _TestHandler_: Used for testing, it records everything that is sent to it and - has accessors to read out the information. -- _HandlerWrapper_: A simple handler wrapper you can inherit from to create - your own wrappers easily. - -## Formatters - -- _LineFormatter_: Formats a log record into a one-line string. -- _HtmlFormatter_: Used to format log records into a human readable html table, mainly suitable for emails. -- _NormalizerFormatter_: Normalizes objects/resources down to strings so a record can easily be serialized/encoded. -- _ScalarFormatter_: Used to format log records into an associative array of scalar values. -- _JsonFormatter_: Encodes a log record into json. -- _WildfireFormatter_: Used to format log records into the Wildfire/FirePHP protocol, only useful for the FirePHPHandler. -- _ChromePHPFormatter_: Used to format log records into the ChromePHP format, only useful for the ChromePHPHandler. -- _GelfMessageFormatter_: Used to format log records into Gelf message instances, only useful for the GelfHandler. -- _LogstashFormatter_: Used to format log records into [logstash](http://logstash.net/) event json, useful for any handler listed under inputs [here](http://logstash.net/docs/latest). -- _ElasticaFormatter_: Used to format log records into an Elastica\Document object, only useful for the ElasticSearchHandler. -- _LogglyFormatter_: Used to format log records into Loggly messages, only useful for the LogglyHandler. -- _FlowdockFormatter_: Used to format log records into Flowdock messages, only useful for the FlowdockHandler. -- _MongoDBFormatter_: Converts \DateTime instances to \MongoDate and objects recursively to arrays, only useful with the MongoDBHandler. - -## Processors - -- _PsrLogMessageProcessor_: Processes a log record's message according to PSR-3 rules, replacing `{foo}` with the value from `$context['foo']`. -- _IntrospectionProcessor_: Adds the line/file/class/method from which the log call originated. -- _WebProcessor_: Adds the current request URI, request method and client IP to a log record. -- _MemoryUsageProcessor_: Adds the current memory usage to a log record. -- _MemoryPeakUsageProcessor_: Adds the peak memory usage to a log record. -- _ProcessIdProcessor_: Adds the process id to a log record. -- _UidProcessor_: Adds a unique identifier to a log record. -- _GitProcessor_: Adds the current git branch and commit to a log record. -- _TagProcessor_: Adds an array of predefined tags to a log record. - -## Third Party Packages - -Third party handlers, formatters and processors are -[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You -can also add your own there if you publish one. - -← [Usage](01-usage.md) | [Utility classes](03-utilities.md) → diff --git a/vendor/monolog/monolog/doc/03-utilities.md b/vendor/monolog/monolog/doc/03-utilities.md deleted file mode 100644 index c62aa416..00000000 --- a/vendor/monolog/monolog/doc/03-utilities.md +++ /dev/null @@ -1,13 +0,0 @@ -# Utilities - -- _Registry_: The `Monolog\Registry` class lets you configure global loggers that you - can then statically access from anywhere. It is not really a best practice but can - help in some older codebases or for ease of use. -- _ErrorHandler_: The `Monolog\ErrorHandler` class allows you to easily register - a Logger instance as an exception handler, error handler or fatal error handler. -- _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log - level is reached. -- _ChannelLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain - log level is reached, depending on which channel received the log record. - -← [Handlers, Formatters and Processors](02-handlers-formatters-processors.md) | [Extending Monolog](04-extending.md) → diff --git a/vendor/monolog/monolog/doc/04-extending.md b/vendor/monolog/monolog/doc/04-extending.md deleted file mode 100644 index ebd9104d..00000000 --- a/vendor/monolog/monolog/doc/04-extending.md +++ /dev/null @@ -1,76 +0,0 @@ -# Extending Monolog - -Monolog is fully extensible, allowing you to adapt your logger to your needs. - -## Writing your own handler - -Monolog provides many built-in handlers. But if the one you need does not -exist, you can write it and use it in your logger. The only requirement is -to implement `Monolog\Handler\HandlerInterface`. - -Let's write a PDOHandler to log records to a database. We will extend the -abstract class provided by Monolog to keep things DRY. - -```php -pdo = $pdo; - parent::__construct($level, $bubble); - } - - protected function write(array $record) - { - if (!$this->initialized) { - $this->initialize(); - } - - $this->statement->execute(array( - 'channel' => $record['channel'], - 'level' => $record['level'], - 'message' => $record['formatted'], - 'time' => $record['datetime']->format('U'), - )); - } - - private function initialize() - { - $this->pdo->exec( - 'CREATE TABLE IF NOT EXISTS monolog ' - .'(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)' - ); - $this->statement = $this->pdo->prepare( - 'INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)' - ); - - $this->initialized = true; - } -} -``` - -You can now use this handler in your logger: - -```php -pushHandler(new PDOHandler(new PDO('sqlite:logs.sqlite'))); - -// You can now use your logger -$logger->addInfo('My logger is now ready'); -``` - -The `Monolog\Handler\AbstractProcessingHandler` class provides most of the -logic needed for the handler, including the use of processors and the formatting -of the record (which is why we use ``$record['formatted']`` instead of ``$record['message']``). - -← [Utility classes](03-utilities.md) diff --git a/vendor/monolog/monolog/doc/sockets.md b/vendor/monolog/monolog/doc/sockets.md deleted file mode 100644 index ea9cf0ea..00000000 --- a/vendor/monolog/monolog/doc/sockets.md +++ /dev/null @@ -1,39 +0,0 @@ -Sockets Handler -=============== - -This handler allows you to write your logs to sockets using [fsockopen](http://php.net/fsockopen) -or [pfsockopen](http://php.net/pfsockopen). - -Persistent sockets are mainly useful in web environments where you gain some performance not closing/opening -the connections between requests. - -You can use a `unix://` prefix to access unix sockets and `udp://` to open UDP sockets instead of the default TCP. - -Basic Example -------------- - -```php -setPersistent(true); - -// Now add the handler -$logger->pushHandler($handler, Logger::DEBUG); - -// You can now use your logger -$logger->addInfo('My logger is now ready'); - -``` - -In this example, using syslog-ng, you should see the log on the log server: - - cweb1 [2012-02-26 00:12:03] my_logger.INFO: My logger is now ready [] [] - diff --git a/vendor/monolog/monolog/phpunit.xml.dist b/vendor/monolog/monolog/phpunit.xml.dist deleted file mode 100644 index 20d82b63..00000000 --- a/vendor/monolog/monolog/phpunit.xml.dist +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - tests/Monolog/ - - - - - - src/Monolog/ - - - - - - - diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php index 7bfcd833..36ec0098 100644 --- a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php +++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php @@ -38,6 +38,7 @@ class ErrorHandler private $hasFatalErrorHandler; private $fatalLevel; private $reservedMemory; + private $lastFatalTrace; private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR); public function __construct(LoggerInterface $logger) @@ -132,7 +133,7 @@ public function handleException($e) { $this->logger->log( $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel, - sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()), + sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()), array('exception' => $e) ); @@ -156,6 +157,13 @@ public function handleError($code, $message, $file = '', $line = 0, $context = a if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) { $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL; $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line)); + } else { + // http://php.net/manual/en/function.debug-backtrace.php + // As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. + // Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. + $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS); + array_shift($trace); // Exclude handleError from trace + $this->lastFatalTrace = $trace; } if ($this->previousErrorHandler === true) { @@ -177,7 +185,7 @@ public function handleFatalError() $this->logger->log( $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel, 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], - array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line']) + array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace) ); if ($this->logger instanceof Logger) { diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php index 02632bb5..f8ead475 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php @@ -11,6 +11,8 @@ namespace Monolog\Formatter; +use Monolog\Utils; + /** * Class FluentdFormatter * @@ -62,6 +64,7 @@ public function format(array $record) $message = array( 'message' => $record['message'], + 'context' => $record['context'], 'extra' => $record['extra'], ); @@ -70,7 +73,7 @@ public function format(array $record) $message['level_name'] = $record['level_name']; } - return json_encode(array($tag, $record['datetime']->getTimestamp(), $message)); + return Utils::jsonEncode(array($tag, $record['datetime']->getTimestamp(), $message)); } public function formatBatch(array $records) diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php index 3eec95f6..9e8d2d01 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php @@ -11,6 +11,7 @@ namespace Monolog\Formatter; use Monolog\Logger; +use Monolog\Utils; /** * Formats incoming records into an HTML table @@ -58,7 +59,7 @@ protected function addRow($th, $td = ' ', $escapeTd = true) $td = '
'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'
'; } - return "\n$th:\n".$td."\n"; + return "\n$th:\n".$td."\n"; } /** @@ -133,9 +134,9 @@ protected function convertToString($data) $data = $this->normalize($data); if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + return Utils::jsonEncode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE, true); } - return str_replace('\\/', '/', json_encode($data)); + return str_replace('\\/', '/', Utils::jsonEncode($data, null, true)); } } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php index 0782f149..86966b07 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -12,6 +12,7 @@ namespace Monolog\Formatter; use Exception; +use Monolog\Utils; use Throwable; /** @@ -138,18 +139,23 @@ protected function formatBatchNewlines(array $records) * * @return mixed */ - protected function normalize($data) + protected function normalize($data, $depth = 0) { - if (is_array($data) || $data instanceof \Traversable) { + if ($depth > 9) { + return 'Over 9 levels deep, aborting normalization'; + } + + if (is_array($data)) { $normalized = array(); $count = 1; foreach ($data as $key => $value) { - if ($count++ >= 1000) { - $normalized['...'] = 'Over 1000 items, aborting normalization'; + if ($count++ > 1000) { + $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization'; break; } - $normalized[$key] = $this->normalize($value); + + $normalized[$key] = $this->normalize($value, $depth+1); } return $normalized; @@ -159,6 +165,10 @@ protected function normalize($data) return $this->normalizeException($data); } + if (is_resource($data)) { + return parent::normalize($data); + } + return $data; } @@ -174,13 +184,13 @@ protected function normalizeException($e) { // TODO 2.0 only check for Throwable if (!$e instanceof Exception && !$e instanceof Throwable) { - throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e)); + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); } $data = array( - 'class' => get_class($e), + 'class' => Utils::getClass($e), 'message' => $e->getMessage(), - 'code' => $e->getCode(), + 'code' => (int) $e->getCode(), 'file' => $e->getFile().':'.$e->getLine(), ); @@ -189,12 +199,6 @@ protected function normalizeException($e) foreach ($trace as $frame) { if (isset($frame['file'])) { $data['trace'][] = $frame['file'].':'.$frame['line']; - } elseif (isset($frame['function']) && $frame['function'] === '{closure}') { - // We should again normalize the frames, because it might contain invalid items - $data['trace'][] = $frame['function']; - } else { - // We should again normalize the frames, because it might contain invalid items - $data['trace'][] = $this->normalize($frame); } } } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php index d3e209e6..acc1fd38 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php @@ -11,6 +11,8 @@ namespace Monolog\Formatter; +use Monolog\Utils; + /** * Formats incoming records into a one-line string * @@ -129,17 +131,17 @@ protected function normalizeException($e) { // TODO 2.0 only check for Throwable if (!$e instanceof \Exception && !$e instanceof \Throwable) { - throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e)); + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); } $previousText = ''; if ($previous = $e->getPrevious()) { do { - $previousText .= ', '.get_class($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine(); + $previousText .= ', '.Utils::getClass($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine(); } while ($previous = $previous->getPrevious()); } - $str = '[object] ('.get_class($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')'; + $str = '[object] ('.Utils::getClass($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')'; if ($this->includeStacktraces) { $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n"; } @@ -161,7 +163,7 @@ protected function convertToString($data) return $this->toJson($data, true); } - return str_replace('\\/', '/', @json_encode($data)); + return str_replace('\\/', '/', $this->toJson($data, true)); } protected function replaceNewlines($str) diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php index eb067bb7..bd9e4c02 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php @@ -11,6 +11,8 @@ namespace Monolog\Formatter; +use Monolog\Utils; + /** * Formats a record for use with the MongoDBHandler. * @@ -75,7 +77,7 @@ protected function formatArray(array $record, $nestingLevel = 0) protected function formatObject($value, $nestingLevel) { $objectVars = get_object_vars($value); - $objectVars['class'] = get_class($value); + $objectVars['class'] = Utils::getClass($value); return $this->formatArray($objectVars, $nestingLevel); } @@ -83,9 +85,9 @@ protected function formatObject($value, $nestingLevel) protected function formatException(\Exception $exception, $nestingLevel) { $formattedException = array( - 'class' => get_class($exception), + 'class' => Utils::getClass($exception), 'message' => $exception->getMessage(), - 'code' => $exception->getCode(), + 'code' => (int) $exception->getCode(), 'file' => $exception->getFile() . ':' . $exception->getLine(), ); diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php index d4414882..3a01f2ce 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php @@ -12,6 +12,7 @@ namespace Monolog\Formatter; use Exception; +use Monolog\Utils; /** * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets @@ -55,8 +56,12 @@ public function formatBatch(array $records) return $records; } - protected function normalize($data) + protected function normalize($data, $depth = 0) { + if ($depth > 9) { + return 'Over 9 levels deep, aborting normalization'; + } + if (null === $data || is_scalar($data)) { if (is_float($data)) { if (is_infinite($data)) { @@ -75,11 +80,12 @@ protected function normalize($data) $count = 1; foreach ($data as $key => $value) { - if ($count++ >= 1000) { + if ($count++ > 1000) { $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization'; break; } - $normalized[$key] = $this->normalize($value); + + $normalized[$key] = $this->normalize($value, $depth+1); } return $normalized; @@ -103,7 +109,7 @@ protected function normalize($data) $value = $this->toJson($data, true); } - return sprintf("[object] (%s: %s)", get_class($data), $value); + return sprintf("[object] (%s: %s)", Utils::getClass($data), $value); } if (is_resource($data)) { @@ -117,13 +123,13 @@ protected function normalizeException($e) { // TODO 2.0 only check for Throwable if (!$e instanceof Exception && !$e instanceof \Throwable) { - throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e)); + throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e)); } $data = array( - 'class' => get_class($e), + 'class' => Utils::getClass($e), 'message' => $e->getMessage(), - 'code' => $e->getCode(), + 'code' => (int) $e->getCode(), 'file' => $e->getFile().':'.$e->getLine(), ); @@ -137,7 +143,11 @@ protected function normalizeException($e) } if (isset($e->detail)) { - $data['detail'] = $e->detail; + if (is_string($e->detail)) { + $data['detail'] = $e->detail; + } elseif (is_object($e->detail) || is_array($e->detail)) { + $data['detail'] = $this->toJson($e->detail, true); + } } } @@ -145,12 +155,6 @@ protected function normalizeException($e) foreach ($trace as $frame) { if (isset($frame['file'])) { $data['trace'][] = $frame['file'].':'.$frame['line']; - } elseif (isset($frame['function']) && $frame['function'] === '{closure}') { - // We should again normalize the frames, because it might contain invalid items - $data['trace'][] = $frame['function']; - } else { - // We should again normalize the frames, because it might contain invalid items - $data['trace'][] = $this->toJson($this->normalize($frame), true); } } @@ -171,127 +175,6 @@ protected function normalizeException($e) */ protected function toJson($data, $ignoreErrors = false) { - // suppress json_encode errors since it's twitchy with some inputs - if ($ignoreErrors) { - return @$this->jsonEncode($data); - } - - $json = $this->jsonEncode($data); - - if ($json === false) { - $json = $this->handleJsonError(json_last_error(), $data); - } - - return $json; - } - - /** - * @param mixed $data - * @return string JSON encoded data or null on failure - */ - private function jsonEncode($data) - { - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - return json_encode($data); - } - - /** - * Handle a json_encode failure. - * - * If the failure is due to invalid string encoding, try to clean the - * input and encode again. If the second encoding attempt fails, the - * inital error is not encoding related or the input can't be cleaned then - * raise a descriptive exception. - * - * @param int $code return code of json_last_error function - * @param mixed $data data that was meant to be encoded - * @throws \RuntimeException if failure can't be corrected - * @return string JSON encoded data after error correction - */ - private function handleJsonError($code, $data) - { - if ($code !== JSON_ERROR_UTF8) { - $this->throwEncodeError($code, $data); - } - - if (is_string($data)) { - $this->detectAndCleanUtf8($data); - } elseif (is_array($data)) { - array_walk_recursive($data, array($this, 'detectAndCleanUtf8')); - } else { - $this->throwEncodeError($code, $data); - } - - $json = $this->jsonEncode($data); - - if ($json === false) { - $this->throwEncodeError(json_last_error(), $data); - } - - return $json; - } - - /** - * Throws an exception according to a given code with a customized message - * - * @param int $code return code of json_last_error function - * @param mixed $data data that was meant to be encoded - * @throws \RuntimeException - */ - private function throwEncodeError($code, $data) - { - switch ($code) { - case JSON_ERROR_DEPTH: - $msg = 'Maximum stack depth exceeded'; - break; - case JSON_ERROR_STATE_MISMATCH: - $msg = 'Underflow or the modes mismatch'; - break; - case JSON_ERROR_CTRL_CHAR: - $msg = 'Unexpected control character found'; - break; - case JSON_ERROR_UTF8: - $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; - break; - default: - $msg = 'Unknown error'; - } - - throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); - } - - /** - * Detect invalid UTF-8 string characters and convert to valid UTF-8. - * - * Valid UTF-8 input will be left unmodified, but strings containing - * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed - * original encoding of ISO-8859-15. This conversion may result in - * incorrect output if the actual encoding was not ISO-8859-15, but it - * will be clean UTF-8 output and will not rely on expensive and fragile - * detection algorithms. - * - * Function converts the input in place in the passed variable so that it - * can be used as a callback for array_walk_recursive. - * - * @param mixed &$data Input to check and convert if needed - * @private - */ - public function detectAndCleanUtf8(&$data) - { - if (is_string($data) && !preg_match('//u', $data)) { - $data = preg_replace_callback( - '/[\x80-\xFF]+/', - function ($m) { return utf8_encode($m[0]); }, - $data - ); - $data = str_replace( - array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'), - array('€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'), - $data - ); - } + return Utils::jsonEncode($data, null, $ignoreErrors); } } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php index 654710a8..65dba99c 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php @@ -102,12 +102,12 @@ public function formatBatch(array $records) throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); } - protected function normalize($data) + protected function normalize($data, $depth = 0) { if (is_object($data) && !$data instanceof \DateTime) { return $data; } - return parent::normalize($data); + return parent::normalize($data, $depth); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php index 758a425c..cdd9f7d4 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php @@ -11,16 +11,17 @@ namespace Monolog\Handler; -use Monolog\Logger; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; +use Monolog\Logger; +use Monolog\ResettableInterface; /** * Base Handler class providing the Handler structure * * @author Jordi Boggiano */ -abstract class AbstractHandler implements HandlerInterface +abstract class AbstractHandler implements HandlerInterface, ResettableInterface { protected $level = Logger::DEBUG; protected $bubble = true; @@ -32,8 +33,8 @@ abstract class AbstractHandler implements HandlerInterface protected $processors = array(); /** - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param int|string $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($level = Logger::DEBUG, $bubble = true) { @@ -141,8 +142,8 @@ public function getLevel() /** * Sets the bubbling behavior. * - * @param Boolean $bubble true means that this handler allows bubbling. - * false means that bubbling is not permitted. + * @param bool $bubble true means that this handler allows bubbling. + * false means that bubbling is not permitted. * @return self */ public function setBubble($bubble) @@ -155,8 +156,8 @@ public function setBubble($bubble) /** * Gets the bubbling behavior. * - * @return Boolean true means that this handler allows bubbling. - * false means that bubbling is not permitted. + * @return bool true means that this handler allows bubbling. + * false means that bubbling is not permitted. */ public function getBubble() { @@ -174,6 +175,15 @@ public function __destruct() } } + public function reset() + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + /** * Gets the default formatter. * diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php index 6f18f72e..e1e89530 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php @@ -11,6 +11,8 @@ namespace Monolog\Handler; +use Monolog\ResettableInterface; + /** * Base Handler class providing the Handler structure * diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php index e2b2832d..8c76aca0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php @@ -53,9 +53,9 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler ); /** - * @param mixed $facility - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php index b3a21bd4..68feb480 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php @@ -43,11 +43,11 @@ protected function getDefaultFormatter() protected function write(array $record) { // Accumulate records - self::$records[] = $record; + static::$records[] = $record; // Register shutdown handler if not already done - if (!self::$initialized) { - self::$initialized = true; + if (!static::$initialized) { + static::$initialized = true; $this->registerShutdownFunction(); } } @@ -58,27 +58,37 @@ protected function write(array $record) */ public static function send() { - $format = self::getResponseFormat(); + $format = static::getResponseFormat(); if ($format === 'unknown') { return; } - if (count(self::$records)) { + if (count(static::$records)) { if ($format === 'html') { - self::writeOutput(''); + static::writeOutput(''); } elseif ($format === 'js') { - self::writeOutput(self::generateScript()); + static::writeOutput(static::generateScript()); } - self::reset(); + static::resetStatic(); } } + public function close() + { + self::resetStatic(); + } + + public function reset() + { + self::resetStatic(); + } + /** * Forget all logged records */ - public static function reset() + public static function resetStatic() { - self::$records = array(); + static::$records = array(); } /** @@ -133,18 +143,18 @@ protected static function getResponseFormat() private static function generateScript() { $script = array(); - foreach (self::$records as $record) { - $context = self::dump('Context', $record['context']); - $extra = self::dump('Extra', $record['extra']); + foreach (static::$records as $record) { + $context = static::dump('Context', $record['context']); + $extra = static::dump('Extra', $record['extra']); if (empty($context) && empty($extra)) { - $script[] = self::call_array('log', self::handleStyles($record['formatted'])); + $script[] = static::call_array('log', static::handleStyles($record['formatted'])); } else { $script = array_merge($script, - array(self::call_array('groupCollapsed', self::handleStyles($record['formatted']))), + array(static::call_array('groupCollapsed', static::handleStyles($record['formatted']))), $context, $extra, - array(self::call('groupEnd')) + array(static::call('groupEnd')) ); } } @@ -154,21 +164,22 @@ private static function generateScript() private static function handleStyles($formatted) { - $args = array(self::quote('font-weight: normal')); + $args = array(); $format = '%c' . $formatted; preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach (array_reverse($matches) as $match) { - $args[] = self::quote(self::handleCustomStyles($match[2][0], $match[1][0])); $args[] = '"font-weight: normal"'; + $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); $pos = $match[0][1]; $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0])); } - array_unshift($args, self::quote($format)); + $args[] = static::quote('font-weight: normal'); + $args[] = static::quote($format); - return $args; + return array_reverse($args); } private static function handleCustomStyles($style, $string) @@ -198,13 +209,13 @@ private static function dump($title, array $dict) if (empty($dict)) { return $script; } - $script[] = self::call('log', self::quote('%c%s'), self::quote('font-weight: bold'), self::quote($title)); + $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); foreach ($dict as $key => $value) { $value = json_encode($value); if (empty($value)) { - $value = self::quote(''); + $value = static::quote(''); } - $script[] = self::call('log', self::quote('%s: %o'), self::quote($key), $value); + $script[] = static::call('log', static::quote('%s: %o'), static::quote($key), $value); } return $script; @@ -220,7 +231,7 @@ private static function call() $args = func_get_args(); $method = array_shift($args); - return self::call_array($method, $args); + return static::call_array($method, $args); } private static function call_array($method, array $args) diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php index 72f89535..0957e558 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php @@ -12,6 +12,8 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; /** * Buffers all records until closing the handler and then pass them as batch. @@ -34,8 +36,8 @@ class BufferHandler extends AbstractHandler * @param HandlerInterface $handler Handler. * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded */ public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false) { @@ -114,4 +116,33 @@ public function clear() $this->bufferSize = 0; $this->buffer = array(); } + + public function reset() + { + $this->flush(); + + parent::reset(); + + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->handler->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->handler->getFormatter(); + } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php index 785cb0c9..47120e54 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php @@ -13,6 +13,7 @@ use Monolog\Formatter\ChromePHPFormatter; use Monolog\Logger; +use Monolog\Utils; /** * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) @@ -32,7 +33,7 @@ class ChromePHPHandler extends AbstractProcessingHandler * Header name */ const HEADER_NAME = 'X-ChromeLogger-Data'; - + /** * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) */ @@ -43,9 +44,9 @@ class ChromePHPHandler extends AbstractProcessingHandler /** * Tracks whether we sent too much data * - * Chrome limits the headers to 256KB, so when we sent 240KB we stop sending + * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending * - * @var Boolean + * @var bool */ protected static $overflowed = false; @@ -58,8 +59,8 @@ class ChromePHPHandler extends AbstractProcessingHandler protected static $sendHeaders = true; /** - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($level = Logger::DEBUG, $bubble = true) { @@ -134,9 +135,9 @@ protected function send() self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; } - $json = @json_encode(self::$json); + $json = Utils::jsonEncode(self::$json, null, true); $data = base64_encode(utf8_encode($json)); - if (strlen($data) > 240 * 1024) { + if (strlen($data) > 3 * 1024) { self::$overflowed = true; $record = array( @@ -149,7 +150,7 @@ protected function send() 'extra' => array(), ); self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); - $json = @json_encode(self::$json); + $json = Utils::jsonEncode(self::$json, null, true); $data = base64_encode(utf8_encode($json)); } @@ -174,7 +175,7 @@ protected function sendHeader($header, $content) /** * Verifies if the headers are accepted by the current user agent * - * @return Boolean + * @return bool */ protected function headersAccepted() { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php index 96b3ca0c..44928efb 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * Logs to Cube. @@ -119,9 +120,9 @@ protected function write(array $record) $data['data']['level'] = $record['level']; if ($this->scheme === 'http') { - $this->writeHttp(json_encode($data)); + $this->writeHttp(Utils::jsonEncode($data)); } else { - $this->writeUdp(json_encode($data)); + $this->writeUdp(Utils::jsonEncode($data)); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php index 7778c22a..35b55cb4 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php @@ -60,7 +60,7 @@ class DeduplicationHandler extends BufferHandler * @param string $deduplicationStore The file/path where the deduplication log should be kept * @param int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php index 81967406..bb0f83eb 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php @@ -46,10 +46,10 @@ class ElasticSearchHandler extends AbstractProcessingHandler protected $options = array(); /** - * @param Client $client Elastica Client object - * @param array $options Handler configuration - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param Client $client Elastica Client object + * @param array $options Handler configuration + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php index 1447a584..b2986b0f 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php @@ -28,10 +28,10 @@ class ErrorLogHandler extends AbstractProcessingHandler protected $expandNewlines; /** - * @param int $messageType Says where the error should go. - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries + * @param int $messageType Says where the error should go. + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries */ public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php index 2a0f7fd1..949f2271 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; /** * Simple handler wrapper that filters records based on a list of levels @@ -40,15 +41,15 @@ class FilterHandler extends AbstractHandler /** * Whether the messages that are handled can bubble up the stack or not * - * @var Boolean + * @var bool */ protected $bubble; /** - * @param callable|HandlerInterface $handler Handler or factory callable($record, $this). + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler). * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true) { @@ -104,21 +105,13 @@ public function handle(array $record) return false; } - // The same logic as in FingersCrossedHandler - if (!$this->handler instanceof HandlerInterface) { - $this->handler = call_user_func($this->handler, $record, $this); - if (!$this->handler instanceof HandlerInterface) { - throw new \RuntimeException("The factory callable should return a HandlerInterface"); - } - } - if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } - $this->handler->handle($record); + $this->getHandler($record)->handle($record); return false === $this->bubble; } @@ -135,6 +128,45 @@ public function handleBatch(array $records) } } - $this->handler->handleBatch($filtered); + if (count($filtered) > 0) { + $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered); + } + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->getHandler()->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->getHandler()->getFormatter(); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php index c3e42efe..aaca12cc 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php @@ -22,7 +22,7 @@ interface ActivationStrategyInterface * Returns whether the given record activates the handler. * * @param array $record - * @return Boolean + * @return bool */ public function isHandlerActivated(array $record); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php index d1dcaacf..cdabc445 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php @@ -14,6 +14,8 @@ use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; /** * Buffers all records until a certain level is reached @@ -38,11 +40,11 @@ class FingersCrossedHandler extends AbstractHandler protected $passthruLevel; /** - * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler). * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $stopBuffering Whether the handler should stop buffering after being triggered (default true) + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) * @param int $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered */ public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null) @@ -87,15 +89,7 @@ public function activate() if ($this->stopBuffering) { $this->buffering = false; } - if (!$this->handler instanceof HandlerInterface) { - $record = end($this->buffer) ?: null; - - $this->handler = call_user_func($this->handler, $record, $this); - if (!$this->handler instanceof HandlerInterface) { - throw new \RuntimeException("The factory callable should return a HandlerInterface"); - } - } - $this->handler->handleBatch($this->buffer); + $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); $this->buffer = array(); } @@ -119,7 +113,7 @@ public function handle(array $record) $this->activate(); } } else { - $this->handler->handle($record); + $this->getHandler($record)->handle($record); } return false === $this->bubble; @@ -129,6 +123,36 @@ public function handle(array $record) * {@inheritdoc} */ public function close() + { + $this->flushBuffer(); + } + + public function reset() + { + $this->flushBuffer(); + + parent::reset(); + + if ($this->getHandler() instanceof ResettableInterface) { + $this->getHandler()->reset(); + } + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + * + * It also resets the handler to its initial buffering state. + */ + public function clear() + { + $this->buffer = array(); + $this->reset(); + } + + /** + * Resets the state of the handler. Stops forwarding records to the wrapped handler. + */ + private function flushBuffer() { if (null !== $this->passthruLevel) { $level = $this->passthruLevel; @@ -136,28 +160,48 @@ public function close() return $record['level'] >= $level; }); if (count($this->buffer) > 0) { - $this->handler->handleBatch($this->buffer); - $this->buffer = array(); + $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); } } + + $this->buffer = array(); + $this->buffering = true; } /** - * Resets the state of the handler. Stops forwarding records to the wrapped handler. + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface */ - public function reset() + public function getHandler(array $record = null) { - $this->buffering = true; + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; } /** - * Clears the buffer without flushing any messages down to the wrapped handler. - * - * It also resets the handler to its initial buffering state. + * {@inheritdoc} */ - public function clear() + public function setFormatter(FormatterInterface $formatter) { - $this->buffer = array(); - $this->reset(); + $this->getHandler()->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->getHandler()->getFormatter(); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php index fee47950..c30b1843 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php @@ -158,7 +158,7 @@ protected function write(array $record) /** * Verifies if the headers are accepted by the current user agent * - * @return Boolean + * @return bool */ protected function headersAccepted() { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php index dd9a361c..f0f010cb 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; use Monolog\Formatter\FlowdockFormatter; use Monolog\Formatter\FormatterInterface; @@ -105,7 +106,7 @@ protected function generateDataStream($record) */ private function buildContent($record) { - return json_encode($record['formatted']['flowdock']); + return Utils::jsonEncode($record['formatted']['flowdock']); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php new file mode 100644 index 00000000..3e2f1b28 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface to describe loggers that have a formatter + * + * This interface is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +interface FormattableHandlerInterface +{ + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return HandlerInterface self + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface; + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php new file mode 100644 index 00000000..e9ec5e77 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Helper trait for implementing FormattableInterface + * + * This trait is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +trait FormattableHandlerTrait +{ + /** + * @var FormatterInterface + */ + protected $formatter; + + /** + * {@inheritdoc} + * @suppress PhanTypeMismatchReturn + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Gets the default formatter. + * + * Overwrite this if the LineFormatter is not a good default for your handler. + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php index d3847d82..71e46693 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php @@ -47,14 +47,6 @@ public function __construct($publisher, $level = Logger::DEBUG, $bubble = true) $this->publisher = $publisher; } - /** - * {@inheritdoc} - */ - public function close() - { - $this->publisher = null; - } - /** * {@inheritdoc} */ diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php index 663f5a92..0d461f9c 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Formatter\FormatterInterface; +use Monolog\ResettableInterface; /** * Forwards records to multiple handlers @@ -23,8 +24,8 @@ class GroupHandler extends AbstractHandler protected $handlers; /** - * @param array $handlers Array of Handlers. - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param array $handlers Array of Handlers. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(array $handlers, $bubble = true) { @@ -79,8 +80,9 @@ public function handleBatch(array $records) $processed = array(); foreach ($records as $record) { foreach ($this->processors as $processor) { - $processed[] = call_user_func($processor, $record); + $record = call_user_func($processor, $record); } + $processed[] = $record; } $records = $processed; } @@ -90,6 +92,17 @@ public function handleBatch(array $records) } } + public function reset() + { + parent::reset(); + + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + } + /** * {@inheritdoc} */ diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php index d920c4ba..8d5a4a09 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php @@ -31,7 +31,7 @@ interface HandlerInterface * * @param array $record Partial log record containing only a level key * - * @return Boolean + * @return bool */ public function isHandling(array $record); @@ -46,7 +46,7 @@ public function isHandling(array $record); * calling further handlers in the stack with a given log record. * * @param array $record The record to handle - * @return Boolean true means that this handler handled the record, and that bubbling is not permitted. + * @return bool true means that this handler handled the record, and that bubbling is not permitted. * false means the record was either not processed or that this handler allows bubbling. */ public function handle(array $record); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php index e540d80f..55e64986 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php @@ -11,6 +11,7 @@ namespace Monolog\Handler; +use Monolog\ResettableInterface; use Monolog\Formatter\FormatterInterface; /** @@ -30,7 +31,7 @@ * * @author Alexey Karapetov */ -class HandlerWrapper implements HandlerInterface +class HandlerWrapper implements HandlerInterface, ResettableInterface { /** * @var HandlerInterface @@ -105,4 +106,11 @@ public function getFormatter() { return $this->handler->getFormatter(); } + + public function reset() + { + if ($this->handler instanceof ResettableInterface) { + return $this->handler->reset(); + } + } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php index 73049f36..179d6268 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php @@ -97,6 +97,8 @@ class HipChatHandler extends SocketHandler */ public function __construct($token, $room, $name = 'Monolog', $notify = false, $level = Logger::CRITICAL, $bubble = true, $useSSL = true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1) { + @trigger_error('The Monolog\Handler\HipChatHandler class is deprecated. You should migrate to Slack and the SlackWebhookHandler / SlackbotHandler, see https://www.atlassian.com/partnerships/slack', E_USER_DEPRECATED); + if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) { throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.'); } @@ -219,6 +221,21 @@ protected function getAlertColor($level) protected function write(array $record) { parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, hipchat sometimes + * drops the request entirely. + */ + protected function finalizeWrite() + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } $this->closeSocket(); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php index d60a3c82..f4d3b97e 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * IFTTTHandler uses cURL to trigger IFTTT Maker actions @@ -30,10 +31,10 @@ class IFTTTHandler extends AbstractProcessingHandler private $secretKey; /** - * @param string $eventName The name of the IFTTT Maker event that should be triggered - * @param string $secretKey A valid IFTTT secret key - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $eventName The name of the IFTTT Maker event that should be triggered + * @param string $secretKey A valid IFTTT secret key + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true) { @@ -53,7 +54,7 @@ public function write(array $record) "value2" => $record["level_name"], "value3" => $record["message"], ); - $postString = json_encode($postData); + $postString = Utils::jsonEncode($postData); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php new file mode 100644 index 00000000..8f683dce --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + + namespace Monolog\Handler; + + use Monolog\Logger; + +/** + * Inspired on LogEntriesHandler. + * + * @author Robert Kaufmann III + * @author Gabriel Machado + */ +class InsightOpsHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by InsightOps + * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. + * @param bool $useSSL Whether or not SSL encryption should be used + * @param int $level The minimum logging level to trigger this handler + * @param bool $bubble Whether or not messages that are handled should bubble up the stack. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct($token, $region = 'us', $useSSL = true, $level = Logger::DEBUG, $bubble = true) + { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); + } + + $endpoint = $useSSL + ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' + : $region . '.data.logs.insight.rapid7.com:80'; + + parent::__construct($endpoint, $level, $bubble); + $this->logToken = $token; + } + + /** + * {@inheritdoc} + * + * @param array $record + * @return string + */ + protected function generateDataStream($record) + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php index 494c605b..ea89fb3e 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php @@ -31,13 +31,13 @@ class LogEntriesHandler extends SocketHandler * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ - public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true) + public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true, $host = 'data.logentries.com') { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); } - $endpoint = $useSSL ? 'ssl://data.logentries.com:443' : 'data.logentries.com:80'; + $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; parent::__construct($endpoint, $level, $bubble); $this->logToken = $token; } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php index ab95924f..3f0956a9 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php @@ -27,7 +27,7 @@ class MandrillHandler extends MailHandler * @param string $apiKey A valid Mandrill API key * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php index 6718e9e0..64dc1381 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php @@ -12,12 +12,15 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; use Monolog\Formatter\NormalizerFormatter; /** * Class to record a log on a NewRelic application. * Enabling New Relic High Security mode may prevent capture of useful information. * + * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] + * * @see https://docs.newrelic.com/docs/agents/php-agent * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security */ @@ -84,7 +87,7 @@ protected function write(array $record) unset($record['formatted']['context']['transaction_name']); } - if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) { + if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { newrelic_notice_error($record['message'], $record['context']['exception']); unset($record['formatted']['context']['exception']); } else { @@ -188,7 +191,7 @@ protected function setNewRelicParameter($key, $value) if (null === $value || is_scalar($value)) { newrelic_add_custom_parameter($key, $value); } else { - newrelic_add_custom_parameter($key, @json_encode($value)); + newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true)); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php index 1f2076a4..d0a8b43e 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php @@ -14,6 +14,7 @@ use Exception; use Monolog\Formatter\LineFormatter; use Monolog\Logger; +use Monolog\Utils; use PhpConsole\Connector; use PhpConsole\Handler; use PhpConsole\Helper; @@ -188,7 +189,7 @@ private function handleDebugRecord(array $record) $tags = $this->getRecordTags($record); $message = $record['message']; if ($record['context']) { - $message .= ' ' . json_encode($this->connector->getDumper()->dump(array_filter($record['context']))); + $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true); } $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php new file mode 100644 index 00000000..66a3d83a --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Processor\ProcessorInterface; + +/** + * Interface to describe loggers that have processors + * + * This interface is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +interface ProcessableHandlerInterface +{ + /** + * Adds a processor in the stack. + * + * @param ProcessorInterface|callable $callback + * @return HandlerInterface self + */ + public function pushProcessor($callback): HandlerInterface; + + /** + * Removes the processor on top of the stack and returns it. + * + * @throws \LogicException In case the processor stack is empty + * @return callable + */ + public function popProcessor(): callable; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php new file mode 100644 index 00000000..09f32a12 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; + +/** + * Helper trait for implementing ProcessableInterface + * + * This trait is present in monolog 1.x to ease forward compatibility. + * + * @author Jordi Boggiano + */ +trait ProcessableHandlerTrait +{ + /** + * @var callable[] + */ + protected $processors = []; + + /** + * {@inheritdoc} + * @suppress PhanTypeMismatchReturn + */ + public function pushProcessor($callback): HandlerInterface + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * Processes a record. + */ + protected function processRecord(array $record): array + { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + + return $record; + } + + protected function resetProcessors(): void + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php index 1ae85845..a99e6ab7 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php @@ -31,7 +31,7 @@ class PsrHandler extends AbstractHandler /** * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php index bba72005..f27bb3da 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -69,8 +69,8 @@ class PushoverHandler extends SocketHandler * @param string|array $users Pushover user id or array of ids the message will be sent to * @param string $title Title sent to the Pushover API * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param Boolean $useSSL Whether to connect via SSL. Required when pushing messages to users that are not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not * the pushover.net app owner. OpenSSL is required for this option. * @param int $highPriorityLevel The minimum logging level at which this handler will start * sending "high priority" requests to the Pushover API @@ -180,6 +180,6 @@ public function setEmergencyLevel($value) */ public function useFormattedMessage($value) { - $this->useFormattedMessage = (boolean) $value; + $this->useFormattedMessage = (bool) $value; } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php index 53a8b391..9d24dfe8 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php @@ -18,7 +18,7 @@ /** * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server - * using raven-php (https://github.com/getsentry/raven-php) + * using sentry-php (https://github.com/getsentry/sentry-php) * * @author Marc Abramowitz */ @@ -27,7 +27,7 @@ class RavenHandler extends AbstractProcessingHandler /** * Translates Monolog log levels to Raven log levels. */ - private $logLevels = array( + protected $logLevels = array( Logger::DEBUG => Raven_Client::DEBUG, Logger::INFO => Raven_Client::INFO, Logger::NOTICE => Raven_Client::INFO, @@ -42,7 +42,7 @@ class RavenHandler extends AbstractProcessingHandler * @var string should represent the current version of the calling * software. Can be any string (git commit, version number) */ - private $release; + protected $release; /** * @var Raven_Client the client object that sends the message to the server @@ -57,10 +57,12 @@ class RavenHandler extends AbstractProcessingHandler /** * @param Raven_Client $ravenClient * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true) { + @trigger_error('The Monolog\Handler\RavenHandler class is deprecated. You should rather upgrade to the sentry/sentry 2.x and use Sentry\Monolog\Handler, see https://github.com/getsentry/sentry-php/blob/master/src/Monolog/Handler.php', E_USER_DEPRECATED); + parent::__construct($level, $bubble); $this->ravenClient = $ravenClient; @@ -84,7 +86,7 @@ public function handleBatch(array $records) // the record with the highest severity is the "main" one $record = array_reduce($records, function ($highest, $record) { - if ($record['level'] > $highest['level']) { + if (null === $highest || $record['level'] > $highest['level']) { return $record; } @@ -180,7 +182,7 @@ protected function write(array $record) } if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) { - $options['extra']['message'] = $record['formatted']; + $options['message'] = $record['formatted']; $this->ravenClient->captureException($record['context']['exception'], $options); } else { $this->ravenClient->captureMessage($record['formatted'], array(), $options); @@ -216,7 +218,7 @@ protected function getDefaultBatchFormatter() */ protected function getExtraParameters() { - return array('checksum', 'release', 'event_id'); + return array('contexts', 'checksum', 'release', 'event_id'); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php index 590f9965..bb00db50 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php @@ -73,7 +73,8 @@ protected function write(array $record) protected function writeCapped(array $record) { if ($this->redisClient instanceof \Redis) { - $this->redisClient->multi() + $mode = defined('\Redis::MULTI') ? \Redis::MULTI : 1; + $this->redisClient->multi($mode) ->rpush($this->redisKey, $record["formatted"]) ->ltrim($this->redisKey, -$this->capSize, -1) ->exec(); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php index 6c8a3e3e..65073ffe 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php @@ -129,4 +129,16 @@ public function close() { $this->flush(); } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->flush(); + + parent::reset(); + } + + } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php index 3b60b3d1..b8253ba0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * Stores logs to files that are rotated every day and a limited number of files are kept. @@ -39,13 +40,13 @@ class RotatingFileHandler extends StreamHandler * @param string $filename * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) - * @param Boolean $useLocking Try to lock log file before doing any writes + * @param bool $useLocking Try to lock log file before doing any writes */ public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) { - $this->filename = $filename; + $this->filename = Utils::canonicalizePath($filename); $this->maxFiles = (int) $maxFiles; $this->nextRotation = new \DateTime('tomorrow'); $this->filenameFormat = '{filename}-{date}'; @@ -66,6 +67,18 @@ public function close() } } + /** + * {@inheritdoc} + */ + public function reset() + { + parent::reset(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + public function setFilenameFormat($filenameFormat, $dateFormat) { if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { @@ -166,7 +179,7 @@ protected function getGlobPattern() $fileInfo = pathinfo($this->filename); $glob = str_replace( array('{filename}', '{date}'), - array($fileInfo['filename'], '*'), + array($fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'), $fileInfo['dirname'] . '/' . $this->filenameFormat ); if (!empty($fileInfo['extension'])) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php index 9509ae37..b547ed7d 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php @@ -11,6 +11,8 @@ namespace Monolog\Handler; +use Monolog\Formatter\FormatterInterface; + /** * Sampling handler * @@ -38,7 +40,7 @@ class SamplingHandler extends AbstractHandler protected $factor; /** - * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler). * @param int $factor Sample factor */ public function __construct($handler, $factor) @@ -54,29 +56,58 @@ public function __construct($handler, $factor) public function isHandling(array $record) { - return $this->handler->isHandling($record); + return $this->getHandler($record)->isHandling($record); } public function handle(array $record) { if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { - // The same logic as in FingersCrossedHandler - if (!$this->handler instanceof HandlerInterface) { - $this->handler = call_user_func($this->handler, $record, $this); - if (!$this->handler instanceof HandlerInterface) { - throw new \RuntimeException("The factory callable should return a HandlerInterface"); - } - } - if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); } } - $this->handler->handle($record); + $this->getHandler($record)->handle($record); } return false === $this->bubble; } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritdoc} + */ + public function setFormatter(FormatterInterface $formatter) + { + $this->getHandler()->setFormatter($formatter); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getFormatter() + { + return $this->getHandler()->getFormatter(); + } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php index 38bc838a..39455501 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php @@ -12,6 +12,7 @@ namespace Monolog\Handler\Slack; use Monolog\Logger; +use Monolog\Utils; use Monolog\Formatter\NormalizerFormatter; use Monolog\Formatter\FormatterInterface; @@ -146,7 +147,7 @@ public function getSlackData(array $record) if ($this->useShortAttachment) { $attachment['fields'][] = $this->generateAttachmentField( - ucfirst($key), + $key, $record[$key] ); } else { @@ -207,13 +208,17 @@ public function stringify($fields) { $normalized = $this->normalizerFormatter->format($fields); $prettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; + $flags = 0; + if (PHP_VERSION_ID >= 50400) { + $flags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + } $hasSecondDimension = count(array_filter($normalized, 'is_array')); $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); return $hasSecondDimension || $hasNonNumericKeys - ? json_encode($normalized, $prettyPrintFlag) - : json_encode($normalized); + ? Utils::jsonEncode($normalized, $prettyPrintFlag | $flags) + : Utils::jsonEncode($normalized, $flags); } /** @@ -229,8 +234,8 @@ public function setFormatter(FormatterInterface $formatter) /** * Generates attachment field * - * @param string $title - * @param string|array $value\ + * @param string $title + * @param string|array $value * * @return array */ @@ -241,7 +246,7 @@ private function generateAttachmentField($title, $value) : $value; return array( - 'title' => $title, + 'title' => ucfirst($title), 'value' => $value, 'short' => false ); @@ -257,7 +262,7 @@ private function generateAttachmentField($title, $value) private function generateAttachmentFields(array $data) { $fields = array(); - foreach ($data as $key => $value) { + foreach ($this->normalizerFormatter->format($data) as $key => $value) { $fields[] = $this->generateAttachmentField($key, $value); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php index 3ac4d836..88c4c4d0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php @@ -13,6 +13,7 @@ use Monolog\Formatter\FormatterInterface; use Monolog\Logger; +use Monolog\Utils; use Monolog\Handler\Slack\SlackRecord; /** @@ -75,6 +76,11 @@ public function getSlackRecord() return $this->slackRecord; } + public function getToken() + { + return $this->token; + } + /** * {@inheritdoc} * @@ -113,7 +119,7 @@ protected function prepareContentData($record) $dataArray['token'] = $this->token; if (!empty($dataArray['attachments'])) { - $dataArray['attachments'] = json_encode($dataArray['attachments']); + $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); } return $dataArray; diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php index 9a1bbb44..b87be99a 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php @@ -13,6 +13,7 @@ use Monolog\Formatter\FormatterInterface; use Monolog\Logger; +use Monolog\Utils; use Monolog\Handler\Slack\SlackRecord; /** @@ -70,6 +71,11 @@ public function getSlackRecord() return $this->slackRecord; } + public function getWebhookUrl() + { + return $this->webhookUrl; + } + /** * {@inheritdoc} * @@ -78,7 +84,7 @@ public function getSlackRecord() protected function write(array $record) { $postData = $this->slackRecord->getSlackData($record); - $postString = json_encode($postData); + $postString = Utils::jsonEncode($postData); $ch = curl_init(); $options = array( diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php index baead525..d3352ea0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php @@ -16,8 +16,11 @@ /** * Sends notifications through Slack's Slackbot * - * @author Haralan Dobrev - * @see https://slack.com/apps/A0F81R8ET-slackbot + * @author Haralan Dobrev + * @see https://slack.com/apps/A0F81R8ET-slackbot + * @deprecated According to Slack the API used on this handler it is deprecated. + * Therefore this handler will be removed on 2.x + * Slack suggests to use webhooks instead. Please contact slack for more information. */ class SlackbotHandler extends AbstractProcessingHandler { @@ -48,6 +51,7 @@ class SlackbotHandler extends AbstractProcessingHandler */ public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = true) { + @trigger_error('SlackbotHandler is deprecated and will be removed on 2.x', E_USER_DEPRECATED); parent::__construct($level, $bubble); $this->slackTeam = $slackTeam; diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php index 7a61bf4e..db50d97f 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php @@ -27,15 +27,16 @@ class SocketHandler extends AbstractProcessingHandler private $timeout = 0; private $writingTimeout = 10; private $lastSentBytes = null; + private $chunkSize = null; private $persistent = false; private $errno; private $errstr; private $lastWritingAt; /** - * @param string $connectionString Socket connection string - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $connectionString Socket connection string + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true) { @@ -87,7 +88,7 @@ public function closeSocket() */ public function setPersistent($persistent) { - $this->persistent = (boolean) $persistent; + $this->persistent = (bool) $persistent; } /** @@ -127,6 +128,16 @@ public function setWritingTimeout($seconds) $this->writingTimeout = (float) $seconds; } + /** + * Set chunk size. Only has effect during connection in the writing cycle. + * + * @param float $bytes + */ + public function setChunkSize($bytes) + { + $this->chunkSize = $bytes; + } + /** * Get current connection string * @@ -177,6 +188,16 @@ public function getWritingTimeout() return $this->writingTimeout; } + /** + * Get current chunk size + * + * @return float + */ + public function getChunkSize() + { + return $this->chunkSize; + } + /** * Check to see if the socket is currently available. * @@ -219,6 +240,16 @@ protected function streamSetTimeout() return stream_set_timeout($this->resource, $seconds, $microseconds); } + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-chunk-size.php + */ + protected function streamSetChunkSize() + { + return stream_set_chunk_size($this->resource, $this->chunkSize); + } + /** * Wrapper to allow mocking */ @@ -268,6 +299,7 @@ private function connect() { $this->createSocketResource(); $this->setSocketTimeout(); + $this->setStreamChunkSize(); } private function createSocketResource() @@ -290,6 +322,13 @@ private function setSocketTimeout() } } + private function setStreamChunkSize() + { + if ($this->chunkSize && !$this->streamSetChunkSize()) { + throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); + } + } + private function writeToSocket($data) { $length = strlen($data); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php index 09a15738..b52607d2 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * Stores to any stream resource @@ -32,9 +33,9 @@ class StreamHandler extends AbstractProcessingHandler /** * @param resource|string $stream * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) - * @param Boolean $useLocking Try to lock log file before doing any writes + * @param bool $useLocking Try to lock log file before doing any writes * * @throws \Exception If a missing directory is not buildable * @throws \InvalidArgumentException If stream is not a resource or string @@ -45,7 +46,7 @@ public function __construct($stream, $level = Logger::DEBUG, $bubble = true, $fi if (is_resource($stream)) { $this->stream = $stream; } elseif (is_string($stream)) { - $this->url = $stream; + $this->url = Utils::canonicalizePath($stream); } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } @@ -63,6 +64,7 @@ public function close() fclose($this->stream); } $this->stream = null; + $this->dirCreated = null; } /** @@ -104,7 +106,8 @@ protected function write(array $record) restore_error_handler(); if (!is_resource($this->stream)) { $this->stream = null; - throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened: '.$this->errorMessage, $this->url)); + + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $this->url)); } } @@ -167,7 +170,7 @@ private function createDir() set_error_handler(array($this, 'customErrorHandler')); $status = mkdir($dir, 0777, true); restore_error_handler(); - if (false === $status) { + if (false === $status && !is_dir($dir)) { throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and its not buildable: '.$this->errorMessage, $dir)); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php index 72f44a53..ac7b16ff 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Swift; @@ -29,7 +30,7 @@ class SwiftMailerHandler extends MailHandler * @param \Swift_Mailer $mailer The mailer to use * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true) { @@ -47,6 +48,17 @@ protected function send($content, array $records) $this->mailer->send($this->buildMessage($content, $records)); } + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string $format The format of the subject + * @return FormatterInterface + */ + protected function getSubjectFormatter($format) + { + return new LineFormatter($format); + } + /** * Creates instance of Swift_Message to be sent * @@ -69,7 +81,7 @@ protected function buildMessage($content, array $records) } if ($records) { - $subjectFormatter = new LineFormatter($message->getSubject()); + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php index 376bc3b2..f770c802 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php @@ -32,11 +32,11 @@ class SyslogHandler extends AbstractSyslogHandler protected $logopts; /** - * @param string $ident - * @param mixed $facility - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID + * @param string $ident + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID */ public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php index 4718711b..4dfd5f5e 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php @@ -18,25 +18,37 @@ * A Handler for logging to a remote syslogd server. * * @author Jesper Skovgaard Nielsen + * @author Dominik Kukacka */ class SyslogUdpHandler extends AbstractSyslogHandler { + const RFC3164 = 0; + const RFC5424 = 1; + + private $dateFormats = array( + self::RFC3164 => 'M d H:i:s', + self::RFC5424 => \DateTime::RFC3339, + ); + protected $socket; protected $ident; + protected $rfc; /** - * @param string $host - * @param int $port - * @param mixed $facility - * @param int $level The minimum logging level at which this handler will be triggered - * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * @param string $ident Program name or tag for each log message. + * @param string $host + * @param int $port + * @param mixed $facility + * @param int $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $ident Program name or tag for each log message. + * @param int $rfc RFC to format the message for. */ - public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php') + public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php', $rfc = self::RFC5424) { parent::__construct($facility, $level, $bubble); $this->ident = $ident; + $this->rfc = $rfc; $this->socket = new UdpSocket($host, $port ?: 514); } @@ -67,7 +79,7 @@ private function splitMessageIntoLines($message) } /** - * Make common syslog header (see rfc5424) + * Make common syslog header (see rfc5424 or rfc3164) */ protected function makeCommonSyslogHeader($severity) { @@ -81,16 +93,25 @@ protected function makeCommonSyslogHeader($severity) $hostname = '-'; } - return "<$priority>1 " . - $this->getDateTime() . " " . - $hostname . " " . - $this->ident . " " . - $pid . " - - "; + $date = $this->getDateTime(); + + if ($this->rfc === self::RFC3164) { + return "<$priority>" . + $date . " " . + $hostname . " " . + $this->ident . "[" . $pid . "]: "; + } else { + return "<$priority>1 " . + $date . " " . + $hostname . " " . + $this->ident . " " . + $pid . " - - "; + } } protected function getDateTime() { - return date(\DateTime::RFC3339); + return date($this->dateFormats[$this->rfc]); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php index e39cfc66..478db0ac 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php @@ -67,6 +67,7 @@ class TestHandler extends AbstractProcessingHandler { protected $records = array(); protected $recordsByLevel = array(); + private $skipReset = false; public function getRecords() { @@ -79,19 +80,41 @@ public function clear() $this->recordsByLevel = array(); } + public function reset() + { + if (!$this->skipReset) { + $this->clear(); + } + } + + public function setSkipReset($skipReset) + { + $this->skipReset = $skipReset; + } + public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } + /** + * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records + * @param int $level Logger::LEVEL constant value + */ public function hasRecord($record, $level) { - if (is_array($record)) { - $record = $record['message']; + if (is_string($record)) { + $record = array('message' => $record); } return $this->hasRecordThatPasses(function ($rec) use ($record) { - return $rec['message'] === $record; + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; }, $level); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php index 2732ba3d..7d7622a3 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php @@ -48,6 +48,17 @@ public function handle(array $record) */ public function handleBatch(array $records) { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + $processed[] = $record; + } + $records = $processed; + } + foreach ($this->handlers as $handler) { try { $handler->handleBatch($records); diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php index f22cf218..a20aeae0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php @@ -17,6 +17,7 @@ * Handler sending logs to Zend Monitor * * @author Christian Bergau + * @author Jason Davis */ class ZendMonitorHandler extends AbstractProcessingHandler { @@ -25,16 +26,7 @@ class ZendMonitorHandler extends AbstractProcessingHandler * * @var array */ - protected $levelMap = array( - Logger::DEBUG => 1, - Logger::INFO => 2, - Logger::NOTICE => 3, - Logger::WARNING => 4, - Logger::ERROR => 5, - Logger::CRITICAL => 6, - Logger::ALERT => 7, - Logger::EMERGENCY => 0, - ); + protected $levelMap = array(); /** * Construct @@ -46,8 +38,21 @@ class ZendMonitorHandler extends AbstractProcessingHandler public function __construct($level = Logger::DEBUG, $bubble = true) { if (!function_exists('zend_monitor_custom_event')) { - throw new MissingExtensionException('You must have Zend Server installed in order to use this handler'); + throw new MissingExtensionException( + 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' + ); } + //zend monitor constants are not defined if zend monitor is not enabled. + $this->levelMap = array( + Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, + Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + ); parent::__construct($level, $bubble); } @@ -57,22 +62,23 @@ public function __construct($level = Logger::DEBUG, $bubble = true) protected function write(array $record) { $this->writeZendMonitorCustomEvent( - $this->levelMap[$record['level']], + Logger::getLevelName($record['level']), $record['message'], - $record['formatted'] + $record['formatted'], + $this->levelMap[$record['level']] ); } /** - * Write a record to Zend Monitor - * - * @param int $level - * @param string $message - * @param array $formatted + * Write to Zend Monitor Events + * @param string $type Text displayed in "Class Name (custom)" field + * @param string $message Text displayed in "Error String" + * @param mixed $formatted Displayed in Custom Variables tab + * @param int $severity Set the event severity level (-1,0,1) */ - protected function writeZendMonitorCustomEvent($level, $message, $formatted) + protected function writeZendMonitorCustomEvent($type, $message, $formatted, $severity) { - zend_monitor_custom_event($level, $message, $formatted); + zend_monitor_custom_event($type, $message, $formatted, $severity); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php index 49d00af1..e649af51 100644 --- a/vendor/monolog/monolog/src/Monolog/Logger.php +++ b/vendor/monolog/monolog/src/Monolog/Logger.php @@ -15,6 +15,7 @@ use Monolog\Handler\StreamHandler; use Psr\Log\LoggerInterface; use Psr\Log\InvalidArgumentException; +use Exception; /** * Monolog log channel @@ -24,7 +25,7 @@ * * @author Jordi Boggiano */ -class Logger implements LoggerInterface +class Logger implements LoggerInterface, ResettableInterface { /** * Detailed debug information @@ -133,6 +134,11 @@ class Logger implements LoggerInterface */ protected $microsecondTimestamps = true; + /** + * @var callable + */ + protected $exceptionHandler; + /** * @param string $name The logging channel * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. @@ -141,7 +147,7 @@ class Logger implements LoggerInterface public function __construct($name, array $handlers = array(), array $processors = array()) { $this->name = $name; - $this->handlers = $handlers; + $this->setHandlers($handlers); $this->processors = $processors; } @@ -281,7 +287,7 @@ public function useMicrosecondTimestamps($micro) * @param int $level The logging level * @param string $message The log message * @param array $context The log context - * @return Boolean Whether the record has been processed + * @return bool Whether the record has been processed */ public function addRecord($level, $message, array $context = array()) { @@ -329,27 +335,75 @@ public function addRecord($level, $message, array $context = array()) 'extra' => array(), ); - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); + try { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + + while ($handler = current($this->handlers)) { + if (true === $handler->handle($record)) { + break; + } + + next($this->handlers); + } + } catch (Exception $e) { + $this->handleException($e, $record); } - while ($handler = current($this->handlers)) { - if (true === $handler->handle($record)) { - break; + return true; + } + + /** + * Ends a log cycle and frees all resources used by handlers. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * Handlers that have been closed should be able to accept log records again and re-open + * themselves on demand, but this may not always be possible depending on implementation. + * + * This is useful at the end of a request and will be called automatically on every handler + * when they get destructed. + */ + public function close() + { + foreach ($this->handlers as $handler) { + if (method_exists($handler, 'close')) { + $handler->close(); } + } + } - next($this->handlers); + /** + * Ends a log cycle and resets all handlers and processors to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + */ + public function reset() + { + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } } - return true; + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } } /** * Adds a log record at the DEBUG level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addDebug($message, array $context = array()) { @@ -359,9 +413,9 @@ public function addDebug($message, array $context = array()) /** * Adds a log record at the INFO level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addInfo($message, array $context = array()) { @@ -371,9 +425,9 @@ public function addInfo($message, array $context = array()) /** * Adds a log record at the NOTICE level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addNotice($message, array $context = array()) { @@ -383,9 +437,9 @@ public function addNotice($message, array $context = array()) /** * Adds a log record at the WARNING level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addWarning($message, array $context = array()) { @@ -395,9 +449,9 @@ public function addWarning($message, array $context = array()) /** * Adds a log record at the ERROR level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addError($message, array $context = array()) { @@ -407,9 +461,9 @@ public function addError($message, array $context = array()) /** * Adds a log record at the CRITICAL level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addCritical($message, array $context = array()) { @@ -419,9 +473,9 @@ public function addCritical($message, array $context = array()) /** * Adds a log record at the ALERT level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addAlert($message, array $context = array()) { @@ -431,9 +485,9 @@ public function addAlert($message, array $context = array()) /** * Adds a log record at the EMERGENCY level. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function addEmergency($message, array $context = array()) { @@ -473,8 +527,13 @@ public static function getLevelName($level) */ public static function toMonologLevel($level) { - if (is_string($level) && defined(__CLASS__.'::'.strtoupper($level))) { - return constant(__CLASS__.'::'.strtoupper($level)); + if (is_string($level)) { + // Contains chars of all log levels and avoids using strtoupper() which may have + // strange results depending on locale (for example, "i" will become "İ") + $upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY'); + if (defined(__CLASS__.'::'.$upper)) { + return constant(__CLASS__ . '::' . $upper); + } } return $level; @@ -484,7 +543,7 @@ public static function toMonologLevel($level) * Checks whether the Logger has a handler that listens on the given level * * @param int $level - * @return Boolean + * @return bool */ public function isHandling($level) { @@ -501,15 +560,52 @@ public function isHandling($level) return false; } + /** + * Set a custom exception handler + * + * @param callable $callback + * @return $this + */ + public function setExceptionHandler($callback) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given'); + } + $this->exceptionHandler = $callback; + + return $this; + } + + /** + * @return callable + */ + public function getExceptionHandler() + { + return $this->exceptionHandler; + } + + /** + * Delegates exception management to the custom exception handler, + * or throws the exception if no custom handler is set. + */ + protected function handleException(Exception $e, array $record) + { + if (!$this->exceptionHandler) { + throw $e; + } + + call_user_func($this->exceptionHandler, $e, $record); + } + /** * Adds a log record at an arbitrary level. * * This method allows for compatibility with common interfaces. * * @param mixed $level The log level - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function log($level, $message, array $context = array()) { @@ -523,9 +619,9 @@ public function log($level, $message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function debug($message, array $context = array()) { @@ -537,9 +633,9 @@ public function debug($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function info($message, array $context = array()) { @@ -551,9 +647,9 @@ public function info($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function notice($message, array $context = array()) { @@ -565,9 +661,9 @@ public function notice($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function warn($message, array $context = array()) { @@ -579,9 +675,9 @@ public function warn($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function warning($message, array $context = array()) { @@ -593,9 +689,9 @@ public function warning($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function err($message, array $context = array()) { @@ -607,9 +703,9 @@ public function err($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function error($message, array $context = array()) { @@ -621,9 +717,9 @@ public function error($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function crit($message, array $context = array()) { @@ -635,9 +731,9 @@ public function crit($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function critical($message, array $context = array()) { @@ -649,9 +745,9 @@ public function critical($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function alert($message, array $context = array()) { @@ -663,9 +759,9 @@ public function alert($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function emerg($message, array $context = array()) { @@ -677,9 +773,9 @@ public function emerg($message, array $context = array()) * * This method allows for compatibility with common interfaces. * - * @param string $message The log message - * @param array $context The log context - * @return Boolean Whether the record has been processed + * @param string $message The log message + * @param array $context The log context + * @return bool Whether the record has been processed */ public function emergency($message, array $context = array()) { diff --git a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php index 1899400d..cdf5ec73 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php @@ -19,7 +19,7 @@ * @author Nick Otter * @author Jordi Boggiano */ -class GitProcessor +class GitProcessor implements ProcessorInterface { private $level; private static $cache; @@ -52,7 +52,7 @@ private static function getGitInfo() } $branches = `git branch -v --no-abbrev`; - if (preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { + if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { return self::$cache = array( 'branch' => $matches[1], 'commit' => $matches[2], diff --git a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php index 2c07caed..6ae192a2 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php @@ -24,7 +24,7 @@ * * @author Jordi Boggiano */ -class IntrospectionProcessor +class IntrospectionProcessor implements ProcessorInterface { private $level; diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php index 85f9dc5e..2a379a30 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php @@ -16,7 +16,7 @@ * * @author Rob Jensen */ -abstract class MemoryProcessor +abstract class MemoryProcessor implements ProcessorInterface { /** * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. @@ -34,8 +34,8 @@ abstract class MemoryProcessor */ public function __construct($realUsage = true, $useFormatting = true) { - $this->realUsage = (boolean) $realUsage; - $this->useFormatting = (boolean) $useFormatting; + $this->realUsage = (bool) $realUsage; + $this->useFormatting = (bool) $useFormatting; } /** diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php index 7c07a7e9..2f5b3265 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php @@ -18,7 +18,7 @@ * * @author Jonathan A. Schweder */ -class MercurialProcessor +class MercurialProcessor implements ProcessorInterface { private $level; private static $cache; diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php index 9d3f5590..66b80fbb 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php @@ -16,7 +16,7 @@ * * @author Andreas Hörnicke */ -class ProcessIdProcessor +class ProcessIdProcessor implements ProcessorInterface { /** * @param array $record diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php new file mode 100644 index 00000000..7e64d4df --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * An optional interface to allow labelling Monolog processors. + * + * @author Nicolas Grekas + */ +interface ProcessorInterface +{ + /** + * @return array The processed records + */ + public function __invoke(array $records); +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php index c2686ce5..00885054 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php @@ -11,6 +11,8 @@ namespace Monolog\Processor; +use Monolog\Utils; + /** * Processes a record's message according to PSR-3 rules * @@ -18,7 +20,7 @@ * * @author Jordi Boggiano */ -class PsrLogMessageProcessor +class PsrLogMessageProcessor implements ProcessorInterface { /** * @param array $record @@ -35,7 +37,7 @@ public function __invoke(array $record) if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { $replacements['{'.$key.'}'] = $val; } elseif (is_object($val)) { - $replacements['{'.$key.'}'] = '[object '.get_class($val).']'; + $replacements['{'.$key.'}'] = '[object '.Utils::getClass($val).']'; } else { $replacements['{'.$key.'}'] = '['.gettype($val).']'; } diff --git a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php index 7e2df2ac..615a4d99 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php @@ -16,7 +16,7 @@ * * @author Martijn Riemers */ -class TagProcessor +class TagProcessor implements ProcessorInterface { private $tags; diff --git a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php index 812707cd..d1f708cf 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php @@ -11,12 +11,14 @@ namespace Monolog\Processor; +use Monolog\ResettableInterface; + /** * Adds a unique identifier into records * * @author Simon Mönch */ -class UidProcessor +class UidProcessor implements ProcessorInterface, ResettableInterface { private $uid; @@ -26,7 +28,8 @@ public function __construct($length = 7) throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); } - $this->uid = substr(hash('md5', uniqid('', true)), 0, $length); + + $this->uid = $this->generateUid($length); } public function __invoke(array $record) @@ -43,4 +46,14 @@ public function getUid() { return $this->uid; } + + public function reset() + { + $this->uid = $this->generateUid(strlen($this->uid)); + } + + private function generateUid($length) + { + return substr(hash('md5', uniqid('', true)), 0, $length); + } } diff --git a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php index ea1d8978..2e8dfae1 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php @@ -16,7 +16,7 @@ * * @author Jordi Boggiano */ -class WebProcessor +class WebProcessor implements ProcessorInterface { /** * @var array|\ArrayAccess @@ -52,6 +52,10 @@ public function __construct($serverData = null, array $extraFields = null) throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); } + if (isset($this->serverData['UNIQUE_ID'])) { + $this->extraFields['unique_id'] = 'UNIQUE_ID'; + } + if (null !== $extraFields) { if (isset($extraFields[0])) { foreach (array_keys($this->extraFields) as $fieldName) { @@ -104,10 +108,6 @@ private function appendExtraFields(array $extra) $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null; } - if (isset($this->serverData['UNIQUE_ID'])) { - $extra['unique_id'] = $this->serverData['UNIQUE_ID']; - } - return $extra; } } diff --git a/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php new file mode 100644 index 00000000..635bc77d --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +/** + * Handler or Processor implementing this interface will be reset when Logger::reset() is called. + * + * Resetting ends a log cycle gets them back to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + * + * @author Grégoire Pineau + */ +interface ResettableInterface +{ + public function reset(); +} diff --git a/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/vendor/monolog/monolog/src/Monolog/SignalHandler.php new file mode 100644 index 00000000..d87018fe --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/SignalHandler.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use ReflectionExtension; + +/** + * Monolog POSIX signal handler + * + * @author Robert Gust-Bardon + */ +class SignalHandler +{ + private $logger; + + private $previousSignalHandler = array(); + private $signalLevelMap = array(); + private $signalRestartSyscalls = array(); + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, $callPrevious = true, $restartSyscalls = true, $async = true) + { + if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { + return $this; + } + + if ($callPrevious) { + if (function_exists('pcntl_signal_get_handler')) { + $handler = pcntl_signal_get_handler($signo); + if ($handler === false) { + return $this; + } + $this->previousSignalHandler[$signo] = $handler; + } else { + $this->previousSignalHandler[$signo] = true; + } + } else { + unset($this->previousSignalHandler[$signo]); + } + $this->signalLevelMap[$signo] = $level; + $this->signalRestartSyscalls[$signo] = $restartSyscalls; + + if (function_exists('pcntl_async_signals') && $async !== null) { + pcntl_async_signals($async); + } + + pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); + + return $this; + } + + public function handleSignal($signo, array $siginfo = null) + { + static $signals = array(); + + if (!$signals && extension_loaded('pcntl')) { + $pcntl = new ReflectionExtension('pcntl'); + $constants = $pcntl->getConstants(); + if (!$constants) { + // HHVM 3.24.2 returns an empty array. + $constants = get_defined_constants(true); + $constants = $constants['Core']; + } + foreach ($constants as $name => $value) { + if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { + $signals[$value] = $name; + } + } + unset($constants); + } + + $level = isset($this->signalLevelMap[$signo]) ? $this->signalLevelMap[$signo] : LogLevel::CRITICAL; + $signal = isset($signals[$signo]) ? $signals[$signo] : $signo; + $context = isset($siginfo) ? $siginfo : array(); + $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); + + if (!isset($this->previousSignalHandler[$signo])) { + return; + } + + if ($this->previousSignalHandler[$signo] === true || $this->previousSignalHandler[$signo] === SIG_DFL) { + if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') + && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')) { + $restartSyscalls = isset($this->signalRestartSyscalls[$signo]) ? $this->signalRestartSyscalls[$signo] : true; + pcntl_signal($signo, SIG_DFL, $restartSyscalls); + pcntl_sigprocmask(SIG_UNBLOCK, array($signo), $oldset); + posix_kill(posix_getpid(), $signo); + pcntl_signal_dispatch(); + pcntl_sigprocmask(SIG_SETMASK, $oldset); + pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); + } + } elseif (is_callable($this->previousSignalHandler[$signo])) { + if (PHP_VERSION_ID >= 70100) { + $this->previousSignalHandler[$signo]($signo, $siginfo); + } else { + $this->previousSignalHandler[$signo]($signo); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Utils.php b/vendor/monolog/monolog/src/Monolog/Utils.php new file mode 100644 index 00000000..712b1969 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Utils.php @@ -0,0 +1,189 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +class Utils +{ + /** + * @internal + */ + public static function getClass($object) + { + $class = \get_class($object); + + return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; + } + + /** + * Makes sure if a relative path is passed in it is turned into an absolute path + * + * @param string $streamUrl stream URL or path without protocol + * + * @return string + */ + public static function canonicalizePath($streamUrl) + { + $prefix = ''; + if ('file://' === substr($streamUrl, 0, 7)) { + $streamUrl = substr($streamUrl, 7); + $prefix = 'file://'; + } + + // other type of stream, not supported + if (false !== strpos($streamUrl, '://')) { + return $streamUrl; + } + + // already absolute + if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { + return $prefix.$streamUrl; + } + + $streamUrl = getcwd() . '/' . $streamUrl; + + return $prefix.$streamUrl; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE + * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string + */ + public static function jsonEncode($data, $encodeFlags = null, $ignoreErrors = false) + { + if (null === $encodeFlags && version_compare(PHP_VERSION, '5.4.0', '>=')) { + $encodeFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + } + + if ($ignoreErrors) { + $json = @json_encode($data, $encodeFlags); + if (false === $json) { + return 'null'; + } + + return $json; + } + + $json = json_encode($data, $encodeFlags); + if (false === $json) { + $json = self::handleJsonError(json_last_error(), $data); + } + + return $json; + } + + /** + * Handle a json_encode failure. + * + * If the failure is due to invalid string encoding, try to clean the + * input and encode again. If the second encoding attempt fails, the + * inital error is not encoding related or the input can't be cleaned then + * raise a descriptive exception. + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE + * @throws \RuntimeException if failure can't be corrected + * @return string JSON encoded data after error correction + */ + public static function handleJsonError($code, $data, $encodeFlags = null) + { + if ($code !== JSON_ERROR_UTF8) { + self::throwEncodeError($code, $data); + } + + if (is_string($data)) { + self::detectAndCleanUtf8($data); + } elseif (is_array($data)) { + array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8')); + } else { + self::throwEncodeError($code, $data); + } + + if (null === $encodeFlags && version_compare(PHP_VERSION, '5.4.0', '>=')) { + $encodeFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + } + + $json = json_encode($data, $encodeFlags); + + if ($json === false) { + self::throwEncodeError(json_last_error(), $data); + } + + return $json; + } + + /** + * Throws an exception according to a given code with a customized message + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @throws \RuntimeException + */ + private static function throwEncodeError($code, $data) + { + switch ($code) { + case JSON_ERROR_DEPTH: + $msg = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $msg = 'Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $msg = 'Unexpected control character found'; + break; + case JSON_ERROR_UTF8: + $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $msg = 'Unknown error'; + } + + throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); + } + + /** + * Detect invalid UTF-8 string characters and convert to valid UTF-8. + * + * Valid UTF-8 input will be left unmodified, but strings containing + * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed + * original encoding of ISO-8859-15. This conversion may result in + * incorrect output if the actual encoding was not ISO-8859-15, but it + * will be clean UTF-8 output and will not rely on expensive and fragile + * detection algorithms. + * + * Function converts the input in place in the passed variable so that it + * can be used as a callback for array_walk_recursive. + * + * @param mixed &$data Input to check and convert if needed + * @private + */ + public static function detectAndCleanUtf8(&$data) + { + if (is_string($data) && !preg_match('//u', $data)) { + $data = preg_replace_callback( + '/[\x80-\xFF]+/', + function ($m) { return utf8_encode($m[0]); }, + $data + ); + $data = str_replace( + array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'), + array('€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'), + $data + ); + } + } +} diff --git a/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php deleted file mode 100644 index a9a3f301..00000000 --- a/vendor/monolog/monolog/tests/Monolog/ErrorHandlerTest.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Handler\TestHandler; - -class ErrorHandlerTest extends \PHPUnit_Framework_TestCase -{ - public function testHandleError() - { - $logger = new Logger('test', array($handler = new TestHandler)); - $errHandler = new ErrorHandler($logger); - - $errHandler->registerErrorHandler(array(E_USER_NOTICE => Logger::EMERGENCY), false); - trigger_error('Foo', E_USER_ERROR); - $this->assertCount(1, $handler->getRecords()); - $this->assertTrue($handler->hasErrorRecords()); - trigger_error('Foo', E_USER_NOTICE); - $this->assertCount(2, $handler->getRecords()); - $this->assertTrue($handler->hasEmergencyRecords()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php deleted file mode 100644 index 71c42046..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/ChromePHPFormatterTest.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class ChromePHPFormatterTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Formatter\ChromePHPFormatter::format - */ - public function testDefaultFormat() - { - $formatter = new ChromePHPFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1'), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertEquals( - array( - 'meh', - array( - 'message' => 'log', - 'context' => array('from' => 'logger'), - 'extra' => array('ip' => '127.0.0.1'), - ), - 'unknown', - 'error', - ), - $message - ); - } - - /** - * @covers Monolog\Formatter\ChromePHPFormatter::format - */ - public function testFormatWithFileAndLine() - { - $formatter = new ChromePHPFormatter(); - $record = array( - 'level' => Logger::CRITICAL, - 'level_name' => 'CRITICAL', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertEquals( - array( - 'meh', - array( - 'message' => 'log', - 'context' => array('from' => 'logger'), - 'extra' => array('ip' => '127.0.0.1'), - ), - 'test : 14', - 'error', - ), - $message - ); - } - - /** - * @covers Monolog\Formatter\ChromePHPFormatter::format - */ - public function testFormatWithoutContext() - { - $formatter = new ChromePHPFormatter(); - $record = array( - 'level' => Logger::DEBUG, - 'level_name' => 'DEBUG', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertEquals( - array( - 'meh', - 'log', - 'unknown', - 'log', - ), - $message - ); - } - - /** - * @covers Monolog\Formatter\ChromePHPFormatter::formatBatch - */ - public function testBatchFormatThrowException() - { - $formatter = new ChromePHPFormatter(); - $records = array( - array( - 'level' => Logger::INFO, - 'level_name' => 'INFO', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ), - array( - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'foo', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log2', - ), - ); - - $this->assertEquals( - array( - array( - 'meh', - 'log', - 'unknown', - 'info', - ), - array( - 'foo', - 'log2', - 'unknown', - 'warn', - ), - ), - $formatter->formatBatch($records) - ); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php deleted file mode 100644 index 90cc48dd..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/ElasticaFormatterTest.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class ElasticaFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function setUp() - { - if (!class_exists("Elastica\Document")) { - $this->markTestSkipped("ruflin/elastica not installed"); - } - } - - /** - * @covers Monolog\Formatter\ElasticaFormatter::__construct - * @covers Monolog\Formatter\ElasticaFormatter::format - * @covers Monolog\Formatter\ElasticaFormatter::getDocument - */ - public function testFormat() - { - // test log message - $msg = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - // expected values - $expected = $msg; - $expected['datetime'] = '1970-01-01T00:00:00.000000+00:00'; - $expected['context'] = array( - 'class' => '[object] (stdClass: {})', - 'foo' => 7, - 0 => 'bar', - ); - - // format log message - $formatter = new ElasticaFormatter('my_index', 'doc_type'); - $doc = $formatter->format($msg); - $this->assertInstanceOf('Elastica\Document', $doc); - - // Document parameters - $params = $doc->getParams(); - $this->assertEquals('my_index', $params['_index']); - $this->assertEquals('doc_type', $params['_type']); - - // Document data values - $data = $doc->getData(); - foreach (array_keys($expected) as $key) { - $this->assertEquals($expected[$key], $data[$key]); - } - } - - /** - * @covers Monolog\Formatter\ElasticaFormatter::getIndex - * @covers Monolog\Formatter\ElasticaFormatter::getType - */ - public function testGetters() - { - $formatter = new ElasticaFormatter('my_index', 'doc_type'); - $this->assertEquals('my_index', $formatter->getIndex()); - $this->assertEquals('doc_type', $formatter->getType()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php deleted file mode 100644 index 1b2fd97a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/FlowdockFormatterTest.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\TestCase; - -class FlowdockFormatterTest extends TestCase -{ - /** - * @covers Monolog\Formatter\FlowdockFormatter::format - */ - public function testFormat() - { - $formatter = new FlowdockFormatter('test_source', 'source@test.com'); - $record = $this->getRecord(); - - $expected = array( - 'source' => 'test_source', - 'from_address' => 'source@test.com', - 'subject' => 'in test_source: WARNING - test', - 'content' => 'test', - 'tags' => array('#logs', '#warning', '#test'), - 'project' => 'test_source', - ); - $formatted = $formatter->format($record); - - $this->assertEquals($expected, $formatted['flowdock']); - } - - /** - * @ covers Monolog\Formatter\FlowdockFormatter::formatBatch - */ - public function testFormatBatch() - { - $formatter = new FlowdockFormatter('test_source', 'source@test.com'); - $records = array( - $this->getRecord(Logger::WARNING), - $this->getRecord(Logger::DEBUG), - ); - $formatted = $formatter->formatBatch($records); - - $this->assertArrayHasKey('flowdock', $formatted[0]); - $this->assertArrayHasKey('flowdock', $formatted[1]); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php deleted file mode 100644 index 622b2bae..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\TestCase; - -class FluentdFormatterTest extends TestCase -{ - /** - * @covers Monolog\Formatter\FluentdFormatter::__construct - * @covers Monolog\Formatter\FluentdFormatter::isUsingLevelsInTag - */ - public function testConstruct() - { - $formatter = new FluentdFormatter(); - $this->assertEquals(false, $formatter->isUsingLevelsInTag()); - $formatter = new FluentdFormatter(false); - $this->assertEquals(false, $formatter->isUsingLevelsInTag()); - $formatter = new FluentdFormatter(true); - $this->assertEquals(true, $formatter->isUsingLevelsInTag()); - } - - /** - * @covers Monolog\Formatter\FluentdFormatter::format - */ - public function testFormat() - { - $record = $this->getRecord(Logger::WARNING); - $record['datetime'] = new \DateTime("@0"); - - $formatter = new FluentdFormatter(); - $this->assertEquals( - '["test",0,{"message":"test","extra":[],"level":300,"level_name":"WARNING"}]', - $formatter->format($record) - ); - } - - /** - * @covers Monolog\Formatter\FluentdFormatter::format - */ - public function testFormatWithTag() - { - $record = $this->getRecord(Logger::ERROR); - $record['datetime'] = new \DateTime("@0"); - - $formatter = new FluentdFormatter(true); - $this->assertEquals( - '["test.error",0,{"message":"test","extra":[]}]', - $formatter->format($record) - ); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php deleted file mode 100644 index 4a247616..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/GelfMessageFormatterTest.php +++ /dev/null @@ -1,258 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class GelfMessageFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function setUp() - { - if (!class_exists('\Gelf\Message')) { - $this->markTestSkipped("graylog2/gelf-php or mlehner/gelf-php is not installed"); - } - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testDefaultFormatter() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - $this->assertEquals(0, $message->getTimestamp()); - $this->assertEquals('log', $message->getShortMessage()); - $this->assertEquals('meh', $message->getFacility()); - $this->assertEquals(null, $message->getLine()); - $this->assertEquals(null, $message->getFile()); - $this->assertEquals($this->isLegacy() ? 3 : 'error', $message->getLevel()); - $this->assertNotEmpty($message->getHost()); - - $formatter = new GelfMessageFormatter('mysystem'); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - $this->assertEquals('mysystem', $message->getHost()); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithFileAndLine() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - $this->assertEquals('test', $message->getFile()); - $this->assertEquals(14, $message->getLine()); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - * @expectedException InvalidArgumentException - */ - public function testFormatInvalidFails() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - ); - - $formatter->format($record); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithContext() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_ctxt_from', $message_array); - $this->assertEquals('logger', $message_array['_ctxt_from']); - - // Test with extraPrefix - $formatter = new GelfMessageFormatter(null, null, 'CTX'); - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_CTXfrom', $message_array); - $this->assertEquals('logger', $message_array['_CTXfrom']); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithContextContainingException() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger', 'exception' => array( - 'class' => '\Exception', - 'file' => '/some/file/in/dir.php:56', - 'trace' => array('/some/file/1.php:23', '/some/file/2.php:3'), - )), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $this->assertEquals("/some/file/in/dir.php", $message->getFile()); - $this->assertEquals("56", $message->getLine()); - } - - /** - * @covers Monolog\Formatter\GelfMessageFormatter::format - */ - public function testFormatWithExtra() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_key', $message_array); - $this->assertEquals('pair', $message_array['_key']); - - // Test with extraPrefix - $formatter = new GelfMessageFormatter(null, 'EXT'); - $message = $formatter->format($record); - - $this->assertInstanceOf('Gelf\Message', $message); - - $message_array = $message->toArray(); - - $this->assertArrayHasKey('_EXTkey', $message_array); - $this->assertEquals('pair', $message_array['_EXTkey']); - } - - public function testFormatWithLargeData() - { - $formatter = new GelfMessageFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('exception' => str_repeat(' ', 32767)), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => str_repeat(' ', 32767)), - 'message' => 'log' - ); - $message = $formatter->format($record); - $messageArray = $message->toArray(); - - // 200 for padding + metadata - $length = 200; - - foreach ($messageArray as $key => $value) { - if (!in_array($key, array('level', 'timestamp'))) { - $length += strlen($value); - } - } - - $this->assertLessThanOrEqual(65792, $length, 'The message length is no longer than the maximum allowed length'); - } - - public function testFormatWithUnlimitedLength() - { - $formatter = new GelfMessageFormatter('LONG_SYSTEM_NAME', null, 'ctxt_', PHP_INT_MAX); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('exception' => str_repeat(' ', 32767 * 2)), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => str_repeat(' ', 32767 * 2)), - 'message' => 'log' - ); - $message = $formatter->format($record); - $messageArray = $message->toArray(); - - // 200 for padding + metadata - $length = 200; - - foreach ($messageArray as $key => $value) { - if (!in_array($key, array('level', 'timestamp'))) { - $length += strlen($value); - } - } - - $this->assertGreaterThanOrEqual(131289, $length, 'The message should not be truncated'); - } - - private function isLegacy() - { - return interface_exists('\Gelf\IMessagePublisher'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php deleted file mode 100644 index c9445f36..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php +++ /dev/null @@ -1,183 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; -use Monolog\TestCase; - -class JsonFormatterTest extends TestCase -{ - /** - * @covers Monolog\Formatter\JsonFormatter::__construct - * @covers Monolog\Formatter\JsonFormatter::getBatchMode - * @covers Monolog\Formatter\JsonFormatter::isAppendingNewlines - */ - public function testConstruct() - { - $formatter = new JsonFormatter(); - $this->assertEquals(JsonFormatter::BATCH_MODE_JSON, $formatter->getBatchMode()); - $this->assertEquals(true, $formatter->isAppendingNewlines()); - $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES, false); - $this->assertEquals(JsonFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode()); - $this->assertEquals(false, $formatter->isAppendingNewlines()); - } - - /** - * @covers Monolog\Formatter\JsonFormatter::format - */ - public function testFormat() - { - $formatter = new JsonFormatter(); - $record = $this->getRecord(); - $this->assertEquals(json_encode($record)."\n", $formatter->format($record)); - - $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); - $record = $this->getRecord(); - $this->assertEquals(json_encode($record), $formatter->format($record)); - } - - /** - * @covers Monolog\Formatter\JsonFormatter::formatBatch - * @covers Monolog\Formatter\JsonFormatter::formatBatchJson - */ - public function testFormatBatch() - { - $formatter = new JsonFormatter(); - $records = array( - $this->getRecord(Logger::WARNING), - $this->getRecord(Logger::DEBUG), - ); - $this->assertEquals(json_encode($records), $formatter->formatBatch($records)); - } - - /** - * @covers Monolog\Formatter\JsonFormatter::formatBatch - * @covers Monolog\Formatter\JsonFormatter::formatBatchNewlines - */ - public function testFormatBatchNewlines() - { - $formatter = new JsonFormatter(JsonFormatter::BATCH_MODE_NEWLINES); - $records = $expected = array( - $this->getRecord(Logger::WARNING), - $this->getRecord(Logger::DEBUG), - ); - array_walk($expected, function (&$value, $key) { - $value = json_encode($value); - }); - $this->assertEquals(implode("\n", $expected), $formatter->formatBatch($records)); - } - - public function testDefFormatWithException() - { - $formatter = new JsonFormatter(); - $exception = new \RuntimeException('Foo'); - $formattedException = $this->formatException($exception); - - $message = $this->formatRecordWithExceptionInContext($formatter, $exception); - - $this->assertContextContainsFormattedException($formattedException, $message); - } - - public function testDefFormatWithPreviousException() - { - $formatter = new JsonFormatter(); - $exception = new \RuntimeException('Foo', 0, new \LogicException('Wut?')); - $formattedPrevException = $this->formatException($exception->getPrevious()); - $formattedException = $this->formatException($exception, $formattedPrevException); - - $message = $this->formatRecordWithExceptionInContext($formatter, $exception); - - $this->assertContextContainsFormattedException($formattedException, $message); - } - - public function testDefFormatWithThrowable() - { - if (!class_exists('Error') || !is_subclass_of('Error', 'Throwable')) { - $this->markTestSkipped('Requires PHP >=7'); - } - - $formatter = new JsonFormatter(); - $throwable = new \Error('Foo'); - $formattedThrowable = $this->formatException($throwable); - - $message = $this->formatRecordWithExceptionInContext($formatter, $throwable); - - $this->assertContextContainsFormattedException($formattedThrowable, $message); - } - - /** - * @param string $expected - * @param string $actual - * - * @internal param string $exception - */ - private function assertContextContainsFormattedException($expected, $actual) - { - $this->assertEquals( - '{"level_name":"CRITICAL","channel":"core","context":{"exception":'.$expected.'},"datetime":null,"extra":[],"message":"foobar"}'."\n", - $actual - ); - } - - /** - * @param JsonFormatter $formatter - * @param \Exception|\Throwable $exception - * - * @return string - */ - private function formatRecordWithExceptionInContext(JsonFormatter $formatter, $exception) - { - $message = $formatter->format(array( - 'level_name' => 'CRITICAL', - 'channel' => 'core', - 'context' => array('exception' => $exception), - 'datetime' => null, - 'extra' => array(), - 'message' => 'foobar', - )); - return $message; - } - - /** - * @param \Exception|\Throwable $exception - * - * @return string - */ - private function formatExceptionFilePathWithLine($exception) - { - $options = 0; - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - $options = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; - } - $path = substr(json_encode($exception->getFile(), $options), 1, -1); - return $path . ':' . $exception->getLine(); - } - - /** - * @param \Exception|\Throwable $exception - * - * @param null|string $previous - * - * @return string - */ - private function formatException($exception, $previous = null) - { - $formattedException = - '{"class":"' . get_class($exception) . - '","message":"' . $exception->getMessage() . - '","code":' . $exception->getCode() . - ',"file":"' . $this->formatExceptionFilePathWithLine($exception) . - ($previous ? '","previous":' . $previous : '"') . - '}'; - return $formattedException; - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php deleted file mode 100644 index 310d93ca..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/LineFormatterTest.php +++ /dev/null @@ -1,222 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * @covers Monolog\Formatter\LineFormatter - */ -class LineFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function testDefFormatWithString() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'context' => array(), - 'message' => 'foo', - 'datetime' => new \DateTime, - 'extra' => array(), - )); - $this->assertEquals('['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message); - } - - public function testDefFormatWithArrayContext() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'message' => 'foo', - 'datetime' => new \DateTime, - 'extra' => array(), - 'context' => array( - 'foo' => 'bar', - 'baz' => 'qux', - 'bool' => false, - 'null' => null, - ), - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foo {"foo":"bar","baz":"qux","bool":false,"null":null} []'."\n", $message); - } - - public function testDefFormatExtras() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array('ip' => '127.0.0.1'), - 'message' => 'log', - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] {"ip":"127.0.0.1"}'."\n", $message); - } - - public function testFormatExtras() - { - $formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context% %extra.file% %extra%\n", 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array('ip' => '127.0.0.1', 'file' => 'test'), - 'message' => 'log', - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log [] test {"ip":"127.0.0.1"}'."\n", $message); - } - - public function testContextAndExtraOptionallyNotShownIfEmpty() - { - $formatter = new LineFormatter(null, 'Y-m-d', false, true); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - 'message' => 'log', - )); - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: log '."\n", $message); - } - - public function testContextAndExtraReplacement() - { - $formatter = new LineFormatter('%context.foo% => %extra.foo%'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 'bar'), - 'datetime' => new \DateTime, - 'extra' => array('foo' => 'xbar'), - 'message' => 'log', - )); - $this->assertEquals('bar => xbar', $message); - } - - public function testDefFormatWithObject() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array('foo' => new TestFoo, 'bar' => new TestBar, 'baz' => array(), 'res' => fopen('php://memory', 'rb')), - 'message' => 'foobar', - )); - - $this->assertEquals('['.date('Y-m-d').'] meh.ERROR: foobar [] {"foo":"[object] (Monolog\\\\Formatter\\\\TestFoo: {\\"foo\\":\\"foo\\"})","bar":"[object] (Monolog\\\\Formatter\\\\TestBar: bar)","baz":[],"res":"[resource] (stream)"}'."\n", $message); - } - - public function testDefFormatWithException() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format(array( - 'level_name' => 'CRITICAL', - 'channel' => 'core', - 'context' => array('exception' => new \RuntimeException('Foo')), - 'datetime' => new \DateTime, - 'extra' => array(), - 'message' => 'foobar', - )); - - $path = str_replace('\\/', '/', json_encode(__FILE__)); - - $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).')"} []'."\n", $message); - } - - public function testDefFormatWithPreviousException() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $previous = new \LogicException('Wut?'); - $message = $formatter->format(array( - 'level_name' => 'CRITICAL', - 'channel' => 'core', - 'context' => array('exception' => new \RuntimeException('Foo', 0, $previous)), - 'datetime' => new \DateTime, - 'extra' => array(), - 'message' => 'foobar', - )); - - $path = str_replace('\\/', '/', json_encode(__FILE__)); - - $this->assertEquals('['.date('Y-m-d').'] core.CRITICAL: foobar {"exception":"[object] (RuntimeException(code: 0): Foo at '.substr($path, 1, -1).':'.(__LINE__ - 8).', LogicException(code: 0): Wut? at '.substr($path, 1, -1).':'.(__LINE__ - 12).')"} []'."\n", $message); - } - - public function testBatchFormat() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->formatBatch(array( - array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'message' => 'foo', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - )); - $this->assertEquals('['.date('Y-m-d').'] test.CRITICAL: bar [] []'."\n".'['.date('Y-m-d').'] log.WARNING: foo [] []'."\n", $message); - } - - public function testFormatShouldStripInlineLineBreaks() - { - $formatter = new LineFormatter(null, 'Y-m-d'); - $message = $formatter->format( - array( - 'message' => "foo\nbar", - 'context' => array(), - 'extra' => array(), - ) - ); - - $this->assertRegExp('/foo bar/', $message); - } - - public function testFormatShouldNotStripInlineLineBreaksWhenFlagIsSet() - { - $formatter = new LineFormatter(null, 'Y-m-d', true); - $message = $formatter->format( - array( - 'message' => "foo\nbar", - 'context' => array(), - 'extra' => array(), - ) - ); - - $this->assertRegExp('/foo\nbar/', $message); - } -} - -class TestFoo -{ - public $foo = 'foo'; -} - -class TestBar -{ - public function __toString() - { - return 'bar'; - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php deleted file mode 100644 index 6d59b3f3..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/LogglyFormatterTest.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\TestCase; - -class LogglyFormatterTest extends TestCase -{ - /** - * @covers Monolog\Formatter\LogglyFormatter::__construct - */ - public function testConstruct() - { - $formatter = new LogglyFormatter(); - $this->assertEquals(LogglyFormatter::BATCH_MODE_NEWLINES, $formatter->getBatchMode()); - $formatter = new LogglyFormatter(LogglyFormatter::BATCH_MODE_JSON); - $this->assertEquals(LogglyFormatter::BATCH_MODE_JSON, $formatter->getBatchMode()); - } - - /** - * @covers Monolog\Formatter\LogglyFormatter::format - */ - public function testFormat() - { - $formatter = new LogglyFormatter(); - $record = $this->getRecord(); - $formatted_decoded = json_decode($formatter->format($record), true); - $this->assertArrayHasKey("timestamp", $formatted_decoded); - $this->assertEquals(new \DateTime($formatted_decoded["timestamp"]), $record["datetime"]); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php deleted file mode 100644 index 9f6b1cc4..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/LogstashFormatterTest.php +++ /dev/null @@ -1,333 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class LogstashFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function tearDown() - { - \PHPUnit_Framework_Error_Warning::$enabled = true; - - return parent::tearDown(); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testDefaultFormatter() - { - $formatter = new LogstashFormatter('test', 'hostname'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); - $this->assertEquals('log', $message['@message']); - $this->assertEquals('meh', $message['@fields']['channel']); - $this->assertContains('meh', $message['@tags']); - $this->assertEquals(Logger::ERROR, $message['@fields']['level']); - $this->assertEquals('test', $message['@type']); - $this->assertEquals('hostname', $message['@source']); - - $formatter = new LogstashFormatter('mysystem'); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('mysystem', $message['@type']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithFileAndLine() - { - $formatter = new LogstashFormatter('test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('test', $message['@fields']['file']); - $this->assertEquals(14, $message['@fields']['line']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithContext() - { - $formatter = new LogstashFormatter('test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('ctxt_from', $message_array); - $this->assertEquals('logger', $message_array['ctxt_from']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, null, 'CTX'); - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('CTXfrom', $message_array); - $this->assertEquals('logger', $message_array['CTXfrom']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithExtra() - { - $formatter = new LogstashFormatter('test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('key', $message_array); - $this->assertEquals('pair', $message_array['key']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, 'EXT'); - $message = json_decode($formatter->format($record), true); - - $message_array = $message['@fields']; - - $this->assertArrayHasKey('EXTkey', $message_array); - $this->assertEquals('pair', $message_array['EXTkey']); - } - - public function testFormatWithApplicationName() - { - $formatter = new LogstashFormatter('app', 'test'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('@type', $message); - $this->assertEquals('app', $message['@type']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testDefaultFormatterV1() - { - $formatter = new LogstashFormatter('test', 'hostname', null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); - $this->assertEquals("1", $message['@version']); - $this->assertEquals('log', $message['message']); - $this->assertEquals('meh', $message['channel']); - $this->assertEquals('ERROR', $message['level']); - $this->assertEquals('test', $message['type']); - $this->assertEquals('hostname', $message['host']); - - $formatter = new LogstashFormatter('mysystem', null, null, 'ctxt_', LogstashFormatter::V1); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('mysystem', $message['type']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithFileAndLineV1() - { - $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals('test', $message['file']); - $this->assertEquals(14, $message['line']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithContextV1() - { - $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('ctxt_from', $message); - $this->assertEquals('logger', $message['ctxt_from']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, null, 'CTX', LogstashFormatter::V1); - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('CTXfrom', $message); - $this->assertEquals('logger', $message['CTXfrom']); - } - - /** - * @covers Monolog\Formatter\LogstashFormatter::format - */ - public function testFormatWithExtraV1() - { - $formatter = new LogstashFormatter('test', null, null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('key', $message); - $this->assertEquals('pair', $message['key']); - - // Test with extraPrefix - $formatter = new LogstashFormatter('test', null, 'EXT', 'ctxt_', LogstashFormatter::V1); - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('EXTkey', $message); - $this->assertEquals('pair', $message['EXTkey']); - } - - public function testFormatWithApplicationNameV1() - { - $formatter = new LogstashFormatter('app', 'test', null, 'ctxt_', LogstashFormatter::V1); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('key' => 'pair'), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertArrayHasKey('type', $message); - $this->assertEquals('app', $message['type']); - } - - public function testFormatWithLatin9Data() - { - if (version_compare(PHP_VERSION, '5.5.0', '<')) { - // Ignore the warning that will be emitted by PHP <5.5.0 - \PHPUnit_Framework_Error_Warning::$enabled = false; - } - $formatter = new LogstashFormatter('test', 'hostname'); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => '¯\_(ツ)_/¯', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array( - 'user_agent' => "\xD6WN; FBCR/OrangeEspa\xF1a; Vers\xE3o/4.0; F\xE4rist", - ), - 'message' => 'log', - ); - - $message = json_decode($formatter->format($record), true); - - $this->assertEquals("1970-01-01T00:00:00.000000+00:00", $message['@timestamp']); - $this->assertEquals('log', $message['@message']); - $this->assertEquals('¯\_(ツ)_/¯', $message['@fields']['channel']); - $this->assertContains('¯\_(ツ)_/¯', $message['@tags']); - $this->assertEquals(Logger::ERROR, $message['@fields']['level']); - $this->assertEquals('test', $message['@type']); - $this->assertEquals('hostname', $message['@source']); - if (version_compare(PHP_VERSION, '5.5.0', '>=')) { - $this->assertEquals('ÖWN; FBCR/OrangeEspaña; Versão/4.0; Färist', $message['@fields']['user_agent']); - } else { - // PHP <5.5 does not return false for an element encoding failure, - // instead it emits a warning (possibly) and nulls the value. - $this->assertEquals(null, $message['@fields']['user_agent']); - } - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php deleted file mode 100644 index 52e699e0..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/MongoDBFormatterTest.php +++ /dev/null @@ -1,262 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -/** - * @author Florian Plattner - */ -class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function setUp() - { - if (!class_exists('MongoDate')) { - $this->markTestSkipped('mongo extension not installed'); - } - } - - public function constructArgumentProvider() - { - return array( - array(1, true, 1, true), - array(0, false, 0, false), - ); - } - - /** - * @param $traceDepth - * @param $traceAsString - * @param $expectedTraceDepth - * @param $expectedTraceAsString - * - * @dataProvider constructArgumentProvider - */ - public function testConstruct($traceDepth, $traceAsString, $expectedTraceDepth, $expectedTraceAsString) - { - $formatter = new MongoDBFormatter($traceDepth, $traceAsString); - - $reflTrace = new \ReflectionProperty($formatter, 'exceptionTraceAsString'); - $reflTrace->setAccessible(true); - $this->assertEquals($expectedTraceAsString, $reflTrace->getValue($formatter)); - - $reflDepth = new\ReflectionProperty($formatter, 'maxNestingLevel'); - $reflDepth->setAccessible(true); - $this->assertEquals($expectedTraceDepth, $reflDepth->getValue($formatter)); - } - - public function testSimpleFormat() - { - $record = array( - 'message' => 'some log message', - 'context' => array(), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), - 'extra' => array(), - ); - - $formatter = new MongoDBFormatter(); - $formattedRecord = $formatter->format($record); - - $this->assertCount(7, $formattedRecord); - $this->assertEquals('some log message', $formattedRecord['message']); - $this->assertEquals(array(), $formattedRecord['context']); - $this->assertEquals(Logger::WARNING, $formattedRecord['level']); - $this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']); - $this->assertEquals('test', $formattedRecord['channel']); - $this->assertInstanceOf('\MongoDate', $formattedRecord['datetime']); - $this->assertEquals('0.00000000 1391212800', $formattedRecord['datetime']->__toString()); - $this->assertEquals(array(), $formattedRecord['extra']); - } - - public function testRecursiveFormat() - { - $someObject = new \stdClass(); - $someObject->foo = 'something'; - $someObject->bar = 'stuff'; - - $record = array( - 'message' => 'some log message', - 'context' => array( - 'stuff' => new \DateTime('2014-02-01 02:31:33'), - 'some_object' => $someObject, - 'context_string' => 'some string', - 'context_int' => 123456, - 'except' => new \Exception('exception message', 987), - ), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), - 'extra' => array(), - ); - - $formatter = new MongoDBFormatter(); - $formattedRecord = $formatter->format($record); - - $this->assertCount(5, $formattedRecord['context']); - $this->assertInstanceOf('\MongoDate', $formattedRecord['context']['stuff']); - $this->assertEquals('0.00000000 1391221893', $formattedRecord['context']['stuff']->__toString()); - $this->assertEquals( - array( - 'foo' => 'something', - 'bar' => 'stuff', - 'class' => 'stdClass', - ), - $formattedRecord['context']['some_object'] - ); - $this->assertEquals('some string', $formattedRecord['context']['context_string']); - $this->assertEquals(123456, $formattedRecord['context']['context_int']); - - $this->assertCount(5, $formattedRecord['context']['except']); - $this->assertEquals('exception message', $formattedRecord['context']['except']['message']); - $this->assertEquals(987, $formattedRecord['context']['except']['code']); - $this->assertInternalType('string', $formattedRecord['context']['except']['file']); - $this->assertInternalType('integer', $formattedRecord['context']['except']['code']); - $this->assertInternalType('string', $formattedRecord['context']['except']['trace']); - $this->assertEquals('Exception', $formattedRecord['context']['except']['class']); - } - - public function testFormatDepthArray() - { - $record = array( - 'message' => 'some log message', - 'context' => array( - 'nest2' => array( - 'property' => 'anything', - 'nest3' => array( - 'nest4' => 'value', - 'property' => 'nothing', - ), - ), - ), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), - 'extra' => array(), - ); - - $formatter = new MongoDBFormatter(2); - $formattedResult = $formatter->format($record); - - $this->assertEquals( - array( - 'nest2' => array( - 'property' => 'anything', - 'nest3' => '[...]', - ), - ), - $formattedResult['context'] - ); - } - - public function testFormatDepthArrayInfiniteNesting() - { - $record = array( - 'message' => 'some log message', - 'context' => array( - 'nest2' => array( - 'property' => 'something', - 'nest3' => array( - 'property' => 'anything', - 'nest4' => array( - 'property' => 'nothing', - ), - ), - ), - ), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), - 'extra' => array(), - ); - - $formatter = new MongoDBFormatter(0); - $formattedResult = $formatter->format($record); - - $this->assertEquals( - array( - 'nest2' => array( - 'property' => 'something', - 'nest3' => array( - 'property' => 'anything', - 'nest4' => array( - 'property' => 'nothing', - ), - ), - ), - ), - $formattedResult['context'] - ); - } - - public function testFormatDepthObjects() - { - $someObject = new \stdClass(); - $someObject->property = 'anything'; - $someObject->nest3 = new \stdClass(); - $someObject->nest3->property = 'nothing'; - $someObject->nest3->nest4 = 'invisible'; - - $record = array( - 'message' => 'some log message', - 'context' => array( - 'nest2' => $someObject, - ), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), - 'extra' => array(), - ); - - $formatter = new MongoDBFormatter(2, true); - $formattedResult = $formatter->format($record); - - $this->assertEquals( - array( - 'nest2' => array( - 'property' => 'anything', - 'nest3' => '[...]', - 'class' => 'stdClass', - ), - ), - $formattedResult['context'] - ); - } - - public function testFormatDepthException() - { - $record = array( - 'message' => 'some log message', - 'context' => array( - 'nest2' => new \Exception('exception message', 987), - ), - 'level' => Logger::WARNING, - 'level_name' => Logger::getLevelName(Logger::WARNING), - 'channel' => 'test', - 'datetime' => new \DateTime('2014-02-01 00:00:00'), - 'extra' => array(), - ); - - $formatter = new MongoDBFormatter(2, false); - $formattedRecord = $formatter->format($record); - - $this->assertEquals('exception message', $formattedRecord['context']['nest2']['message']); - $this->assertEquals(987, $formattedRecord['context']['nest2']['code']); - $this->assertEquals('[...]', $formattedRecord['context']['nest2']['trace']); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php deleted file mode 100644 index 57bcdf98..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php +++ /dev/null @@ -1,423 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -/** - * @covers Monolog\Formatter\NormalizerFormatter - */ -class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase -{ - public function tearDown() - { - \PHPUnit_Framework_Error_Warning::$enabled = true; - - return parent::tearDown(); - } - - public function testFormat() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $formatted = $formatter->format(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'message' => 'foo', - 'datetime' => new \DateTime, - 'extra' => array('foo' => new TestFooNorm, 'bar' => new TestBarNorm, 'baz' => array(), 'res' => fopen('php://memory', 'rb')), - 'context' => array( - 'foo' => 'bar', - 'baz' => 'qux', - 'inf' => INF, - '-inf' => -INF, - 'nan' => acos(4), - ), - )); - - $this->assertEquals(array( - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'message' => 'foo', - 'datetime' => date('Y-m-d'), - 'extra' => array( - 'foo' => '[object] (Monolog\\Formatter\\TestFooNorm: {"foo":"foo"})', - 'bar' => '[object] (Monolog\\Formatter\\TestBarNorm: bar)', - 'baz' => array(), - 'res' => '[resource] (stream)', - ), - 'context' => array( - 'foo' => 'bar', - 'baz' => 'qux', - 'inf' => 'INF', - '-inf' => '-INF', - 'nan' => 'NaN', - ), - ), $formatted); - } - - public function testFormatExceptions() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $e = new \LogicException('bar'); - $e2 = new \RuntimeException('foo', 0, $e); - $formatted = $formatter->format(array( - 'exception' => $e2, - )); - - $this->assertGreaterThan(5, count($formatted['exception']['trace'])); - $this->assertTrue(isset($formatted['exception']['previous'])); - unset($formatted['exception']['trace'], $formatted['exception']['previous']); - - $this->assertEquals(array( - 'exception' => array( - 'class' => get_class($e2), - 'message' => $e2->getMessage(), - 'code' => $e2->getCode(), - 'file' => $e2->getFile().':'.$e2->getLine(), - ), - ), $formatted); - } - - public function testFormatSoapFaultException() - { - if (!class_exists('SoapFault')) { - $this->markTestSkipped('Requires the soap extension'); - } - - $formatter = new NormalizerFormatter('Y-m-d'); - $e = new \SoapFault('foo', 'bar', 'hello', 'world'); - $formatted = $formatter->format(array( - 'exception' => $e, - )); - - unset($formatted['exception']['trace']); - - $this->assertEquals(array( - 'exception' => array( - 'class' => 'SoapFault', - 'message' => 'bar', - 'code' => 0, - 'file' => $e->getFile().':'.$e->getLine(), - 'faultcode' => 'foo', - 'faultactor' => 'hello', - 'detail' => 'world', - ), - ), $formatted); - } - - public function testFormatToStringExceptionHandle() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $this->setExpectedException('RuntimeException', 'Could not convert to string'); - $formatter->format(array( - 'myObject' => new TestToStringError(), - )); - } - - public function testBatchFormat() - { - $formatter = new NormalizerFormatter('Y-m-d'); - $formatted = $formatter->formatBatch(array( - array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'message' => 'foo', - 'context' => array(), - 'datetime' => new \DateTime, - 'extra' => array(), - ), - )); - $this->assertEquals(array( - array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array(), - 'datetime' => date('Y-m-d'), - 'extra' => array(), - ), - array( - 'level_name' => 'WARNING', - 'channel' => 'log', - 'message' => 'foo', - 'context' => array(), - 'datetime' => date('Y-m-d'), - 'extra' => array(), - ), - ), $formatted); - } - - /** - * Test issue #137 - */ - public function testIgnoresRecursiveObjectReferences() - { - // set up the recursion - $foo = new \stdClass(); - $bar = new \stdClass(); - - $foo->bar = $bar; - $bar->foo = $foo; - - // set an error handler to assert that the error is not raised anymore - $that = $this; - set_error_handler(function ($level, $message, $file, $line, $context) use ($that) { - if (error_reporting() & $level) { - restore_error_handler(); - $that->fail("$message should not be raised"); - } - }); - - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'toJson'); - $reflMethod->setAccessible(true); - $res = $reflMethod->invoke($formatter, array($foo, $bar), true); - - restore_error_handler(); - - $this->assertEquals(@json_encode(array($foo, $bar)), $res); - } - - public function testIgnoresInvalidTypes() - { - // set up the recursion - $resource = fopen(__FILE__, 'r'); - - // set an error handler to assert that the error is not raised anymore - $that = $this; - set_error_handler(function ($level, $message, $file, $line, $context) use ($that) { - if (error_reporting() & $level) { - restore_error_handler(); - $that->fail("$message should not be raised"); - } - }); - - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'toJson'); - $reflMethod->setAccessible(true); - $res = $reflMethod->invoke($formatter, array($resource), true); - - restore_error_handler(); - - $this->assertEquals(@json_encode(array($resource)), $res); - } - - public function testNormalizeHandleLargeArrays() - { - $formatter = new NormalizerFormatter(); - $largeArray = range(1, 2000); - - $res = $formatter->format(array( - 'level_name' => 'CRITICAL', - 'channel' => 'test', - 'message' => 'bar', - 'context' => array($largeArray), - 'datetime' => new \DateTime, - 'extra' => array(), - )); - - $this->assertCount(1000, $res['context'][0]); - $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']); - } - - /** - * @expectedException RuntimeException - */ - public function testThrowsOnInvalidEncoding() - { - if (version_compare(PHP_VERSION, '5.5.0', '<')) { - // Ignore the warning that will be emitted by PHP <5.5.0 - \PHPUnit_Framework_Error_Warning::$enabled = false; - } - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'toJson'); - $reflMethod->setAccessible(true); - - // send an invalid unicode sequence as a object that can't be cleaned - $record = new \stdClass; - $record->message = "\xB1\x31"; - $res = $reflMethod->invoke($formatter, $record); - if (PHP_VERSION_ID < 50500 && $res === '{"message":null}') { - throw new \RuntimeException('PHP 5.3/5.4 throw a warning and null the value instead of returning false entirely'); - } - } - - public function testConvertsInvalidEncodingAsLatin9() - { - if (version_compare(PHP_VERSION, '5.5.0', '<')) { - // Ignore the warning that will be emitted by PHP <5.5.0 - \PHPUnit_Framework_Error_Warning::$enabled = false; - } - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'toJson'); - $reflMethod->setAccessible(true); - - $res = $reflMethod->invoke($formatter, array('message' => "\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE")); - - if (version_compare(PHP_VERSION, '5.5.0', '>=')) { - $this->assertSame('{"message":"€ŠšŽžŒœŸ"}', $res); - } else { - // PHP <5.5 does not return false for an element encoding failure, - // instead it emits a warning (possibly) and nulls the value. - $this->assertSame('{"message":null}', $res); - } - } - - /** - * @param mixed $in Input - * @param mixed $expect Expected output - * @covers Monolog\Formatter\NormalizerFormatter::detectAndCleanUtf8 - * @dataProvider providesDetectAndCleanUtf8 - */ - public function testDetectAndCleanUtf8($in, $expect) - { - $formatter = new NormalizerFormatter(); - $formatter->detectAndCleanUtf8($in); - $this->assertSame($expect, $in); - } - - public function providesDetectAndCleanUtf8() - { - $obj = new \stdClass; - - return array( - 'null' => array(null, null), - 'int' => array(123, 123), - 'float' => array(123.45, 123.45), - 'bool false' => array(false, false), - 'bool true' => array(true, true), - 'ascii string' => array('abcdef', 'abcdef'), - 'latin9 string' => array("\xB1\x31\xA4\xA6\xA8\xB4\xB8\xBC\xBD\xBE\xFF", '±1€ŠšŽžŒœŸÿ'), - 'unicode string' => array('¤¦¨´¸¼½¾€ŠšŽžŒœŸ', '¤¦¨´¸¼½¾€ŠšŽžŒœŸ'), - 'empty array' => array(array(), array()), - 'array' => array(array('abcdef'), array('abcdef')), - 'object' => array($obj, $obj), - ); - } - - /** - * @param int $code - * @param string $msg - * @dataProvider providesHandleJsonErrorFailure - */ - public function testHandleJsonErrorFailure($code, $msg) - { - $formatter = new NormalizerFormatter(); - $reflMethod = new \ReflectionMethod($formatter, 'handleJsonError'); - $reflMethod->setAccessible(true); - - $this->setExpectedException('RuntimeException', $msg); - $reflMethod->invoke($formatter, $code, 'faked'); - } - - public function providesHandleJsonErrorFailure() - { - return array( - 'depth' => array(JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'), - 'state' => array(JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'), - 'ctrl' => array(JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'), - 'default' => array(-1, 'Unknown error'), - ); - } - - public function testExceptionTraceWithArgs() - { - if (defined('HHVM_VERSION')) { - $this->markTestSkipped('Not supported in HHVM since it detects errors differently'); - } - - // This happens i.e. in React promises or Guzzle streams where stream wrappers are registered - // and no file or line are included in the trace because it's treated as internal function - set_error_handler(function ($errno, $errstr, $errfile, $errline) { - throw new \ErrorException($errstr, 0, $errno, $errfile, $errline); - }); - - try { - // This will contain $resource and $wrappedResource as arguments in the trace item - $resource = fopen('php://memory', 'rw+'); - fwrite($resource, 'test_resource'); - $wrappedResource = new TestFooNorm; - $wrappedResource->foo = $resource; - // Just do something stupid with a resource/wrapped resource as argument - array_keys($wrappedResource); - } catch (\Exception $e) { - restore_error_handler(); - } - - $formatter = new NormalizerFormatter(); - $record = array('context' => array('exception' => $e)); - $result = $formatter->format($record); - - $this->assertRegExp( - '%"resource":"\[resource\] \(stream\)"%', - $result['context']['exception']['trace'][0] - ); - - if (version_compare(PHP_VERSION, '5.5.0', '>=')) { - $pattern = '%"wrappedResource":"\[object\] \(Monolog\\\\\\\\Formatter\\\\\\\\TestFooNorm: \)"%'; - } else { - $pattern = '%\\\\"foo\\\\":null%'; - } - - // Tests that the wrapped resource is ignored while encoding, only works for PHP <= 5.4 - $this->assertRegExp( - $pattern, - $result['context']['exception']['trace'][0] - ); - } -} - -class TestFooNorm -{ - public $foo = 'foo'; -} - -class TestBarNorm -{ - public function __toString() - { - return 'bar'; - } -} - -class TestStreamFoo -{ - public $foo; - public $resource; - - public function __construct($resource) - { - $this->resource = $resource; - $this->foo = 'BAR'; - } - - public function __toString() - { - fseek($this->resource, 0); - - return $this->foo . ' - ' . (string) stream_get_contents($this->resource); - } -} - -class TestToStringError -{ - public function __toString() - { - throw new \RuntimeException('Could not convert to string'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php deleted file mode 100644 index b1c8fd49..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/ScalarFormatterTest.php +++ /dev/null @@ -1,110 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -class ScalarFormatterTest extends \PHPUnit_Framework_TestCase -{ - private $formatter; - - public function setUp() - { - $this->formatter = new ScalarFormatter(); - } - - public function buildTrace(\Exception $e) - { - $data = array(); - $trace = $e->getTrace(); - foreach ($trace as $frame) { - if (isset($frame['file'])) { - $data[] = $frame['file'].':'.$frame['line']; - } else { - $data[] = json_encode($frame); - } - } - - return $data; - } - - public function encodeJson($data) - { - if (version_compare(PHP_VERSION, '5.4.0', '>=')) { - return json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - return json_encode($data); - } - - public function testFormat() - { - $exception = new \Exception('foo'); - $formatted = $this->formatter->format(array( - 'foo' => 'string', - 'bar' => 1, - 'baz' => false, - 'bam' => array(1, 2, 3), - 'bat' => array('foo' => 'bar'), - 'bap' => \DateTime::createFromFormat(\DateTime::ISO8601, '1970-01-01T00:00:00+0000'), - 'ban' => $exception, - )); - - $this->assertSame(array( - 'foo' => 'string', - 'bar' => 1, - 'baz' => false, - 'bam' => $this->encodeJson(array(1, 2, 3)), - 'bat' => $this->encodeJson(array('foo' => 'bar')), - 'bap' => '1970-01-01 00:00:00', - 'ban' => $this->encodeJson(array( - 'class' => get_class($exception), - 'message' => $exception->getMessage(), - 'code' => $exception->getCode(), - 'file' => $exception->getFile() . ':' . $exception->getLine(), - 'trace' => $this->buildTrace($exception), - )), - ), $formatted); - } - - public function testFormatWithErrorContext() - { - $context = array('file' => 'foo', 'line' => 1); - $formatted = $this->formatter->format(array( - 'context' => $context, - )); - - $this->assertSame(array( - 'context' => $this->encodeJson($context), - ), $formatted); - } - - public function testFormatWithExceptionContext() - { - $exception = new \Exception('foo'); - $formatted = $this->formatter->format(array( - 'context' => array( - 'exception' => $exception, - ), - )); - - $this->assertSame(array( - 'context' => $this->encodeJson(array( - 'exception' => array( - 'class' => get_class($exception), - 'message' => $exception->getMessage(), - 'code' => $exception->getCode(), - 'file' => $exception->getFile() . ':' . $exception->getLine(), - 'trace' => $this->buildTrace($exception), - ), - )), - ), $formatted); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php deleted file mode 100644 index 52f15a36..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Formatter/WildfireFormatterTest.php +++ /dev/null @@ -1,142 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Formatter; - -use Monolog\Logger; - -class WildfireFormatterTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testDefaultFormat() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1'), - 'message' => 'log', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '125|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},' - .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|', - $message - ); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testFormatWithFileAndLine() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('from' => 'logger'), - 'datetime' => new \DateTime("@0"), - 'extra' => array('ip' => '127.0.0.1', 'file' => 'test', 'line' => 14), - 'message' => 'log', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '129|[{"Type":"ERROR","File":"test","Line":14,"Label":"meh"},' - .'{"message":"log","context":{"from":"logger"},"extra":{"ip":"127.0.0.1"}}]|', - $message - ); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testFormatWithoutContext() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '58|[{"Type":"ERROR","File":"","Line":"","Label":"meh"},"log"]|', - $message - ); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::formatBatch - * @expectedException BadMethodCallException - */ - public function testBatchFormatThrowException() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array(), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $wildfire->formatBatch(array($record)); - } - - /** - * @covers Monolog\Formatter\WildfireFormatter::format - */ - public function testTableFormat() - { - $wildfire = new WildfireFormatter(); - $record = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'table-channel', - 'context' => array( - WildfireFormatter::TABLE => array( - array('col1', 'col2', 'col3'), - array('val1', 'val2', 'val3'), - array('foo1', 'foo2', 'foo3'), - array('bar1', 'bar2', 'bar3'), - ), - ), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'table-message', - ); - - $message = $wildfire->format($record); - - $this->assertEquals( - '171|[{"Type":"TABLE","File":"","Line":"","Label":"table-channel: table-message"},[["col1","col2","col3"],["val1","val2","val3"],["foo1","foo2","foo3"],["bar1","bar2","bar3"]]]|', - $message - ); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php deleted file mode 100644 index 568eb9da..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractHandlerTest.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; -use Monolog\Processor\WebProcessor; - -class AbstractHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\AbstractHandler::__construct - * @covers Monolog\Handler\AbstractHandler::getLevel - * @covers Monolog\Handler\AbstractHandler::setLevel - * @covers Monolog\Handler\AbstractHandler::getBubble - * @covers Monolog\Handler\AbstractHandler::setBubble - * @covers Monolog\Handler\AbstractHandler::getFormatter - * @covers Monolog\Handler\AbstractHandler::setFormatter - */ - public function testConstructAndGetSet() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false)); - $this->assertEquals(Logger::WARNING, $handler->getLevel()); - $this->assertEquals(false, $handler->getBubble()); - - $handler->setLevel(Logger::ERROR); - $handler->setBubble(true); - $handler->setFormatter($formatter = new LineFormatter); - $this->assertEquals(Logger::ERROR, $handler->getLevel()); - $this->assertEquals(true, $handler->getBubble()); - $this->assertSame($formatter, $handler->getFormatter()); - } - - /** - * @covers Monolog\Handler\AbstractHandler::handleBatch - */ - public function testHandleBatch() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - $handler->expects($this->exactly(2)) - ->method('handle'); - $handler->handleBatch(array($this->getRecord(), $this->getRecord())); - } - - /** - * @covers Monolog\Handler\AbstractHandler::isHandling - */ - public function testIsHandling() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array(Logger::WARNING, false)); - $this->assertTrue($handler->isHandling($this->getRecord())); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractHandler::__construct - */ - public function testHandlesPsrStyleLevels() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler', array('warning', false)); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - $handler->setLevel('debug'); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractHandler::getFormatter - * @covers Monolog\Handler\AbstractHandler::getDefaultFormatter - */ - public function testGetFormatterInitializesDefault() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - $this->assertInstanceOf('Monolog\Formatter\LineFormatter', $handler->getFormatter()); - } - - /** - * @covers Monolog\Handler\AbstractHandler::pushProcessor - * @covers Monolog\Handler\AbstractHandler::popProcessor - * @expectedException LogicException - */ - public function testPushPopProcessor() - { - $logger = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - $processor1 = new WebProcessor; - $processor2 = new WebProcessor; - - $logger->pushProcessor($processor1); - $logger->pushProcessor($processor2); - - $this->assertEquals($processor2, $logger->popProcessor()); - $this->assertEquals($processor1, $logger->popProcessor()); - $logger->popProcessor(); - } - - /** - * @covers Monolog\Handler\AbstractHandler::pushProcessor - * @expectedException InvalidArgumentException - */ - public function testPushProcessorWithNonCallable() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractHandler'); - - $handler->pushProcessor(new \stdClass()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php deleted file mode 100644 index 24d4f63c..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/AbstractProcessingHandlerTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Processor\WebProcessor; - -class AbstractProcessingHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleLowerLevelMessage() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, true)); - $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleBubbling() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, true)); - $this->assertFalse($handler->handle($this->getRecord())); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleNotBubbling() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::DEBUG, false)); - $this->assertTrue($handler->handle($this->getRecord())); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::handle - */ - public function testHandleIsFalseWhenNotHandled() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler', array(Logger::WARNING, false)); - $this->assertTrue($handler->handle($this->getRecord())); - $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\AbstractProcessingHandler::processRecord - */ - public function testProcessRecord() - { - $handler = $this->getMockForAbstractClass('Monolog\Handler\AbstractProcessingHandler'); - $handler->pushProcessor(new WebProcessor(array( - 'REQUEST_URI' => '', - 'REQUEST_METHOD' => '', - 'REMOTE_ADDR' => '', - 'SERVER_NAME' => '', - 'UNIQUE_ID' => '', - ))); - $handledRecord = null; - $handler->expects($this->once()) - ->method('write') - ->will($this->returnCallback(function ($record) use (&$handledRecord) { - $handledRecord = $record; - })) - ; - $handler->handle($this->getRecord()); - $this->assertEquals(6, count($handledRecord['extra'])); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php deleted file mode 100644 index 8e0e7237..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/AmqpHandlerTest.php +++ /dev/null @@ -1,136 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use PhpAmqpLib\Message\AMQPMessage; -use PhpAmqpLib\Connection\AMQPConnection; - -/** - * @covers Monolog\Handler\RotatingFileHandler - */ -class AmqpHandlerTest extends TestCase -{ - public function testHandleAmqpExt() - { - if (!class_exists('AMQPConnection') || !class_exists('AMQPExchange')) { - $this->markTestSkipped("amqp-php not installed"); - } - - if (!class_exists('AMQPChannel')) { - $this->markTestSkipped("Please update AMQP to version >= 1.0"); - } - - $messages = array(); - - $exchange = $this->getMock('AMQPExchange', array('publish', 'setName'), array(), '', false); - $exchange->expects($this->once()) - ->method('setName') - ->with('log') - ; - $exchange->expects($this->any()) - ->method('publish') - ->will($this->returnCallback(function ($message, $routing_key, $flags = 0, $attributes = array()) use (&$messages) { - $messages[] = array($message, $routing_key, $flags, $attributes); - })) - ; - - $handler = new AmqpHandler($exchange, 'log'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - array( - 'message' => 'test', - 'context' => array( - 'data' => array(), - 'foo' => 34, - ), - 'level' => 300, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'extra' => array(), - ), - 'warn.test', - 0, - array( - 'delivery_mode' => 2, - 'content_type' => 'application/json', - ), - ); - - $handler->handle($record); - - $this->assertCount(1, $messages); - $messages[0][0] = json_decode($messages[0][0], true); - unset($messages[0][0]['datetime']); - $this->assertEquals($expected, $messages[0]); - } - - public function testHandlePhpAmqpLib() - { - if (!class_exists('PhpAmqpLib\Connection\AMQPConnection')) { - $this->markTestSkipped("php-amqplib not installed"); - } - - $messages = array(); - - $exchange = $this->getMock('PhpAmqpLib\Channel\AMQPChannel', array('basic_publish', '__destruct'), array(), '', false); - - $exchange->expects($this->any()) - ->method('basic_publish') - ->will($this->returnCallback(function (AMQPMessage $msg, $exchange = "", $routing_key = "", $mandatory = false, $immediate = false, $ticket = null) use (&$messages) { - $messages[] = array($msg, $exchange, $routing_key, $mandatory, $immediate, $ticket); - })) - ; - - $handler = new AmqpHandler($exchange, 'log'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - array( - 'message' => 'test', - 'context' => array( - 'data' => array(), - 'foo' => 34, - ), - 'level' => 300, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'extra' => array(), - ), - 'log', - 'warn.test', - false, - false, - null, - array( - 'delivery_mode' => 2, - 'content_type' => 'application/json', - ), - ); - - $handler->handle($record); - - $this->assertCount(1, $messages); - - /* @var $msg AMQPMessage */ - $msg = $messages[0][0]; - $messages[0][0] = json_decode($msg->body, true); - $messages[0][] = $msg->get_properties(); - unset($messages[0][0]['datetime']); - - $this->assertEquals($expected, $messages[0]); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php deleted file mode 100644 index ffb1d746..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\BrowserConsoleHandlerTest - */ -class BrowserConsoleHandlerTest extends TestCase -{ - protected function setUp() - { - BrowserConsoleHandler::reset(); - } - - protected function generateScript() - { - $reflMethod = new \ReflectionMethod('Monolog\Handler\BrowserConsoleHandler', 'generateScript'); - $reflMethod->setAccessible(true); - - return $reflMethod->invoke(null); - } - - public function testStyling() - { - $handler = new BrowserConsoleHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - - $handler->handle($this->getRecord(Logger::DEBUG, 'foo[[bar]]{color: red}')); - - $expected = <<assertEquals($expected, $this->generateScript()); - } - - public function testEscaping() - { - $handler = new BrowserConsoleHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - - $handler->handle($this->getRecord(Logger::DEBUG, "[foo] [[\"bar\n[baz]\"]]{color: red}")); - - $expected = <<assertEquals($expected, $this->generateScript()); - } - - public function testAutolabel() - { - $handler = new BrowserConsoleHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - - $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}')); - $handler->handle($this->getRecord(Logger::DEBUG, '[[bar]]{macro: autolabel}')); - $handler->handle($this->getRecord(Logger::DEBUG, '[[foo]]{macro: autolabel}')); - - $expected = <<assertEquals($expected, $this->generateScript()); - } - - public function testContext() - { - $handler = new BrowserConsoleHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - - $handler->handle($this->getRecord(Logger::DEBUG, 'test', array('foo' => 'bar'))); - - $expected = <<assertEquals($expected, $this->generateScript()); - } - - public function testConcurrentHandlers() - { - $handler1 = new BrowserConsoleHandler(); - $handler1->setFormatter($this->getIdentityFormatter()); - - $handler2 = new BrowserConsoleHandler(); - $handler2->setFormatter($this->getIdentityFormatter()); - - $handler1->handle($this->getRecord(Logger::DEBUG, 'test1')); - $handler2->handle($this->getRecord(Logger::DEBUG, 'test2')); - $handler1->handle($this->getRecord(Logger::DEBUG, 'test3')); - $handler2->handle($this->getRecord(Logger::DEBUG, 'test4')); - - $expected = <<assertEquals($expected, $this->generateScript()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php deleted file mode 100644 index da8b3c39..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/BufferHandlerTest.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class BufferHandlerTest extends TestCase -{ - private $shutdownCheckHandler; - - /** - * @covers Monolog\Handler\BufferHandler::__construct - * @covers Monolog\Handler\BufferHandler::handle - * @covers Monolog\Handler\BufferHandler::close - */ - public function testHandleBuffers() - { - $test = new TestHandler(); - $handler = new BufferHandler($test); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - $handler->close(); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - - /** - * @covers Monolog\Handler\BufferHandler::close - * @covers Monolog\Handler\BufferHandler::flush - */ - public function testPropagatesRecordsAtEndOfRequest() - { - $test = new TestHandler(); - $handler = new BufferHandler($test); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->shutdownCheckHandler = $test; - register_shutdown_function(array($this, 'checkPropagation')); - } - - public function checkPropagation() - { - if (!$this->shutdownCheckHandler->hasWarningRecords() || !$this->shutdownCheckHandler->hasDebugRecords()) { - echo '!!! BufferHandlerTest::testPropagatesRecordsAtEndOfRequest failed to verify that the messages have been propagated' . PHP_EOL; - exit(1); - } - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleBufferLimit() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 2); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertFalse($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleBufferLimitWithFlushOnOverflow() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 3, Logger::DEBUG, true, true); - - // send two records - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertCount(0, $test->getRecords()); - - // overflow - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasDebugRecords()); - $this->assertCount(3, $test->getRecords()); - - // should buffer again - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertCount(3, $test->getRecords()); - - $handler->close(); - $this->assertCount(5, $test->getRecords()); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleLevel() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 0, Logger::INFO); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertFalse($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::flush - */ - public function testFlush() - { - $test = new TestHandler(); - $handler = new BufferHandler($test, 0); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->flush(); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\BufferHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new BufferHandler($test); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->flush(); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php deleted file mode 100644 index 0449f8b1..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php +++ /dev/null @@ -1,156 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\ChromePHPHandler - */ -class ChromePHPHandlerTest extends TestCase -{ - protected function setUp() - { - TestChromePHPHandler::reset(); - $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; Chrome/1.0'; - } - - /** - * @dataProvider agentsProvider - */ - public function testHeaders($agent) - { - $_SERVER['HTTP_USER_AGENT'] = $agent; - - $handler = new TestChromePHPHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( - 'version' => ChromePHPHandler::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array( - 'test', - 'test', - ), - 'request_uri' => '', - )))), - ); - - $this->assertEquals($expected, $handler->getHeaders()); - } - - public static function agentsProvider() - { - return array( - array('Monolog Test; Chrome/1.0'), - array('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'), - array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/56.0.2924.76 Chrome/56.0.2924.76 Safari/537.36'), - array('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36'), - ); - } - - public function testHeadersOverflow() - { - $handler = new TestChromePHPHandler(); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 150 * 1024))); - - // overflow chrome headers limit - $handler->handle($this->getRecord(Logger::WARNING, str_repeat('a', 100 * 1024))); - - $expected = array( - 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( - 'version' => ChromePHPHandler::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array( - array( - 'test', - 'test', - 'unknown', - 'log', - ), - array( - 'test', - str_repeat('a', 150 * 1024), - 'unknown', - 'warn', - ), - array( - 'monolog', - 'Incomplete logs, chrome header size limit reached', - 'unknown', - 'warn', - ), - ), - 'request_uri' => '', - )))), - ); - - $this->assertEquals($expected, $handler->getHeaders()); - } - - public function testConcurrentHandlers() - { - $handler = new TestChromePHPHandler(); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $handler2 = new TestChromePHPHandler(); - $handler2->setFormatter($this->getIdentityFormatter()); - $handler2->handle($this->getRecord(Logger::DEBUG)); - $handler2->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-ChromeLogger-Data' => base64_encode(utf8_encode(json_encode(array( - 'version' => ChromePHPHandler::VERSION, - 'columns' => array('label', 'log', 'backtrace', 'type'), - 'rows' => array( - 'test', - 'test', - 'test', - 'test', - ), - 'request_uri' => '', - )))), - ); - - $this->assertEquals($expected, $handler2->getHeaders()); - } -} - -class TestChromePHPHandler extends ChromePHPHandler -{ - protected $headers = array(); - - public static function reset() - { - self::$initialized = false; - self::$overflowed = false; - self::$sendHeaders = true; - self::$json['rows'] = array(); - } - - protected function sendHeader($header, $content) - { - $this->headers[$header] = $content; - } - - public function getHeaders() - { - return $this->headers; - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php deleted file mode 100644 index 9fc4b388..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/CouchDBHandlerTest.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class CouchDBHandlerTest extends TestCase -{ - public function testHandle() - { - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new CouchDBHandler(); - - try { - $handler->handle($record); - } catch (\RuntimeException $e) { - $this->markTestSkipped('Could not connect to couchdb server on http://localhost:5984'); - } - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php deleted file mode 100644 index e2aff868..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/DeduplicationHandlerTest.php +++ /dev/null @@ -1,165 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class DeduplicationHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\DeduplicationHandler::flush - */ - public function testFlushPassthruIfAllRecordsUnderTrigger() - { - $test = new TestHandler(); - @unlink(sys_get_temp_dir().'/monolog_dedup.log'); - $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); - - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - - $handler->flush(); - - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\DeduplicationHandler::flush - * @covers Monolog\Handler\DeduplicationHandler::appendRecord - */ - public function testFlushPassthruIfEmptyLog() - { - $test = new TestHandler(); - @unlink(sys_get_temp_dir().'/monolog_dedup.log'); - $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); - - $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar')); - $handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar")); - - $handler->flush(); - - $this->assertTrue($test->hasErrorRecords()); - $this->assertTrue($test->hasCriticalRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\DeduplicationHandler::flush - * @covers Monolog\Handler\DeduplicationHandler::appendRecord - * @covers Monolog\Handler\DeduplicationHandler::isDuplicate - * @depends testFlushPassthruIfEmptyLog - */ - public function testFlushSkipsIfLogExists() - { - $test = new TestHandler(); - $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); - - $handler->handle($this->getRecord(Logger::ERROR, 'Foo:bar')); - $handler->handle($this->getRecord(Logger::CRITICAL, "Foo\nbar")); - - $handler->flush(); - - $this->assertFalse($test->hasErrorRecords()); - $this->assertFalse($test->hasCriticalRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\DeduplicationHandler::flush - * @covers Monolog\Handler\DeduplicationHandler::appendRecord - * @covers Monolog\Handler\DeduplicationHandler::isDuplicate - * @depends testFlushPassthruIfEmptyLog - */ - public function testFlushPassthruIfLogTooOld() - { - $test = new TestHandler(); - $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); - - $record = $this->getRecord(Logger::ERROR); - $record['datetime']->modify('+62seconds'); - $handler->handle($record); - $record = $this->getRecord(Logger::CRITICAL); - $record['datetime']->modify('+62seconds'); - $handler->handle($record); - - $handler->flush(); - - $this->assertTrue($test->hasErrorRecords()); - $this->assertTrue($test->hasCriticalRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\DeduplicationHandler::flush - * @covers Monolog\Handler\DeduplicationHandler::appendRecord - * @covers Monolog\Handler\DeduplicationHandler::isDuplicate - * @covers Monolog\Handler\DeduplicationHandler::collectLogs - */ - public function testGcOldLogs() - { - $test = new TestHandler(); - @unlink(sys_get_temp_dir().'/monolog_dedup.log'); - $handler = new DeduplicationHandler($test, sys_get_temp_dir().'/monolog_dedup.log', 0); - - // handle two records from yesterday, and one recent - $record = $this->getRecord(Logger::ERROR); - $record['datetime']->modify('-1day -10seconds'); - $handler->handle($record); - $record2 = $this->getRecord(Logger::CRITICAL); - $record2['datetime']->modify('-1day -10seconds'); - $handler->handle($record2); - $record3 = $this->getRecord(Logger::CRITICAL); - $record3['datetime']->modify('-30seconds'); - $handler->handle($record3); - - // log is written as none of them are duplicate - $handler->flush(); - $this->assertSame( - $record['datetime']->getTimestamp() . ":ERROR:test\n" . - $record2['datetime']->getTimestamp() . ":CRITICAL:test\n" . - $record3['datetime']->getTimestamp() . ":CRITICAL:test\n", - file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log') - ); - $this->assertTrue($test->hasErrorRecords()); - $this->assertTrue($test->hasCriticalRecords()); - $this->assertFalse($test->hasWarningRecords()); - - // clear test handler - $test->clear(); - $this->assertFalse($test->hasErrorRecords()); - $this->assertFalse($test->hasCriticalRecords()); - - // log new records, duplicate log gets GC'd at the end of this flush call - $handler->handle($record = $this->getRecord(Logger::ERROR)); - $handler->handle($record2 = $this->getRecord(Logger::CRITICAL)); - $handler->flush(); - - // log should now contain the new errors and the previous one that was recent enough - $this->assertSame( - $record3['datetime']->getTimestamp() . ":CRITICAL:test\n" . - $record['datetime']->getTimestamp() . ":ERROR:test\n" . - $record2['datetime']->getTimestamp() . ":CRITICAL:test\n", - file_get_contents(sys_get_temp_dir() . '/monolog_dedup.log') - ); - $this->assertTrue($test->hasErrorRecords()); - $this->assertTrue($test->hasCriticalRecords()); - $this->assertFalse($test->hasWarningRecords()); - } - - public static function tearDownAfterClass() - { - @unlink(sys_get_temp_dir().'/monolog_dedup.log'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php deleted file mode 100644 index d67da90a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/DoctrineCouchDBHandlerTest.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class DoctrineCouchDBHandlerTest extends TestCase -{ - protected function setup() - { - if (!class_exists('Doctrine\CouchDB\CouchDBClient')) { - $this->markTestSkipped('The "doctrine/couchdb" package is not installed'); - } - } - - public function testHandle() - { - $client = $this->getMockBuilder('Doctrine\\CouchDB\\CouchDBClient') - ->setMethods(array('postDocument')) - ->disableOriginalConstructor() - ->getMock(); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); - - $client->expects($this->once()) - ->method('postDocument') - ->with($expected); - - $handler = new DoctrineCouchDBHandler($client); - $handler->handle($record); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php deleted file mode 100644 index 2e6c348d..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/DynamoDbHandlerTest.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -class DynamoDbHandlerTest extends TestCase -{ - private $client; - - public function setUp() - { - if (!class_exists('Aws\DynamoDb\DynamoDbClient')) { - $this->markTestSkipped('aws/aws-sdk-php not installed'); - } - - $this->client = $this->getMockBuilder('Aws\DynamoDb\DynamoDbClient') - ->setMethods(array('formatAttributes', '__call')) - ->disableOriginalConstructor()->getMock(); - } - - public function testConstruct() - { - $this->assertInstanceOf('Monolog\Handler\DynamoDbHandler', new DynamoDbHandler($this->client, 'foo')); - } - - public function testInterface() - { - $this->assertInstanceOf('Monolog\Handler\HandlerInterface', new DynamoDbHandler($this->client, 'foo')); - } - - public function testGetFormatter() - { - $handler = new DynamoDbHandler($this->client, 'foo'); - $this->assertInstanceOf('Monolog\Formatter\ScalarFormatter', $handler->getFormatter()); - } - - public function testHandle() - { - $record = $this->getRecord(); - $formatter = $this->getMock('Monolog\Formatter\FormatterInterface'); - $formatted = array('foo' => 1, 'bar' => 2); - $handler = new DynamoDbHandler($this->client, 'foo'); - $handler->setFormatter($formatter); - - $isV3 = defined('Aws\Sdk::VERSION') && version_compare(\Aws\Sdk::VERSION, '3.0', '>='); - if ($isV3) { - $expFormatted = array('foo' => array('N' => 1), 'bar' => array('N' => 2)); - } else { - $expFormatted = $formatted; - } - - $formatter - ->expects($this->once()) - ->method('format') - ->with($record) - ->will($this->returnValue($formatted)); - $this->client - ->expects($isV3 ? $this->never() : $this->once()) - ->method('formatAttributes') - ->with($this->isType('array')) - ->will($this->returnValue($formatted)); - $this->client - ->expects($this->once()) - ->method('__call') - ->with('putItem', array(array( - 'TableName' => 'foo', - 'Item' => $expFormatted, - ))); - - $handler->handle($record); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php deleted file mode 100644 index 1687074b..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/ElasticSearchHandlerTest.php +++ /dev/null @@ -1,239 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\ElasticaFormatter; -use Monolog\Formatter\NormalizerFormatter; -use Monolog\TestCase; -use Monolog\Logger; -use Elastica\Client; -use Elastica\Request; -use Elastica\Response; - -class ElasticSearchHandlerTest extends TestCase -{ - /** - * @var Client mock - */ - protected $client; - - /** - * @var array Default handler options - */ - protected $options = array( - 'index' => 'my_index', - 'type' => 'doc_type', - ); - - public function setUp() - { - // Elastica lib required - if (!class_exists("Elastica\Client")) { - $this->markTestSkipped("ruflin/elastica not installed"); - } - - // base mock Elastica Client object - $this->client = $this->getMockBuilder('Elastica\Client') - ->setMethods(array('addDocuments')) - ->disableOriginalConstructor() - ->getMock(); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::write - * @covers Monolog\Handler\ElasticSearchHandler::handleBatch - * @covers Monolog\Handler\ElasticSearchHandler::bulkSend - * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter - */ - public function testHandle() - { - // log message - $msg = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - // format expected result - $formatter = new ElasticaFormatter($this->options['index'], $this->options['type']); - $expected = array($formatter->format($msg)); - - // setup ES client mock - $this->client->expects($this->any()) - ->method('addDocuments') - ->with($expected); - - // perform tests - $handler = new ElasticSearchHandler($this->client, $this->options); - $handler->handle($msg); - $handler->handleBatch(array($msg)); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::setFormatter - */ - public function testSetFormatter() - { - $handler = new ElasticSearchHandler($this->client); - $formatter = new ElasticaFormatter('index_new', 'type_new'); - $handler->setFormatter($formatter); - $this->assertInstanceOf('Monolog\Formatter\ElasticaFormatter', $handler->getFormatter()); - $this->assertEquals('index_new', $handler->getFormatter()->getIndex()); - $this->assertEquals('type_new', $handler->getFormatter()->getType()); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::setFormatter - * @expectedException InvalidArgumentException - * @expectedExceptionMessage ElasticSearchHandler is only compatible with ElasticaFormatter - */ - public function testSetFormatterInvalid() - { - $handler = new ElasticSearchHandler($this->client); - $formatter = new NormalizerFormatter(); - $handler->setFormatter($formatter); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::__construct - * @covers Monolog\Handler\ElasticSearchHandler::getOptions - */ - public function testOptions() - { - $expected = array( - 'index' => $this->options['index'], - 'type' => $this->options['type'], - 'ignore_error' => false, - ); - $handler = new ElasticSearchHandler($this->client, $this->options); - $this->assertEquals($expected, $handler->getOptions()); - } - - /** - * @covers Monolog\Handler\ElasticSearchHandler::bulkSend - * @dataProvider providerTestConnectionErrors - */ - public function testConnectionErrors($ignore, $expectedError) - { - $clientOpts = array('host' => '127.0.0.1', 'port' => 1); - $client = new Client($clientOpts); - $handlerOpts = array('ignore_error' => $ignore); - $handler = new ElasticSearchHandler($client, $handlerOpts); - - if ($expectedError) { - $this->setExpectedException($expectedError[0], $expectedError[1]); - $handler->handle($this->getRecord()); - } else { - $this->assertFalse($handler->handle($this->getRecord())); - } - } - - /** - * @return array - */ - public function providerTestConnectionErrors() - { - return array( - array(false, array('RuntimeException', 'Error sending messages to Elasticsearch')), - array(true, false), - ); - } - - /** - * Integration test using localhost Elastic Search server - * - * @covers Monolog\Handler\ElasticSearchHandler::__construct - * @covers Monolog\Handler\ElasticSearchHandler::handleBatch - * @covers Monolog\Handler\ElasticSearchHandler::bulkSend - * @covers Monolog\Handler\ElasticSearchHandler::getDefaultFormatter - */ - public function testHandleIntegration() - { - $msg = array( - 'level' => Logger::ERROR, - 'level_name' => 'ERROR', - 'channel' => 'meh', - 'context' => array('foo' => 7, 'bar', 'class' => new \stdClass), - 'datetime' => new \DateTime("@0"), - 'extra' => array(), - 'message' => 'log', - ); - - $expected = $msg; - $expected['datetime'] = $msg['datetime']->format(\DateTime::ISO8601); - $expected['context'] = array( - 'class' => '[object] (stdClass: {})', - 'foo' => 7, - 0 => 'bar', - ); - - $client = new Client(); - $handler = new ElasticSearchHandler($client, $this->options); - try { - $handler->handleBatch(array($msg)); - } catch (\RuntimeException $e) { - $this->markTestSkipped("Cannot connect to Elastic Search server on localhost"); - } - - // check document id from ES server response - $documentId = $this->getCreatedDocId($client->getLastResponse()); - $this->assertNotEmpty($documentId, 'No elastic document id received'); - - // retrieve document source from ES and validate - $document = $this->getDocSourceFromElastic( - $client, - $this->options['index'], - $this->options['type'], - $documentId - ); - $this->assertEquals($expected, $document); - - // remove test index from ES - $client->request("/{$this->options['index']}", Request::DELETE); - } - - /** - * Return last created document id from ES response - * @param Response $response Elastica Response object - * @return string|null - */ - protected function getCreatedDocId(Response $response) - { - $data = $response->getData(); - if (!empty($data['items'][0]['create']['_id'])) { - return $data['items'][0]['create']['_id']; - } - } - - /** - * Retrieve document by id from Elasticsearch - * @param Client $client Elastica client - * @param string $index - * @param string $type - * @param string $documentId - * @return array - */ - protected function getDocSourceFromElastic(Client $client, $index, $type, $documentId) - { - $resp = $client->request("/{$index}/{$type}/{$documentId}", Request::GET); - $data = $resp->getData(); - if (!empty($data['_source'])) { - return $data['_source']; - } - - return array(); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php deleted file mode 100644 index 99785cbb..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/ErrorLogHandlerTest.php +++ /dev/null @@ -1,66 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; - -function error_log() -{ - $GLOBALS['error_log'][] = func_get_args(); -} - -class ErrorLogHandlerTest extends TestCase -{ - protected function setUp() - { - $GLOBALS['error_log'] = array(); - } - - /** - * @covers Monolog\Handler\ErrorLogHandler::__construct - * @expectedException InvalidArgumentException - * @expectedExceptionMessage The given message type "42" is not supported - */ - public function testShouldNotAcceptAnInvalidTypeOnContructor() - { - new ErrorLogHandler(42); - } - - /** - * @covers Monolog\Handler\ErrorLogHandler::write - */ - public function testShouldLogMessagesUsingErrorLogFuncion() - { - $type = ErrorLogHandler::OPERATING_SYSTEM; - $handler = new ErrorLogHandler($type); - $handler->setFormatter(new LineFormatter('%channel%.%level_name%: %message% %context% %extra%', null, true)); - $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); - - $this->assertSame("test.ERROR: Foo\nBar\r\n\r\nBaz [] []", $GLOBALS['error_log'][0][0]); - $this->assertSame($GLOBALS['error_log'][0][1], $type); - - $handler = new ErrorLogHandler($type, Logger::DEBUG, true, true); - $handler->setFormatter(new LineFormatter(null, null, true)); - $handler->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); - - $this->assertStringMatchesFormat('[%s] test.ERROR: Foo', $GLOBALS['error_log'][1][0]); - $this->assertSame($GLOBALS['error_log'][1][1], $type); - - $this->assertStringMatchesFormat('Bar', $GLOBALS['error_log'][2][0]); - $this->assertSame($GLOBALS['error_log'][2][1], $type); - - $this->assertStringMatchesFormat('Baz [] []', $GLOBALS['error_log'][3][0]); - $this->assertSame($GLOBALS['error_log'][3][1], $type); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php deleted file mode 100644 index 31b7686a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/FilterHandlerTest.php +++ /dev/null @@ -1,170 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\TestCase; - -class FilterHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\FilterHandler::isHandling - */ - public function testIsHandling() - { - $test = new TestHandler(); - $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::INFO))); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::NOTICE))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::WARNING))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::ERROR))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::CRITICAL))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::ALERT))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::EMERGENCY))); - } - - /** - * @covers Monolog\Handler\FilterHandler::handle - * @covers Monolog\Handler\FilterHandler::setAcceptedLevels - * @covers Monolog\Handler\FilterHandler::isHandling - */ - public function testHandleProcessOnlyNeededLevels() - { - $test = new TestHandler(); - $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE); - - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasInfoRecords()); - $handler->handle($this->getRecord(Logger::NOTICE)); - $this->assertTrue($test->hasNoticeRecords()); - - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertFalse($test->hasWarningRecords()); - $handler->handle($this->getRecord(Logger::ERROR)); - $this->assertFalse($test->hasErrorRecords()); - $handler->handle($this->getRecord(Logger::CRITICAL)); - $this->assertFalse($test->hasCriticalRecords()); - $handler->handle($this->getRecord(Logger::ALERT)); - $this->assertFalse($test->hasAlertRecords()); - $handler->handle($this->getRecord(Logger::EMERGENCY)); - $this->assertFalse($test->hasEmergencyRecords()); - - $test = new TestHandler(); - $handler = new FilterHandler($test, array(Logger::INFO, Logger::ERROR)); - - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasInfoRecords()); - $handler->handle($this->getRecord(Logger::NOTICE)); - $this->assertFalse($test->hasNoticeRecords()); - $handler->handle($this->getRecord(Logger::ERROR)); - $this->assertTrue($test->hasErrorRecords()); - $handler->handle($this->getRecord(Logger::CRITICAL)); - $this->assertFalse($test->hasCriticalRecords()); - } - - /** - * @covers Monolog\Handler\FilterHandler::setAcceptedLevels - * @covers Monolog\Handler\FilterHandler::getAcceptedLevels - */ - public function testAcceptedLevelApi() - { - $test = new TestHandler(); - $handler = new FilterHandler($test); - - $levels = array(Logger::INFO, Logger::ERROR); - $handler->setAcceptedLevels($levels); - $this->assertSame($levels, $handler->getAcceptedLevels()); - - $handler->setAcceptedLevels(array('info', 'error')); - $this->assertSame($levels, $handler->getAcceptedLevels()); - - $levels = array(Logger::CRITICAL, Logger::ALERT, Logger::EMERGENCY); - $handler->setAcceptedLevels(Logger::CRITICAL, Logger::EMERGENCY); - $this->assertSame($levels, $handler->getAcceptedLevels()); - - $handler->setAcceptedLevels('critical', 'emergency'); - $this->assertSame($levels, $handler->getAcceptedLevels()); - } - - /** - * @covers Monolog\Handler\FilterHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new FilterHandler($test, Logger::DEBUG, Logger::EMERGENCY); - $handler->pushProcessor( - function ($record) { - $record['extra']['foo'] = true; - - return $record; - } - ); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } - - /** - * @covers Monolog\Handler\FilterHandler::handle - */ - public function testHandleRespectsBubble() - { - $test = new TestHandler(); - - $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, false); - $this->assertTrue($handler->handle($this->getRecord(Logger::INFO))); - $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING))); - - $handler = new FilterHandler($test, Logger::INFO, Logger::NOTICE, true); - $this->assertFalse($handler->handle($this->getRecord(Logger::INFO))); - $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING))); - } - - /** - * @covers Monolog\Handler\FilterHandler::handle - */ - public function testHandleWithCallback() - { - $test = new TestHandler(); - $handler = new FilterHandler( - function ($record, $handler) use ($test) { - return $test; - }, Logger::INFO, Logger::NOTICE, false - ); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FilterHandler::handle - * @expectedException \RuntimeException - */ - public function testHandleWithBadCallbackThrowsException() - { - $handler = new FilterHandler( - function ($record, $handler) { - return 'foo'; - } - ); - $handler->handle($this->getRecord(Logger::WARNING)); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php deleted file mode 100644 index b92bf437..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php +++ /dev/null @@ -1,279 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; -use Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy; -use Psr\Log\LogLevel; - -class FingersCrossedHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\FingersCrossedHandler::__construct - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testHandleBuffers() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->close(); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 3); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testHandleStopsBufferingAfterTrigger() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - * @covers Monolog\Handler\FingersCrossedHandler::reset - */ - public function testHandleRestartBufferingAfterReset() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->reset(); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testHandleRestartBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->close(); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testHandleBufferLimit() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::WARNING, 2); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertFalse($test->hasDebugRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testHandleWithCallback() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler(function ($record, $handler) use ($test) { - return $test; - }); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertFalse($test->hasDebugRecords()); - $this->assertFalse($test->hasInfoRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 3); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - * @expectedException RuntimeException - */ - public function testHandleWithBadCallbackThrowsException() - { - $handler = new FingersCrossedHandler(function ($record, $handler) { - return 'foo'; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::isHandling - */ - public function testIsHandlingAlways() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::ERROR); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::__construct - * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct - * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated - */ - public function testErrorLevelActivationStrategy() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING)); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::__construct - * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::__construct - * @covers Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy::isHandlerActivated - */ - public function testErrorLevelActivationStrategyWithPsrLevel() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning')); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::__construct - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testOverrideActivationStrategy() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy('warning')); - $handler->handle($this->getRecord(Logger::DEBUG)); - $this->assertFalse($test->hasDebugRecords()); - $handler->activate(); - $this->assertTrue($test->hasDebugRecords()); - $handler->handle($this->getRecord(Logger::INFO)); - $this->assertTrue($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct - * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated - */ - public function testChannelLevelActivationStrategy() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy(Logger::ERROR, array('othertest' => Logger::DEBUG))); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertFalse($test->hasWarningRecords()); - $record = $this->getRecord(Logger::DEBUG); - $record['channel'] = 'othertest'; - $handler->handle($record); - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::__construct - * @covers Monolog\Handler\FingersCrossed\ChannelLevelActivationStrategy::isHandlerActivated - */ - public function testChannelLevelActivationStrategyWithPsrLevels() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ChannelLevelActivationStrategy('error', array('othertest' => 'debug'))); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertFalse($test->hasWarningRecords()); - $record = $this->getRecord(Logger::DEBUG); - $record['channel'] = 'othertest'; - $handler->handle($record); - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasWarningRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::handle - * @covers Monolog\Handler\FingersCrossedHandler::activate - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, Logger::INFO); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::close - */ - public function testPassthruOnClose() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, Logger::INFO); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->close(); - $this->assertFalse($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - } - - /** - * @covers Monolog\Handler\FingersCrossedHandler::close - */ - public function testPsrLevelPassthruOnClose() - { - $test = new TestHandler(); - $handler = new FingersCrossedHandler($test, new ErrorLevelActivationStrategy(Logger::WARNING), 0, true, true, LogLevel::INFO); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - $handler->close(); - $this->assertFalse($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php deleted file mode 100644 index 0eb10a63..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\FirePHPHandler - */ -class FirePHPHandlerTest extends TestCase -{ - public function setUp() - { - TestFirePHPHandler::reset(); - $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; FirePHP/1.0'; - } - - public function testHeaders() - { - $handler = new TestFirePHPHandler; - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-Wf-Protocol-1' => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2', - 'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1', - 'X-Wf-1-Plugin-1' => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3', - 'X-Wf-1-1-1-1' => 'test', - 'X-Wf-1-1-1-2' => 'test', - ); - - $this->assertEquals($expected, $handler->getHeaders()); - } - - public function testConcurrentHandlers() - { - $handler = new TestFirePHPHandler; - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::WARNING)); - - $handler2 = new TestFirePHPHandler; - $handler2->setFormatter($this->getIdentityFormatter()); - $handler2->handle($this->getRecord(Logger::DEBUG)); - $handler2->handle($this->getRecord(Logger::WARNING)); - - $expected = array( - 'X-Wf-Protocol-1' => 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2', - 'X-Wf-1-Structure-1' => 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1', - 'X-Wf-1-Plugin-1' => 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3', - 'X-Wf-1-1-1-1' => 'test', - 'X-Wf-1-1-1-2' => 'test', - ); - - $expected2 = array( - 'X-Wf-1-1-1-3' => 'test', - 'X-Wf-1-1-1-4' => 'test', - ); - - $this->assertEquals($expected, $handler->getHeaders()); - $this->assertEquals($expected2, $handler2->getHeaders()); - } -} - -class TestFirePHPHandler extends FirePHPHandler -{ - protected $headers = array(); - - public static function reset() - { - self::$initialized = false; - self::$sendHeaders = true; - self::$messageIndex = 1; - } - - protected function sendHeader($header, $content) - { - $this->headers[$header] = $content; - } - - public function getHeaders() - { - return $this->headers; - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep b/vendor/monolog/monolog/tests/Monolog/Handler/Fixtures/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php deleted file mode 100644 index 91cdd312..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/FleepHookHandlerTest.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\LineFormatter; -use Monolog\Logger; -use Monolog\TestCase; - -/** - * @coversDefaultClass \Monolog\Handler\FleepHookHandler - */ -class FleepHookHandlerTest extends TestCase -{ - /** - * Default token to use in tests - */ - const TOKEN = '123abc'; - - /** - * @var FleepHookHandler - */ - private $handler; - - public function setUp() - { - parent::setUp(); - - if (!extension_loaded('openssl')) { - $this->markTestSkipped('This test requires openssl extension to run'); - } - - // Create instances of the handler and logger for convenience - $this->handler = new FleepHookHandler(self::TOKEN); - } - - /** - * @covers ::__construct - */ - public function testConstructorSetsExpectedDefaults() - { - $this->assertEquals(Logger::DEBUG, $this->handler->getLevel()); - $this->assertEquals(true, $this->handler->getBubble()); - } - - /** - * @covers ::getDefaultFormatter - */ - public function testHandlerUsesLineFormatterWhichIgnoresEmptyArrays() - { - $record = array( - 'message' => 'msg', - 'context' => array(), - 'level' => Logger::DEBUG, - 'level_name' => Logger::getLevelName(Logger::DEBUG), - 'channel' => 'channel', - 'datetime' => new \DateTime(), - 'extra' => array(), - ); - - $expectedFormatter = new LineFormatter(null, null, true, true); - $expected = $expectedFormatter->format($record); - - $handlerFormatter = $this->handler->getFormatter(); - $actual = $handlerFormatter->format($record); - - $this->assertEquals($expected, $actual, 'Empty context and extra arrays should not be rendered'); - } - - /** - * @covers ::__construct - */ - public function testConnectionStringisConstructedCorrectly() - { - $this->assertEquals('ssl://' . FleepHookHandler::FLEEP_HOST . ':443', $this->handler->getConnectionString()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php deleted file mode 100644 index 4b120d51..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/FlowdockHandlerTest.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\FlowdockFormatter; -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Dominik Liebler - * @see https://www.hipchat.com/docs/api - */ -class FlowdockHandlerTest extends TestCase -{ - /** - * @var resource - */ - private $res; - - /** - * @var FlowdockHandler - */ - private $handler; - - public function setUp() - { - if (!extension_loaded('openssl')) { - $this->markTestSkipped('This test requires openssl to run'); - } - } - - public function testWriteHeader() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v1\/messages\/team_inbox\/.* HTTP\/1.1\\r\\nHost: api.flowdock.com\\r\\nContent-Type: application\/json\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - /** - * @depends testWriteHeader - */ - public function testWriteContent($content) - { - $this->assertRegexp('/"source":"test_source"/', $content); - $this->assertRegexp('/"from_address":"source@test\.com"/', $content); - } - - private function createHandler($token = 'myToken') - { - $constructorArgs = array($token, Logger::DEBUG); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\FlowdockHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $constructorArgs - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - - $this->handler->setFormatter(new FlowdockFormatter('test_source', 'source@test.com')); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php deleted file mode 100644 index 9d007b13..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerLegacyTest.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Gelf\Message; -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\GelfMessageFormatter; - -class GelfHandlerLegacyTest extends TestCase -{ - public function setUp() - { - if (!class_exists('Gelf\MessagePublisher') || !class_exists('Gelf\Message')) { - $this->markTestSkipped("mlehner/gelf-php not installed"); - } - - require_once __DIR__ . '/GelfMockMessagePublisher.php'; - } - - /** - * @covers Monolog\Handler\GelfHandler::__construct - */ - public function testConstruct() - { - $handler = new GelfHandler($this->getMessagePublisher()); - $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler); - } - - protected function getHandler($messagePublisher) - { - $handler = new GelfHandler($messagePublisher); - - return $handler; - } - - protected function getMessagePublisher() - { - return new GelfMockMessagePublisher('localhost'); - } - - public function testDebug() - { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $record = $this->getRecord(Logger::DEBUG, "A test debug message"); - $handler->handle($record); - - $this->assertEquals(7, $messagePublisher->lastMessage->getLevel()); - $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); - $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); - $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); - } - - public function testWarning() - { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $handler->handle($record); - - $this->assertEquals(4, $messagePublisher->lastMessage->getLevel()); - $this->assertEquals('test', $messagePublisher->lastMessage->getFacility()); - $this->assertEquals($record['message'], $messagePublisher->lastMessage->getShortMessage()); - $this->assertEquals(null, $messagePublisher->lastMessage->getFullMessage()); - } - - public function testInjectedGelfMessageFormatter() - { - $messagePublisher = $this->getMessagePublisher(); - $handler = $this->getHandler($messagePublisher); - - $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); - - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $record['extra']['blarg'] = 'yep'; - $record['context']['from'] = 'logger'; - $handler->handle($record); - - $this->assertEquals('mysystem', $messagePublisher->lastMessage->getHost()); - $this->assertArrayHasKey('_EXTblarg', $messagePublisher->lastMessage->toArray()); - $this->assertArrayHasKey('_CTXfrom', $messagePublisher->lastMessage->toArray()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php deleted file mode 100644 index 8cdd64f4..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/GelfHandlerTest.php +++ /dev/null @@ -1,117 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Gelf\Message; -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\GelfMessageFormatter; - -class GelfHandlerTest extends TestCase -{ - public function setUp() - { - if (!class_exists('Gelf\Publisher') || !class_exists('Gelf\Message')) { - $this->markTestSkipped("graylog2/gelf-php not installed"); - } - } - - /** - * @covers Monolog\Handler\GelfHandler::__construct - */ - public function testConstruct() - { - $handler = new GelfHandler($this->getMessagePublisher()); - $this->assertInstanceOf('Monolog\Handler\GelfHandler', $handler); - } - - protected function getHandler($messagePublisher) - { - $handler = new GelfHandler($messagePublisher); - - return $handler; - } - - protected function getMessagePublisher() - { - return $this->getMock('Gelf\Publisher', array('publish'), array(), '', false); - } - - public function testDebug() - { - $record = $this->getRecord(Logger::DEBUG, "A test debug message"); - $expectedMessage = new Message(); - $expectedMessage - ->setLevel(7) - ->setFacility("test") - ->setShortMessage($record['message']) - ->setTimestamp($record['datetime']) - ; - - $messagePublisher = $this->getMessagePublisher(); - $messagePublisher->expects($this->once()) - ->method('publish') - ->with($expectedMessage); - - $handler = $this->getHandler($messagePublisher); - - $handler->handle($record); - } - - public function testWarning() - { - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $expectedMessage = new Message(); - $expectedMessage - ->setLevel(4) - ->setFacility("test") - ->setShortMessage($record['message']) - ->setTimestamp($record['datetime']) - ; - - $messagePublisher = $this->getMessagePublisher(); - $messagePublisher->expects($this->once()) - ->method('publish') - ->with($expectedMessage); - - $handler = $this->getHandler($messagePublisher); - - $handler->handle($record); - } - - public function testInjectedGelfMessageFormatter() - { - $record = $this->getRecord(Logger::WARNING, "A test warning message"); - $record['extra']['blarg'] = 'yep'; - $record['context']['from'] = 'logger'; - - $expectedMessage = new Message(); - $expectedMessage - ->setLevel(4) - ->setFacility("test") - ->setHost("mysystem") - ->setShortMessage($record['message']) - ->setTimestamp($record['datetime']) - ->setAdditional("EXTblarg", 'yep') - ->setAdditional("CTXfrom", 'logger') - ; - - $messagePublisher = $this->getMessagePublisher(); - $messagePublisher->expects($this->once()) - ->method('publish') - ->with($expectedMessage); - - $handler = $this->getHandler($messagePublisher); - $handler->setFormatter(new GelfMessageFormatter('mysystem', 'EXT', 'CTX')); - $handler->handle($record); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php b/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php deleted file mode 100644 index 873d92fb..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/GelfMockMessagePublisher.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Gelf\MessagePublisher; -use Gelf\Message; - -class GelfMockMessagePublisher extends MessagePublisher -{ - public function publish(Message $message) - { - $this->lastMessage = $message; - } - - public $lastMessage = null; -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php deleted file mode 100644 index a1b86176..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/GroupHandlerTest.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class GroupHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\GroupHandler::__construct - * @expectedException InvalidArgumentException - */ - public function testConstructorOnlyTakesHandler() - { - new GroupHandler(array(new TestHandler(), "foo")); - } - - /** - * @covers Monolog\Handler\GroupHandler::__construct - * @covers Monolog\Handler\GroupHandler::handle - */ - public function testHandle() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new GroupHandler($testHandlers); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - } - - /** - * @covers Monolog\Handler\GroupHandler::handleBatch - */ - public function testHandleBatch() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new GroupHandler($testHandlers); - $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - } - - /** - * @covers Monolog\Handler\GroupHandler::isHandling - */ - public function testIsHandling() - { - $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING)); - $handler = new GroupHandler($testHandlers); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR))); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\GroupHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new GroupHandler(array($test)); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } - - /** - * @covers Monolog\Handler\GroupHandler::handle - */ - public function testHandleBatchUsesProcessors() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new GroupHandler($testHandlers); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - $this->assertTrue($records[1]['extra']['foo']); - } - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php deleted file mode 100644 index d8d0452c..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/HandlerWrapperTest.php +++ /dev/null @@ -1,130 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -/** - * @author Alexey Karapetov - */ -class HandlerWrapperTest extends TestCase -{ - /** - * @var HandlerWrapper - */ - private $wrapper; - - private $handler; - - public function setUp() - { - parent::setUp(); - $this->handler = $this->getMock('Monolog\\Handler\\HandlerInterface'); - $this->wrapper = new HandlerWrapper($this->handler); - } - - /** - * @return array - */ - public function trueFalseDataProvider() - { - return array( - array(true), - array(false), - ); - } - - /** - * @param $result - * @dataProvider trueFalseDataProvider - */ - public function testIsHandling($result) - { - $record = $this->getRecord(); - $this->handler->expects($this->once()) - ->method('isHandling') - ->with($record) - ->willReturn($result); - - $this->assertEquals($result, $this->wrapper->isHandling($record)); - } - - /** - * @param $result - * @dataProvider trueFalseDataProvider - */ - public function testHandle($result) - { - $record = $this->getRecord(); - $this->handler->expects($this->once()) - ->method('handle') - ->with($record) - ->willReturn($result); - - $this->assertEquals($result, $this->wrapper->handle($record)); - } - - /** - * @param $result - * @dataProvider trueFalseDataProvider - */ - public function testHandleBatch($result) - { - $records = $this->getMultipleRecords(); - $this->handler->expects($this->once()) - ->method('handleBatch') - ->with($records) - ->willReturn($result); - - $this->assertEquals($result, $this->wrapper->handleBatch($records)); - } - - public function testPushProcessor() - { - $processor = function () {}; - $this->handler->expects($this->once()) - ->method('pushProcessor') - ->with($processor); - - $this->assertEquals($this->wrapper, $this->wrapper->pushProcessor($processor)); - } - - public function testPopProcessor() - { - $processor = function () {}; - $this->handler->expects($this->once()) - ->method('popProcessor') - ->willReturn($processor); - - $this->assertEquals($processor, $this->wrapper->popProcessor()); - } - - public function testSetFormatter() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $this->handler->expects($this->once()) - ->method('setFormatter') - ->with($formatter); - - $this->assertEquals($this->wrapper, $this->wrapper->setFormatter($formatter)); - } - - public function testGetFormatter() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $this->handler->expects($this->once()) - ->method('getFormatter') - ->willReturn($formatter); - - $this->assertEquals($formatter, $this->wrapper->getFormatter()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php deleted file mode 100644 index 52dc9dac..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/HipChatHandlerTest.php +++ /dev/null @@ -1,279 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Rafael Dohms - * @see https://www.hipchat.com/docs/api - */ -class HipChatHandlerTest extends TestCase -{ - private $res; - /** @var HipChatHandler */ - private $handler; - - public function testWriteHeader() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: api.hipchat.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - public function testWriteCustomHostHeader() - { - $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v1\/rooms\/message\?format=json&auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - public function testWriteV2() - { - $this->createHandler('myToken', 'room1', 'Monolog', false, 'hipchat.foo.bar', 'v2'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v2\/room\/room1\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - public function testWriteV2Notify() - { - $this->createHandler('myToken', 'room1', 'Monolog', true, 'hipchat.foo.bar', 'v2'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v2\/room\/room1\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - public function testRoomSpaces() - { - $this->createHandler('myToken', 'room name', 'Monolog', false, 'hipchat.foo.bar', 'v2'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/v2\/room\/room%20name\/notification\?auth_token=.* HTTP\/1.1\\r\\nHost: hipchat.foo.bar\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - /** - * @depends testWriteHeader - */ - public function testWriteContent($content) - { - $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content); - } - - public function testWriteContentV1WithoutName() - { - $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v1'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/notify=0&message=test1&message_format=text&color=red&room_id=room1&from=$/', $content); - - return $content; - } - - /** - * @depends testWriteCustomHostHeader - */ - public function testWriteContentNotify($content) - { - $this->assertRegexp('/notify=1&message=test1&message_format=text&color=red&room_id=room1&from=Monolog$/', $content); - } - - /** - * @depends testWriteV2 - */ - public function testWriteContentV2($content) - { - $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red&from=Monolog$/', $content); - } - - /** - * @depends testWriteV2Notify - */ - public function testWriteContentV2Notify($content) - { - $this->assertRegexp('/notify=true&message=test1&message_format=text&color=red&from=Monolog$/', $content); - } - - public function testWriteContentV2WithoutName() - { - $this->createHandler('myToken', 'room1', null, false, 'hipchat.foo.bar', 'v2'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/notify=false&message=test1&message_format=text&color=red$/', $content); - - return $content; - } - - public function testWriteWithComplexMessage() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content); - } - - public function testWriteTruncatesLongMessage() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, str_repeat('abcde', 2000))); - fseek($this->res, 0); - $content = fread($this->res, 12000); - - $this->assertRegexp('/message='.str_repeat('abcde', 1900).'\+%5Btruncated%5D/', $content); - } - - /** - * @dataProvider provideLevelColors - */ - public function testWriteWithErrorLevelsAndColors($level, $expectedColor) - { - $this->createHandler(); - $this->handler->handle($this->getRecord($level, 'Backup of database "example" finished in 16 minutes.')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/color='.$expectedColor.'/', $content); - } - - public function provideLevelColors() - { - return array( - array(Logger::DEBUG, 'gray'), - array(Logger::INFO, 'green'), - array(Logger::WARNING, 'yellow'), - array(Logger::ERROR, 'red'), - array(Logger::CRITICAL, 'red'), - array(Logger::ALERT, 'red'), - array(Logger::EMERGENCY,'red'), - array(Logger::NOTICE, 'green'), - ); - } - - /** - * @dataProvider provideBatchRecords - */ - public function testHandleBatch($records, $expectedColor) - { - $this->createHandler(); - - $this->handler->handleBatch($records); - - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/color='.$expectedColor.'/', $content); - } - - public function provideBatchRecords() - { - return array( - array( - array( - array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()), - array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), - array('level' => Logger::CRITICAL, 'message' => 'Everything is broken!', 'level_name' => 'critical', 'datetime' => new \DateTime()), - ), - 'red', - ), - array( - array( - array('level' => Logger::WARNING, 'message' => 'Oh bugger!', 'level_name' => 'warning', 'datetime' => new \DateTime()), - array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), - ), - 'yellow', - ), - array( - array( - array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()), - array('level' => Logger::NOTICE, 'message' => 'Something noticeable happened.', 'level_name' => 'notice', 'datetime' => new \DateTime()), - ), - 'green', - ), - array( - array( - array('level' => Logger::DEBUG, 'message' => 'Just debugging.', 'level_name' => 'debug', 'datetime' => new \DateTime()), - ), - 'gray', - ), - ); - } - - private function createHandler($token = 'myToken', $room = 'room1', $name = 'Monolog', $notify = false, $host = 'api.hipchat.com', $version = 'v1') - { - $constructorArgs = array($token, $room, $name, $notify, Logger::DEBUG, true, true, 'text', $host, $version); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\HipChatHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $constructorArgs - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - - $this->handler->setFormatter($this->getIdentityFormatter()); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testCreateWithTooLongName() - { - $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere'); - } - - public function testCreateWithTooLongNameV2() - { - // creating a handler with too long of a name but using the v2 api doesn't matter. - $hipChatHandler = new HipChatHandler('token', 'room', 'SixteenCharsHere', false, Logger::CRITICAL, true, true, 'test', 'api.hipchat.com', 'v2'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php deleted file mode 100644 index b2deb40a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/LogEntriesHandlerTest.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Robert Kaufmann III - */ -class LogEntriesHandlerTest extends TestCase -{ - /** - * @var resource - */ - private $res; - - /** - * @var LogEntriesHandler - */ - private $handler; - - public function testWriteContent() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test')); - - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content); - } - - public function testWriteBatchContent() - { - $records = array( - $this->getRecord(), - $this->getRecord(), - $this->getRecord(), - ); - $this->createHandler(); - $this->handler->handleBatch($records); - - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content); - } - - private function createHandler() - { - $useSSL = extension_loaded('openssl'); - $args = array('testToken', $useSSL, Logger::DEBUG, true); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\LogEntriesHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $args - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php deleted file mode 100644 index 6754f3d6..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/MailHandlerTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\TestCase; - -class MailHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\MailHandler::handleBatch - */ - public function testHandleBatch() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->once()) - ->method('formatBatch'); // Each record is formatted - - $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); - $handler->expects($this->once()) - ->method('send'); - $handler->expects($this->never()) - ->method('write'); // write is for individual records - - $handler->setFormatter($formatter); - - $handler->handleBatch($this->getMultipleRecords()); - } - - /** - * @covers Monolog\Handler\MailHandler::handleBatch - */ - public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel() - { - $records = array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information'), - ); - - $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); - $handler->expects($this->never()) - ->method('send'); - $handler->setLevel(Logger::ERROR); - - $handler->handleBatch($records); - } - - /** - * @covers Monolog\Handler\MailHandler::write - */ - public function testHandle() - { - $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); - - $record = $this->getRecord(); - $records = array($record); - $records[0]['formatted'] = '['.$record['datetime']->format('Y-m-d H:i:s').'] test.WARNING: test [] []'."\n"; - - $handler->expects($this->once()) - ->method('send') - ->with($records[0]['formatted'], $records); - - $handler->handle($record); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php b/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php deleted file mode 100644 index a0833225..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/MockRavenClient.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Raven_Client; - -class MockRavenClient extends Raven_Client -{ - public function capture($data, $stack, $vars = null) - { - $data = array_merge($this->get_user_data(), $data); - $this->lastData = $data; - $this->lastStack = $stack; - } - - public $lastData; - public $lastStack; -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php deleted file mode 100644 index 0fdef63a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/MongoDBHandlerTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class MongoDBHandlerTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testConstructorShouldThrowExceptionForInvalidMongo() - { - new MongoDBHandler(new \stdClass(), 'DB', 'Collection'); - } - - public function testHandle() - { - $mongo = $this->getMock('Mongo', array('selectCollection'), array(), '', false); - $collection = $this->getMock('stdClass', array('save')); - - $mongo->expects($this->once()) - ->method('selectCollection') - ->with('DB', 'Collection') - ->will($this->returnValue($collection)); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $expected = array( - 'message' => 'test', - 'context' => array('data' => '[object] (stdClass: {})', 'foo' => 34), - 'level' => Logger::WARNING, - 'level_name' => 'WARNING', - 'channel' => 'test', - 'datetime' => $record['datetime']->format('Y-m-d H:i:s'), - 'extra' => array(), - ); - - $collection->expects($this->once()) - ->method('save') - ->with($expected); - - $handler = new MongoDBHandler($mongo, 'DB', 'Collection'); - $handler->handle($record); - } -} - -if (!class_exists('Mongo')) { - class Mongo - { - public function selectCollection() - { - } - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php deleted file mode 100644 index ddf545db..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/NativeMailerHandlerTest.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use InvalidArgumentException; - -function mail($to, $subject, $message, $additional_headers = null, $additional_parameters = null) -{ - $GLOBALS['mail'][] = func_get_args(); -} - -class NativeMailerHandlerTest extends TestCase -{ - protected function setUp() - { - $GLOBALS['mail'] = array(); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testConstructorHeaderInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', "receiver@example.org\r\nFrom: faked@attacker.org"); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testSetterHeaderInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); - $mailer->addHeader("Content-Type: text/html\r\nFrom: faked@attacker.org"); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testSetterArrayHeaderInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); - $mailer->addHeader(array("Content-Type: text/html\r\nFrom: faked@attacker.org")); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testSetterContentTypeInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); - $mailer->setContentType("text/html\r\nFrom: faked@attacker.org"); - } - - /** - * @expectedException InvalidArgumentException - */ - public function testSetterEncodingInjection() - { - $mailer = new NativeMailerHandler('spammer@example.org', 'dear victim', 'receiver@example.org'); - $mailer->setEncoding("utf-8\r\nFrom: faked@attacker.org"); - } - - public function testSend() - { - $to = 'spammer@example.org'; - $subject = 'dear victim'; - $from = 'receiver@example.org'; - - $mailer = new NativeMailerHandler($to, $subject, $from); - $mailer->handleBatch(array()); - - // batch is empty, nothing sent - $this->assertEmpty($GLOBALS['mail']); - - // non-empty batch - $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); - $this->assertNotEmpty($GLOBALS['mail']); - $this->assertInternalType('array', $GLOBALS['mail']); - $this->assertArrayHasKey('0', $GLOBALS['mail']); - $params = $GLOBALS['mail'][0]; - $this->assertCount(5, $params); - $this->assertSame($to, $params[0]); - $this->assertSame($subject, $params[1]); - $this->assertStringEndsWith(" test.ERROR: Foo Bar Baz [] []\n", $params[2]); - $this->assertSame("From: $from\r\nContent-type: text/plain; charset=utf-8\r\n", $params[3]); - $this->assertSame('', $params[4]); - } - - public function testMessageSubjectFormatting() - { - $mailer = new NativeMailerHandler('to@example.org', 'Alert: %level_name% %message%', 'from@example.org'); - $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); - $this->assertNotEmpty($GLOBALS['mail']); - $this->assertInternalType('array', $GLOBALS['mail']); - $this->assertArrayHasKey('0', $GLOBALS['mail']); - $params = $GLOBALS['mail'][0]; - $this->assertCount(5, $params); - $this->assertSame('Alert: ERROR Foo Bar Baz', $params[1]); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php deleted file mode 100644 index 4d3a615f..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/NewRelicHandlerTest.php +++ /dev/null @@ -1,200 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Formatter\LineFormatter; -use Monolog\TestCase; -use Monolog\Logger; - -class NewRelicHandlerTest extends TestCase -{ - public static $appname; - public static $customParameters; - public static $transactionName; - - public function setUp() - { - self::$appname = null; - self::$customParameters = array(); - self::$transactionName = null; - } - - /** - * @expectedException Monolog\Handler\MissingExtensionException - */ - public function testThehandlerThrowsAnExceptionIfTheNRExtensionIsNotLoaded() - { - $handler = new StubNewRelicHandlerWithoutExtension(); - $handler->handle($this->getRecord(Logger::ERROR)); - } - - public function testThehandlerCanHandleTheRecord() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR)); - } - - public function testThehandlerCanAddContextParamsToTheNewRelicTrace() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('a' => 'b'))); - $this->assertEquals(array('context_a' => 'b'), self::$customParameters); - } - - public function testThehandlerCanAddExplodedContextParamsToTheNewRelicTrace() - { - $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true); - $handler->handle($this->getRecord( - Logger::ERROR, - 'log message', - array('a' => array('key1' => 'value1', 'key2' => 'value2')) - )); - $this->assertEquals( - array('context_a_key1' => 'value1', 'context_a_key2' => 'value2'), - self::$customParameters - ); - } - - public function testThehandlerCanAddExtraParamsToTheNewRelicTrace() - { - $record = $this->getRecord(Logger::ERROR, 'log message'); - $record['extra'] = array('c' => 'd'); - - $handler = new StubNewRelicHandler(); - $handler->handle($record); - - $this->assertEquals(array('extra_c' => 'd'), self::$customParameters); - } - - public function testThehandlerCanAddExplodedExtraParamsToTheNewRelicTrace() - { - $record = $this->getRecord(Logger::ERROR, 'log message'); - $record['extra'] = array('c' => array('key1' => 'value1', 'key2' => 'value2')); - - $handler = new StubNewRelicHandler(Logger::ERROR, true, self::$appname, true); - $handler->handle($record); - - $this->assertEquals( - array('extra_c_key1' => 'value1', 'extra_c_key2' => 'value2'), - self::$customParameters - ); - } - - public function testThehandlerCanAddExtraContextAndParamsToTheNewRelicTrace() - { - $record = $this->getRecord(Logger::ERROR, 'log message', array('a' => 'b')); - $record['extra'] = array('c' => 'd'); - - $handler = new StubNewRelicHandler(); - $handler->handle($record); - - $expected = array( - 'context_a' => 'b', - 'extra_c' => 'd', - ); - - $this->assertEquals($expected, self::$customParameters); - } - - public function testThehandlerCanHandleTheRecordsFormattedUsingTheLineFormatter() - { - $handler = new StubNewRelicHandler(); - $handler->setFormatter(new LineFormatter()); - $handler->handle($this->getRecord(Logger::ERROR)); - } - - public function testTheAppNameIsNullByDefault() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR, 'log message')); - - $this->assertEquals(null, self::$appname); - } - - public function testTheAppNameCanBeInjectedFromtheConstructor() - { - $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName'); - $handler->handle($this->getRecord(Logger::ERROR, 'log message')); - - $this->assertEquals('myAppName', self::$appname); - } - - public function testTheAppNameCanBeOverriddenFromEachLog() - { - $handler = new StubNewRelicHandler(Logger::DEBUG, false, 'myAppName'); - $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('appname' => 'logAppName'))); - - $this->assertEquals('logAppName', self::$appname); - } - - public function testTheTransactionNameIsNullByDefault() - { - $handler = new StubNewRelicHandler(); - $handler->handle($this->getRecord(Logger::ERROR, 'log message')); - - $this->assertEquals(null, self::$transactionName); - } - - public function testTheTransactionNameCanBeInjectedFromTheConstructor() - { - $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction'); - $handler->handle($this->getRecord(Logger::ERROR, 'log message')); - - $this->assertEquals('myTransaction', self::$transactionName); - } - - public function testTheTransactionNameCanBeOverriddenFromEachLog() - { - $handler = new StubNewRelicHandler(Logger::DEBUG, false, null, false, 'myTransaction'); - $handler->handle($this->getRecord(Logger::ERROR, 'log message', array('transaction_name' => 'logTransactName'))); - - $this->assertEquals('logTransactName', self::$transactionName); - } -} - -class StubNewRelicHandlerWithoutExtension extends NewRelicHandler -{ - protected function isNewRelicEnabled() - { - return false; - } -} - -class StubNewRelicHandler extends NewRelicHandler -{ - protected function isNewRelicEnabled() - { - return true; - } -} - -function newrelic_notice_error() -{ - return true; -} - -function newrelic_set_appname($appname) -{ - return NewRelicHandlerTest::$appname = $appname; -} - -function newrelic_name_transaction($transactionName) -{ - return NewRelicHandlerTest::$transactionName = $transactionName; -} - -function newrelic_add_custom_parameter($key, $value) -{ - NewRelicHandlerTest::$customParameters[$key] = $value; - - return true; -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php deleted file mode 100644 index 292df78c..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/NullHandlerTest.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\NullHandler::handle - */ -class NullHandlerTest extends TestCase -{ - public function testHandle() - { - $handler = new NullHandler(); - $this->assertTrue($handler->handle($this->getRecord())); - } - - public function testHandleLowerLevelRecord() - { - $handler = new NullHandler(Logger::WARNING); - $this->assertFalse($handler->handle($this->getRecord(Logger::DEBUG))); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php deleted file mode 100644 index 152573ef..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/PHPConsoleHandlerTest.php +++ /dev/null @@ -1,273 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Exception; -use Monolog\ErrorHandler; -use Monolog\Logger; -use Monolog\TestCase; -use PhpConsole\Connector; -use PhpConsole\Dispatcher\Debug as DebugDispatcher; -use PhpConsole\Dispatcher\Errors as ErrorDispatcher; -use PhpConsole\Handler; -use PHPUnit_Framework_MockObject_MockObject; - -/** - * @covers Monolog\Handler\PHPConsoleHandler - * @author Sergey Barbushin https://www.linkedin.com/in/barbushin - */ -class PHPConsoleHandlerTest extends TestCase -{ - /** @var Connector|PHPUnit_Framework_MockObject_MockObject */ - protected $connector; - /** @var DebugDispatcher|PHPUnit_Framework_MockObject_MockObject */ - protected $debugDispatcher; - /** @var ErrorDispatcher|PHPUnit_Framework_MockObject_MockObject */ - protected $errorDispatcher; - - protected function setUp() - { - if (!class_exists('PhpConsole\Connector')) { - $this->markTestSkipped('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); - } - $this->connector = $this->initConnectorMock(); - - $this->debugDispatcher = $this->initDebugDispatcherMock($this->connector); - $this->connector->setDebugDispatcher($this->debugDispatcher); - - $this->errorDispatcher = $this->initErrorDispatcherMock($this->connector); - $this->connector->setErrorsDispatcher($this->errorDispatcher); - } - - protected function initDebugDispatcherMock(Connector $connector) - { - return $this->getMockBuilder('PhpConsole\Dispatcher\Debug') - ->disableOriginalConstructor() - ->setMethods(array('dispatchDebug')) - ->setConstructorArgs(array($connector, $connector->getDumper())) - ->getMock(); - } - - protected function initErrorDispatcherMock(Connector $connector) - { - return $this->getMockBuilder('PhpConsole\Dispatcher\Errors') - ->disableOriginalConstructor() - ->setMethods(array('dispatchError', 'dispatchException')) - ->setConstructorArgs(array($connector, $connector->getDumper())) - ->getMock(); - } - - protected function initConnectorMock() - { - $connector = $this->getMockBuilder('PhpConsole\Connector') - ->disableOriginalConstructor() - ->setMethods(array( - 'sendMessage', - 'onShutDown', - 'isActiveClient', - 'setSourcesBasePath', - 'setServerEncoding', - 'setPassword', - 'enableSslOnlyMode', - 'setAllowedIpMasks', - 'setHeadersLimit', - 'startEvalRequestsListener', - )) - ->getMock(); - - $connector->expects($this->any()) - ->method('isActiveClient') - ->will($this->returnValue(true)); - - return $connector; - } - - protected function getHandlerDefaultOption($name) - { - $handler = new PHPConsoleHandler(array(), $this->connector); - $options = $handler->getOptions(); - - return $options[$name]; - } - - protected function initLogger($handlerOptions = array(), $level = Logger::DEBUG) - { - return new Logger('test', array( - new PHPConsoleHandler($handlerOptions, $this->connector, $level), - )); - } - - public function testInitWithDefaultConnector() - { - $handler = new PHPConsoleHandler(); - $this->assertEquals(spl_object_hash(Connector::getInstance()), spl_object_hash($handler->getConnector())); - } - - public function testInitWithCustomConnector() - { - $handler = new PHPConsoleHandler(array(), $this->connector); - $this->assertEquals(spl_object_hash($this->connector), spl_object_hash($handler->getConnector())); - } - - public function testDebug() - { - $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with($this->equalTo('test')); - $this->initLogger()->addDebug('test'); - } - - public function testDebugContextInMessage() - { - $message = 'test'; - $tag = 'tag'; - $context = array($tag, 'custom' => mt_rand()); - $expectedMessage = $message . ' ' . json_encode(array_slice($context, 1)); - $this->debugDispatcher->expects($this->once())->method('dispatchDebug')->with( - $this->equalTo($expectedMessage), - $this->equalTo($tag) - ); - $this->initLogger()->addDebug($message, $context); - } - - public function testDebugTags($tagsContextKeys = null) - { - $expectedTags = mt_rand(); - $logger = $this->initLogger($tagsContextKeys ? array('debugTagsKeysInContext' => $tagsContextKeys) : array()); - if (!$tagsContextKeys) { - $tagsContextKeys = $this->getHandlerDefaultOption('debugTagsKeysInContext'); - } - foreach ($tagsContextKeys as $key) { - $debugDispatcher = $this->initDebugDispatcherMock($this->connector); - $debugDispatcher->expects($this->once())->method('dispatchDebug')->with( - $this->anything(), - $this->equalTo($expectedTags) - ); - $this->connector->setDebugDispatcher($debugDispatcher); - $logger->addDebug('test', array($key => $expectedTags)); - } - } - - public function testError($classesPartialsTraceIgnore = null) - { - $code = E_USER_NOTICE; - $message = 'message'; - $file = __FILE__; - $line = __LINE__; - $this->errorDispatcher->expects($this->once())->method('dispatchError')->with( - $this->equalTo($code), - $this->equalTo($message), - $this->equalTo($file), - $this->equalTo($line), - $classesPartialsTraceIgnore ?: $this->equalTo($this->getHandlerDefaultOption('classesPartialsTraceIgnore')) - ); - $errorHandler = ErrorHandler::register($this->initLogger($classesPartialsTraceIgnore ? array('classesPartialsTraceIgnore' => $classesPartialsTraceIgnore) : array()), false); - $errorHandler->registerErrorHandler(array(), false, E_USER_WARNING); - $errorHandler->handleError($code, $message, $file, $line); - } - - public function testException() - { - $e = new Exception(); - $this->errorDispatcher->expects($this->once())->method('dispatchException')->with( - $this->equalTo($e) - ); - $handler = $this->initLogger(); - $handler->log( - \Psr\Log\LogLevel::ERROR, - sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()), - array('exception' => $e) - ); - } - - /** - * @expectedException Exception - */ - public function testWrongOptionsThrowsException() - { - new PHPConsoleHandler(array('xxx' => 1)); - } - - public function testOptionEnabled() - { - $this->debugDispatcher->expects($this->never())->method('dispatchDebug'); - $this->initLogger(array('enabled' => false))->addDebug('test'); - } - - public function testOptionClassesPartialsTraceIgnore() - { - $this->testError(array('Class', 'Namespace\\')); - } - - public function testOptionDebugTagsKeysInContext() - { - $this->testDebugTags(array('key1', 'key2')); - } - - public function testOptionUseOwnErrorsAndExceptionsHandler() - { - $this->initLogger(array('useOwnErrorsHandler' => true, 'useOwnExceptionsHandler' => true)); - $this->assertEquals(array(Handler::getInstance(), 'handleError'), set_error_handler(function () { - })); - $this->assertEquals(array(Handler::getInstance(), 'handleException'), set_exception_handler(function () { - })); - } - - public static function provideConnectorMethodsOptionsSets() - { - return array( - array('sourcesBasePath', 'setSourcesBasePath', __DIR__), - array('serverEncoding', 'setServerEncoding', 'cp1251'), - array('password', 'setPassword', '******'), - array('enableSslOnlyMode', 'enableSslOnlyMode', true, false), - array('ipMasks', 'setAllowedIpMasks', array('127.0.0.*')), - array('headersLimit', 'setHeadersLimit', 2500), - array('enableEvalListener', 'startEvalRequestsListener', true, false), - ); - } - - /** - * @dataProvider provideConnectorMethodsOptionsSets - */ - public function testOptionCallsConnectorMethod($option, $method, $value, $isArgument = true) - { - $expectCall = $this->connector->expects($this->once())->method($method); - if ($isArgument) { - $expectCall->with($value); - } - new PHPConsoleHandler(array($option => $value), $this->connector); - } - - public function testOptionDetectDumpTraceAndSource() - { - new PHPConsoleHandler(array('detectDumpTraceAndSource' => true), $this->connector); - $this->assertTrue($this->connector->getDebugDispatcher()->detectTraceAndSource); - } - - public static function provideDumperOptionsValues() - { - return array( - array('dumperLevelLimit', 'levelLimit', 1001), - array('dumperItemsCountLimit', 'itemsCountLimit', 1002), - array('dumperItemSizeLimit', 'itemSizeLimit', 1003), - array('dumperDumpSizeLimit', 'dumpSizeLimit', 1004), - array('dumperDetectCallbacks', 'detectCallbacks', true), - ); - } - - /** - * @dataProvider provideDumperOptionsValues - */ - public function testDumperOptions($option, $dumperProperty, $value) - { - new PHPConsoleHandler(array($option => $value), $this->connector); - $this->assertEquals($value, $this->connector->getDumper()->$dumperProperty); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php deleted file mode 100644 index 64eaab16..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/PsrHandlerTest.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\PsrHandler::handle - */ -class PsrHandlerTest extends TestCase -{ - public function logLevelProvider() - { - $levels = array(); - $monologLogger = new Logger(''); - - foreach ($monologLogger->getLevels() as $levelName => $level) { - $levels[] = array($levelName, $level); - } - - return $levels; - } - - /** - * @dataProvider logLevelProvider - */ - public function testHandlesAllLevels($levelName, $level) - { - $message = 'Hello, world! ' . $level; - $context = array('foo' => 'bar', 'level' => $level); - - $psrLogger = $this->getMock('Psr\Log\NullLogger'); - $psrLogger->expects($this->once()) - ->method('log') - ->with(strtolower($levelName), $message, $context); - - $handler = new PsrHandler($psrLogger); - $handler->handle(array('level' => $level, 'level_name' => $levelName, 'message' => $message, 'context' => $context)); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php deleted file mode 100644 index 56df474a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/PushoverHandlerTest.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * Almost all examples (expected header, titles, messages) taken from - * https://www.pushover.net/api - * @author Sebastian Göttschkes - * @see https://www.pushover.net/api - */ -class PushoverHandlerTest extends TestCase -{ - private $res; - private $handler; - - public function testWriteHeader() - { - $this->createHandler(); - $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/1\/messages.json HTTP\/1.1\\r\\nHost: api.pushover.net\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - - return $content; - } - - /** - * @depends testWriteHeader - */ - public function testWriteContent($content) - { - $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}$/', $content); - } - - public function testWriteWithComplexTitle() - { - $this->createHandler('myToken', 'myUser', 'Backup finished - SQL1'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/title=Backup\+finished\+-\+SQL1/', $content); - } - - public function testWriteWithComplexMessage() - { - $this->createHandler(); - $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Backup of database "example" finished in 16 minutes.')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/message=Backup\+of\+database\+%22example%22\+finished\+in\+16\+minutes\./', $content); - } - - public function testWriteWithTooLongMessage() - { - $message = str_pad('test', 520, 'a'); - $this->createHandler(); - $this->handler->setHighPriorityLevel(Logger::EMERGENCY); // skip priority notifications - $this->handler->handle($this->getRecord(Logger::CRITICAL, $message)); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $expectedMessage = substr($message, 0, 505); - - $this->assertRegexp('/message=' . $expectedMessage . '&title/', $content); - } - - public function testWriteWithHighPriority() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}&priority=1$/', $content); - } - - public function testWriteWithEmergencyPriority() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/token=myToken&user=myUser&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200$/', $content); - } - - public function testWriteToMultipleUsers() - { - $this->createHandler('myToken', array('userA', 'userB')); - $this->handler->handle($this->getRecord(Logger::EMERGENCY, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/token=myToken&user=userA&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200POST/', $content); - $this->assertRegexp('/token=myToken&user=userB&message=test1&title=Monolog×tamp=\d{10}&priority=2&retry=30&expire=25200$/', $content); - } - - private function createHandler($token = 'myToken', $user = 'myUser', $title = 'Monolog') - { - $constructorArgs = array($token, $user, $title); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\PushoverHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $constructorArgs - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - - $this->handler->setFormatter($this->getIdentityFormatter()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php deleted file mode 100644 index 26d212b9..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/RavenHandlerTest.php +++ /dev/null @@ -1,255 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; - -class RavenHandlerTest extends TestCase -{ - public function setUp() - { - if (!class_exists('Raven_Client')) { - $this->markTestSkipped('raven/raven not installed'); - } - - require_once __DIR__ . '/MockRavenClient.php'; - } - - /** - * @covers Monolog\Handler\RavenHandler::__construct - */ - public function testConstruct() - { - $handler = new RavenHandler($this->getRavenClient()); - $this->assertInstanceOf('Monolog\Handler\RavenHandler', $handler); - } - - protected function getHandler($ravenClient) - { - $handler = new RavenHandler($ravenClient); - - return $handler; - } - - protected function getRavenClient() - { - $dsn = 'http://43f6017361224d098402974103bfc53d:a6a0538fc2934ba2bed32e08741b2cd3@marca.python.live.cheggnet.com:9000/1'; - - return new MockRavenClient($dsn); - } - - public function testDebug() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $record = $this->getRecord(Logger::DEBUG, 'A test debug message'); - $handler->handle($record); - - $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']); - $this->assertContains($record['message'], $ravenClient->lastData['message']); - } - - public function testWarning() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $record = $this->getRecord(Logger::WARNING, 'A test warning message'); - $handler->handle($record); - - $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']); - $this->assertContains($record['message'], $ravenClient->lastData['message']); - } - - public function testTag() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $tags = array(1, 2, 'foo'); - $record = $this->getRecord(Logger::INFO, 'test', array('tags' => $tags)); - $handler->handle($record); - - $this->assertEquals($tags, $ravenClient->lastData['tags']); - } - - public function testExtraParameters() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $checksum = '098f6bcd4621d373cade4e832627b4f6'; - $release = '05a671c66aefea124cc08b76ea6d30bb'; - $eventId = '31423'; - $record = $this->getRecord(Logger::INFO, 'test', array('checksum' => $checksum, 'release' => $release, 'event_id' => $eventId)); - $handler->handle($record); - - $this->assertEquals($checksum, $ravenClient->lastData['checksum']); - $this->assertEquals($release, $ravenClient->lastData['release']); - $this->assertEquals($eventId, $ravenClient->lastData['event_id']); - } - - public function testFingerprint() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $fingerprint = array('{{ default }}', 'other value'); - $record = $this->getRecord(Logger::INFO, 'test', array('fingerprint' => $fingerprint)); - $handler->handle($record); - - $this->assertEquals($fingerprint, $ravenClient->lastData['fingerprint']); - } - - public function testUserContext() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $recordWithNoContext = $this->getRecord(Logger::INFO, 'test with default user context'); - // set user context 'externally' - - $user = array( - 'id' => '123', - 'email' => 'test@test.com', - ); - - $recordWithContext = $this->getRecord(Logger::INFO, 'test', array('user' => $user)); - - $ravenClient->user_context(array('id' => 'test_user_id')); - // handle context - $handler->handle($recordWithContext); - $this->assertEquals($user, $ravenClient->lastData['user']); - - // check to see if its reset - $handler->handle($recordWithNoContext); - $this->assertInternalType('array', $ravenClient->context->user); - $this->assertSame('test_user_id', $ravenClient->context->user['id']); - - // handle with null context - $ravenClient->user_context(null); - $handler->handle($recordWithContext); - $this->assertEquals($user, $ravenClient->lastData['user']); - - // check to see if its reset - $handler->handle($recordWithNoContext); - $this->assertNull($ravenClient->context->user); - } - - public function testException() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - try { - $this->methodThatThrowsAnException(); - } catch (\Exception $e) { - $record = $this->getRecord(Logger::ERROR, $e->getMessage(), array('exception' => $e)); - $handler->handle($record); - } - - $this->assertEquals($record['message'], $ravenClient->lastData['message']); - } - - public function testHandleBatch() - { - $records = $this->getMultipleRecords(); - $records[] = $this->getRecord(Logger::WARNING, 'warning'); - $records[] = $this->getRecord(Logger::WARNING, 'warning'); - - $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $logFormatter->expects($this->once())->method('formatBatch'); - - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) { - return $record['level'] == 400; - })); - - $handler = $this->getHandler($this->getRavenClient()); - $handler->setBatchFormatter($logFormatter); - $handler->setFormatter($formatter); - $handler->handleBatch($records); - } - - public function testHandleBatchDoNothingIfRecordsAreBelowLevel() - { - $records = array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information'), - ); - - $handler = $this->getMock('Monolog\Handler\RavenHandler', null, array($this->getRavenClient())); - $handler->expects($this->never())->method('handle'); - $handler->setLevel(Logger::ERROR); - $handler->handleBatch($records); - } - - public function testHandleBatchPicksProperMessage() - { - $records = array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information 1'), - $this->getRecord(Logger::ERROR, 'error 1'), - $this->getRecord(Logger::WARNING, 'warning'), - $this->getRecord(Logger::ERROR, 'error 2'), - $this->getRecord(Logger::INFO, 'information 2'), - ); - - $logFormatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $logFormatter->expects($this->once())->method('formatBatch'); - - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->once())->method('format')->with($this->callback(function ($record) use ($records) { - return $record['message'] == 'error 1'; - })); - - $handler = $this->getHandler($this->getRavenClient()); - $handler->setBatchFormatter($logFormatter); - $handler->setFormatter($formatter); - $handler->handleBatch($records); - } - - public function testGetSetBatchFormatter() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - - $handler->setBatchFormatter($formatter = new LineFormatter()); - $this->assertSame($formatter, $handler->getBatchFormatter()); - } - - public function testRelease() - { - $ravenClient = $this->getRavenClient(); - $handler = $this->getHandler($ravenClient); - $release = 'v42.42.42'; - $handler->setRelease($release); - $record = $this->getRecord(Logger::INFO, 'test'); - $handler->handle($record); - $this->assertEquals($release, $ravenClient->lastData['release']); - - $localRelease = 'v41.41.41'; - $record = $this->getRecord(Logger::INFO, 'test', array('release' => $localRelease)); - $handler->handle($record); - $this->assertEquals($localRelease, $ravenClient->lastData['release']); - } - - private function methodThatThrowsAnException() - { - throw new \Exception('This is an exception'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php deleted file mode 100644 index 689d5278..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/RedisHandlerTest.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; - -class RedisHandlerTest extends TestCase -{ - /** - * @expectedException InvalidArgumentException - */ - public function testConstructorShouldThrowExceptionForInvalidRedis() - { - new RedisHandler(new \stdClass(), 'key'); - } - - public function testConstructorShouldWorkWithPredis() - { - $redis = $this->getMock('Predis\Client'); - $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key')); - } - - public function testConstructorShouldWorkWithRedis() - { - $redis = $this->getMock('Redis'); - $this->assertInstanceof('Monolog\Handler\RedisHandler', new RedisHandler($redis, 'key')); - } - - public function testPredisHandle() - { - $redis = $this->getMock('Predis\Client', array('rpush')); - - // Predis\Client uses rpush - $redis->expects($this->once()) - ->method('rpush') - ->with('key', 'test'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new RedisHandler($redis, 'key'); - $handler->setFormatter(new LineFormatter("%message%")); - $handler->handle($record); - } - - public function testRedisHandle() - { - $redis = $this->getMock('Redis', array('rpush')); - - // Redis uses rPush - $redis->expects($this->once()) - ->method('rPush') - ->with('key', 'test'); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new RedisHandler($redis, 'key'); - $handler->setFormatter(new LineFormatter("%message%")); - $handler->handle($record); - } - - public function testRedisHandleCapped() - { - $redis = $this->getMock('Redis', array('multi', 'rpush', 'ltrim', 'exec')); - - // Redis uses multi - $redis->expects($this->once()) - ->method('multi') - ->will($this->returnSelf()); - - $redis->expects($this->once()) - ->method('rpush') - ->will($this->returnSelf()); - - $redis->expects($this->once()) - ->method('ltrim') - ->will($this->returnSelf()); - - $redis->expects($this->once()) - ->method('exec') - ->will($this->returnSelf()); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10); - $handler->setFormatter(new LineFormatter("%message%")); - $handler->handle($record); - } - - public function testPredisHandleCapped() - { - $redis = $this->getMock('Predis\Client', array('transaction')); - - $redisTransaction = $this->getMock('Predis\Client', array('rpush', 'ltrim')); - - $redisTransaction->expects($this->once()) - ->method('rpush') - ->will($this->returnSelf()); - - $redisTransaction->expects($this->once()) - ->method('ltrim') - ->will($this->returnSelf()); - - // Redis uses multi - $redis->expects($this->once()) - ->method('transaction') - ->will($this->returnCallback(function ($cb) use ($redisTransaction) { - $cb($redisTransaction); - })); - - $record = $this->getRecord(Logger::WARNING, 'test', array('data' => new \stdClass, 'foo' => 34)); - - $handler = new RedisHandler($redis, 'key', Logger::DEBUG, true, 10); - $handler->setFormatter(new LineFormatter("%message%")); - $handler->handle($record); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php deleted file mode 100644 index f302e917..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/RollbarHandlerTest.php +++ /dev/null @@ -1,84 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Exception; -use Monolog\TestCase; -use Monolog\Logger; -use PHPUnit_Framework_MockObject_MockObject as MockObject; - -/** - * @author Erik Johansson - * @see https://rollbar.com/docs/notifier/rollbar-php/ - * - * @coversDefaultClass Monolog\Handler\RollbarHandler - */ -class RollbarHandlerTest extends TestCase -{ - /** - * @var MockObject - */ - private $rollbarNotifier; - - /** - * @var array - */ - public $reportedExceptionArguments = null; - - protected function setUp() - { - parent::setUp(); - - $this->setupRollbarNotifierMock(); - } - - /** - * When reporting exceptions to Rollbar the - * level has to be set in the payload data - */ - public function testExceptionLogLevel() - { - $handler = $this->createHandler(); - - $handler->handle($this->createExceptionRecord(Logger::DEBUG)); - - $this->assertEquals('debug', $this->reportedExceptionArguments['payload']['level']); - } - - private function setupRollbarNotifierMock() - { - $this->rollbarNotifier = $this->getMockBuilder('RollbarNotifier') - ->setMethods(array('report_message', 'report_exception', 'flush')) - ->getMock(); - - $that = $this; - - $this->rollbarNotifier - ->expects($this->any()) - ->method('report_exception') - ->willReturnCallback(function ($exception, $context, $payload) use ($that) { - $that->reportedExceptionArguments = compact('exception', 'context', 'payload'); - }); - } - - private function createHandler() - { - return new RollbarHandler($this->rollbarNotifier, Logger::DEBUG); - } - - private function createExceptionRecord($level = Logger::DEBUG, $message = 'test', $exception = null) - { - return $this->getRecord($level, $message, array( - 'exception' => $exception ?: new Exception() - )); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php deleted file mode 100644 index f1feb228..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php +++ /dev/null @@ -1,211 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use PHPUnit_Framework_Error_Deprecated; - -/** - * @covers Monolog\Handler\RotatingFileHandler - */ -class RotatingFileHandlerTest extends TestCase -{ - /** - * This var should be private but then the anonymous function - * in the `setUp` method won't be able to set it. `$this` cant't - * be used in the anonymous function in `setUp` because PHP 5.3 - * does not support it. - */ - public $lastError; - - public function setUp() - { - $dir = __DIR__.'/Fixtures'; - chmod($dir, 0777); - if (!is_writable($dir)) { - $this->markTestSkipped($dir.' must be writable to test the RotatingFileHandler.'); - } - $this->lastError = null; - $self = $this; - // workaround with &$self used for PHP 5.3 - set_error_handler(function($code, $message) use (&$self) { - $self->lastError = array( - 'code' => $code, - 'message' => $message, - ); - }); - } - - private function assertErrorWasTriggered($code, $message) - { - if (empty($this->lastError)) { - $this->fail( - sprintf( - 'Failed asserting that error with code `%d` and message `%s` was triggered', - $code, - $message - ) - ); - } - $this->assertEquals($code, $this->lastError['code'], sprintf('Expected an error with code %d to be triggered, got `%s` instead', $code, $this->lastError['code'])); - $this->assertEquals($message, $this->lastError['message'], sprintf('Expected an error with message `%d` to be triggered, got `%s` instead', $message, $this->lastError['message'])); - } - - public function testRotationCreatesNewFile() - { - touch(__DIR__.'/Fixtures/foo-'.date('Y-m-d', time() - 86400).'.rot'); - - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot'); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord()); - - $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; - $this->assertTrue(file_exists($log)); - $this->assertEquals('test', file_get_contents($log)); - } - - /** - * @dataProvider rotationTests - */ - public function testRotation($createFile, $dateFormat, $timeCallback) - { - touch($old1 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-1)).'.rot'); - touch($old2 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-2)).'.rot'); - touch($old3 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-3)).'.rot'); - touch($old4 = __DIR__.'/Fixtures/foo-'.date($dateFormat, $timeCallback(-4)).'.rot'); - - $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot'; - - if ($createFile) { - touch($log); - } - - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->setFilenameFormat('{filename}-{date}', $dateFormat); - $handler->handle($this->getRecord()); - - $handler->close(); - - $this->assertTrue(file_exists($log)); - $this->assertTrue(file_exists($old1)); - $this->assertEquals($createFile, file_exists($old2)); - $this->assertEquals($createFile, file_exists($old3)); - $this->assertEquals($createFile, file_exists($old4)); - $this->assertEquals('test', file_get_contents($log)); - } - - public function rotationTests() - { - $now = time(); - $dayCallback = function($ago) use ($now) { - return $now + 86400 * $ago; - }; - $monthCallback = function($ago) { - return gmmktime(0, 0, 0, date('n') + $ago, 1, date('Y')); - }; - $yearCallback = function($ago) { - return gmmktime(0, 0, 0, 1, 1, date('Y') + $ago); - }; - - return array( - 'Rotation is triggered when the file of the current day is not present' - => array(true, RotatingFileHandler::FILE_PER_DAY, $dayCallback), - 'Rotation is not triggered when the file of the current day is already present' - => array(false, RotatingFileHandler::FILE_PER_DAY, $dayCallback), - - 'Rotation is triggered when the file of the current month is not present' - => array(true, RotatingFileHandler::FILE_PER_MONTH, $monthCallback), - 'Rotation is not triggered when the file of the current month is already present' - => array(false, RotatingFileHandler::FILE_PER_MONTH, $monthCallback), - - 'Rotation is triggered when the file of the current year is not present' - => array(true, RotatingFileHandler::FILE_PER_YEAR, $yearCallback), - 'Rotation is not triggered when the file of the current year is already present' - => array(false, RotatingFileHandler::FILE_PER_YEAR, $yearCallback), - ); - } - - /** - * @dataProvider dateFormatProvider - */ - public function testAllowOnlyFixedDefinedDateFormats($dateFormat, $valid) - { - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); - $handler->setFilenameFormat('{filename}-{date}', $dateFormat); - if (!$valid) { - $this->assertErrorWasTriggered( - E_USER_DEPRECATED, - 'Invalid date format - format must be one of RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), '. - 'RotatingFileHandler::FILE_PER_MONTH ("Y-m") or RotatingFileHandler::FILE_PER_YEAR ("Y"), '. - 'or you can set one of the date formats using slashes, underscores and/or dots instead of dashes.' - ); - } - } - - public function dateFormatProvider() - { - return array( - array(RotatingFileHandler::FILE_PER_DAY, true), - array(RotatingFileHandler::FILE_PER_MONTH, true), - array(RotatingFileHandler::FILE_PER_YEAR, true), - array('m-d-Y', false), - array('Y-m-d-h-i', false) - ); - } - - /** - * @dataProvider filenameFormatProvider - */ - public function testDisallowFilenameFormatsWithoutDate($filenameFormat, $valid) - { - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2); - $handler->setFilenameFormat($filenameFormat, RotatingFileHandler::FILE_PER_DAY); - if (!$valid) { - $this->assertErrorWasTriggered( - E_USER_DEPRECATED, - 'Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.' - ); - } - } - - public function filenameFormatProvider() - { - return array( - array('{filename}', false), - array('{filename}-{date}', true), - array('{date}', true), - array('foobar-{date}', true), - array('foo-{date}-bar', true), - array('{date}-foobar', true), - array('foobar', false), - ); - } - - public function testReuseCurrentFile() - { - $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot'; - file_put_contents($log, "foo"); - $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot'); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord()); - $this->assertEquals('footest', file_get_contents($log)); - } - - public function tearDown() - { - foreach (glob(__DIR__.'/Fixtures/*.rot') as $file) { - unlink($file); - } - restore_error_handler(); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php deleted file mode 100644 index b354cee1..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SamplingHandlerTest.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -/** - * @covers Monolog\Handler\SamplingHandler::handle - */ -class SamplingHandlerTest extends TestCase -{ - public function testHandle() - { - $testHandler = new TestHandler(); - $handler = new SamplingHandler($testHandler, 2); - for ($i = 0; $i < 10000; $i++) { - $handler->handle($this->getRecord()); - } - $count = count($testHandler->getRecords()); - // $count should be half of 10k, so between 4k and 6k - $this->assertLessThan(6000, $count); - $this->assertGreaterThan(4000, $count); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php deleted file mode 100644 index e1aa96d7..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php +++ /dev/null @@ -1,387 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler\Slack; - -use Monolog\Logger; -use Monolog\TestCase; - -/** - * @coversDefaultClass Monolog\Handler\Slack\SlackRecord - */ -class SlackRecordTest extends TestCase -{ - private $jsonPrettyPrintFlag; - - protected function setUp() - { - $this->jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; - } - - public function dataGetAttachmentColor() - { - return array( - array(Logger::DEBUG, SlackRecord::COLOR_DEFAULT), - array(Logger::INFO, SlackRecord::COLOR_GOOD), - array(Logger::NOTICE, SlackRecord::COLOR_GOOD), - array(Logger::WARNING, SlackRecord::COLOR_WARNING), - array(Logger::ERROR, SlackRecord::COLOR_DANGER), - array(Logger::CRITICAL, SlackRecord::COLOR_DANGER), - array(Logger::ALERT, SlackRecord::COLOR_DANGER), - array(Logger::EMERGENCY, SlackRecord::COLOR_DANGER), - ); - } - - /** - * @dataProvider dataGetAttachmentColor - * @param int $logLevel - * @param string $expectedColour RGB hex color or name of Slack color - * @covers ::getAttachmentColor - */ - public function testGetAttachmentColor($logLevel, $expectedColour) - { - $slackRecord = new SlackRecord(); - $this->assertSame( - $expectedColour, - $slackRecord->getAttachmentColor($logLevel) - ); - } - - public function testAddsChannel() - { - $channel = '#test'; - $record = new SlackRecord($channel); - $data = $record->getSlackData($this->getRecord()); - - $this->assertArrayHasKey('channel', $data); - $this->assertSame($channel, $data['channel']); - } - - public function testNoUsernameByDefault() - { - $record = new SlackRecord(); - $data = $record->getSlackData($this->getRecord()); - - $this->assertArrayNotHasKey('username', $data); - } - - /** - * @return array - */ - public function dataStringify() - { - $jsonPrettyPrintFlag = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 128; - - $multipleDimensions = array(array(1, 2)); - $numericKeys = array('library' => 'monolog'); - $singleDimension = array(1, 'Hello', 'Jordi'); - - return array( - array(array(), '[]'), - array($multipleDimensions, json_encode($multipleDimensions, $jsonPrettyPrintFlag)), - array($numericKeys, json_encode($numericKeys, $jsonPrettyPrintFlag)), - array($singleDimension, json_encode($singleDimension)) - ); - } - - /** - * @dataProvider dataStringify - */ - public function testStringify($fields, $expectedResult) - { - $slackRecord = new SlackRecord( - '#test', - 'test', - true, - null, - true, - true - ); - - $this->assertSame($expectedResult, $slackRecord->stringify($fields)); - } - - public function testAddsCustomUsername() - { - $username = 'Monolog bot'; - $record = new SlackRecord(null, $username); - $data = $record->getSlackData($this->getRecord()); - - $this->assertArrayHasKey('username', $data); - $this->assertSame($username, $data['username']); - } - - public function testNoIcon() - { - $record = new SlackRecord(); - $data = $record->getSlackData($this->getRecord()); - - $this->assertArrayNotHasKey('icon_emoji', $data); - } - - public function testAddsIcon() - { - $record = $this->getRecord(); - $slackRecord = new SlackRecord(null, null, false, 'ghost'); - $data = $slackRecord->getSlackData($record); - - $slackRecord2 = new SlackRecord(null, null, false, 'http://github.com/Seldaek/monolog'); - $data2 = $slackRecord2->getSlackData($record); - - $this->assertArrayHasKey('icon_emoji', $data); - $this->assertSame(':ghost:', $data['icon_emoji']); - $this->assertArrayHasKey('icon_url', $data2); - $this->assertSame('http://github.com/Seldaek/monolog', $data2['icon_url']); - } - - public function testAttachmentsNotPresentIfNoAttachment() - { - $record = new SlackRecord(null, null, false); - $data = $record->getSlackData($this->getRecord()); - - $this->assertArrayNotHasKey('attachments', $data); - } - - public function testAddsOneAttachment() - { - $record = new SlackRecord(); - $data = $record->getSlackData($this->getRecord()); - - $this->assertArrayHasKey('attachments', $data); - $this->assertArrayHasKey(0, $data['attachments']); - $this->assertInternalType('array', $data['attachments'][0]); - } - - public function testTextEqualsMessageIfNoAttachment() - { - $message = 'Test message'; - $record = new SlackRecord(null, null, false); - $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); - - $this->assertArrayHasKey('text', $data); - $this->assertSame($message, $data['text']); - } - - public function testTextEqualsFormatterOutput() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter - ->expects($this->any()) - ->method('format') - ->will($this->returnCallback(function ($record) { return $record['message'] . 'test'; })); - - $formatter2 = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter2 - ->expects($this->any()) - ->method('format') - ->will($this->returnCallback(function ($record) { return $record['message'] . 'test1'; })); - - $message = 'Test message'; - $record = new SlackRecord(null, null, false, null, false, false, array(), $formatter); - $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); - - $this->assertArrayHasKey('text', $data); - $this->assertSame($message . 'test', $data['text']); - - $record->setFormatter($formatter2); - $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); - - $this->assertArrayHasKey('text', $data); - $this->assertSame($message . 'test1', $data['text']); - } - - public function testAddsFallbackAndTextToAttachment() - { - $message = 'Test message'; - $record = new SlackRecord(null); - $data = $record->getSlackData($this->getRecord(Logger::WARNING, $message)); - - $this->assertSame($message, $data['attachments'][0]['text']); - $this->assertSame($message, $data['attachments'][0]['fallback']); - } - - public function testMapsLevelToColorAttachmentColor() - { - $record = new SlackRecord(null); - $errorLoggerRecord = $this->getRecord(Logger::ERROR); - $emergencyLoggerRecord = $this->getRecord(Logger::EMERGENCY); - $warningLoggerRecord = $this->getRecord(Logger::WARNING); - $infoLoggerRecord = $this->getRecord(Logger::INFO); - $debugLoggerRecord = $this->getRecord(Logger::DEBUG); - - $data = $record->getSlackData($errorLoggerRecord); - $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']); - - $data = $record->getSlackData($emergencyLoggerRecord); - $this->assertSame(SlackRecord::COLOR_DANGER, $data['attachments'][0]['color']); - - $data = $record->getSlackData($warningLoggerRecord); - $this->assertSame(SlackRecord::COLOR_WARNING, $data['attachments'][0]['color']); - - $data = $record->getSlackData($infoLoggerRecord); - $this->assertSame(SlackRecord::COLOR_GOOD, $data['attachments'][0]['color']); - - $data = $record->getSlackData($debugLoggerRecord); - $this->assertSame(SlackRecord::COLOR_DEFAULT, $data['attachments'][0]['color']); - } - - public function testAddsShortAttachmentWithoutContextAndExtra() - { - $level = Logger::ERROR; - $levelName = Logger::getLevelName($level); - $record = new SlackRecord(null, null, true, null, true); - $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1))); - - $attachment = $data['attachments'][0]; - $this->assertArrayHasKey('title', $attachment); - $this->assertArrayHasKey('fields', $attachment); - $this->assertSame($levelName, $attachment['title']); - $this->assertSame(array(), $attachment['fields']); - } - - public function testAddsShortAttachmentWithContextAndExtra() - { - $level = Logger::ERROR; - $levelName = Logger::getLevelName($level); - $context = array('test' => 1); - $extra = array('tags' => array('web')); - $record = new SlackRecord(null, null, true, null, true, true); - $loggerRecord = $this->getRecord($level, 'test', $context); - $loggerRecord['extra'] = $extra; - $data = $record->getSlackData($loggerRecord); - - $attachment = $data['attachments'][0]; - $this->assertArrayHasKey('title', $attachment); - $this->assertArrayHasKey('fields', $attachment); - $this->assertCount(2, $attachment['fields']); - $this->assertSame($levelName, $attachment['title']); - $this->assertSame( - array( - array( - 'title' => 'Extra', - 'value' => sprintf('```%s```', json_encode($extra, $this->jsonPrettyPrintFlag)), - 'short' => false - ), - array( - 'title' => 'Context', - 'value' => sprintf('```%s```', json_encode($context, $this->jsonPrettyPrintFlag)), - 'short' => false - ) - ), - $attachment['fields'] - ); - } - - public function testAddsLongAttachmentWithoutContextAndExtra() - { - $level = Logger::ERROR; - $levelName = Logger::getLevelName($level); - $record = new SlackRecord(null, null, true, null); - $data = $record->getSlackData($this->getRecord($level, 'test', array('test' => 1))); - - $attachment = $data['attachments'][0]; - $this->assertArrayHasKey('title', $attachment); - $this->assertArrayHasKey('fields', $attachment); - $this->assertCount(1, $attachment['fields']); - $this->assertSame('Message', $attachment['title']); - $this->assertSame( - array(array( - 'title' => 'Level', - 'value' => $levelName, - 'short' => false - )), - $attachment['fields'] - ); - } - - public function testAddsLongAttachmentWithContextAndExtra() - { - $level = Logger::ERROR; - $levelName = Logger::getLevelName($level); - $context = array('test' => 1); - $extra = array('tags' => array('web')); - $record = new SlackRecord(null, null, true, null, false, true); - $loggerRecord = $this->getRecord($level, 'test', $context); - $loggerRecord['extra'] = $extra; - $data = $record->getSlackData($loggerRecord); - - $expectedFields = array( - array( - 'title' => 'Level', - 'value' => $levelName, - 'short' => false, - ), - array( - 'title' => 'tags', - 'value' => sprintf('```%s```', json_encode($extra['tags'])), - 'short' => false - ), - array( - 'title' => 'test', - 'value' => $context['test'], - 'short' => false - ) - ); - - $attachment = $data['attachments'][0]; - $this->assertArrayHasKey('title', $attachment); - $this->assertArrayHasKey('fields', $attachment); - $this->assertCount(3, $attachment['fields']); - $this->assertSame('Message', $attachment['title']); - $this->assertSame( - $expectedFields, - $attachment['fields'] - ); - } - - public function testAddsTimestampToAttachment() - { - $record = $this->getRecord(); - $slackRecord = new SlackRecord(); - $data = $slackRecord->getSlackData($this->getRecord()); - - $attachment = $data['attachments'][0]; - $this->assertArrayHasKey('ts', $attachment); - $this->assertSame($record['datetime']->getTimestamp(), $attachment['ts']); - } - - public function testExcludeExtraAndContextFields() - { - $record = $this->getRecord( - Logger::WARNING, - 'test', - array('info' => array('library' => 'monolog', 'author' => 'Jordi')) - ); - $record['extra'] = array('tags' => array('web', 'cli')); - - $slackRecord = new SlackRecord(null, null, true, null, false, true, array('context.info.library', 'extra.tags.1')); - $data = $slackRecord->getSlackData($record); - $attachment = $data['attachments'][0]; - - $expected = array( - array( - 'title' => 'info', - 'value' => sprintf('```%s```', json_encode(array('author' => 'Jordi'), $this->jsonPrettyPrintFlag)), - 'short' => false - ), - array( - 'title' => 'tags', - 'value' => sprintf('```%s```', json_encode(array('web'))), - 'short' => false - ), - ); - - foreach ($expected as $field) { - $this->assertNotFalse(array_search($field, $attachment['fields'])); - break; - } - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php deleted file mode 100644 index b12b01f4..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SlackHandlerTest.php +++ /dev/null @@ -1,155 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; -use Monolog\Handler\Slack\SlackRecord; - -/** - * @author Greg Kedzierski - * @see https://api.slack.com/ - */ -class SlackHandlerTest extends TestCase -{ - /** - * @var resource - */ - private $res; - - /** - * @var SlackHandler - */ - private $handler; - - public function setUp() - { - if (!extension_loaded('openssl')) { - $this->markTestSkipped('This test requires openssl to run'); - } - } - - public function testWriteHeader() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/POST \/api\/chat.postMessage HTTP\/1.1\\r\\nHost: slack.com\\r\\nContent-Type: application\/x-www-form-urlencoded\\r\\nContent-Length: \d{2,4}\\r\\n\\r\\n/', $content); - } - - public function testWriteContent() - { - $this->createHandler(); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegExp('/username=Monolog/', $content); - $this->assertRegExp('/channel=channel1/', $content); - $this->assertRegExp('/token=myToken/', $content); - $this->assertRegExp('/attachments/', $content); - } - - public function testWriteContentUsesFormatterIfProvided() - { - $this->createHandler('myToken', 'channel1', 'Monolog', false); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->createHandler('myToken', 'channel1', 'Monolog', false); - $this->handler->setFormatter(new LineFormatter('foo--%message%')); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test2')); - fseek($this->res, 0); - $content2 = fread($this->res, 1024); - - $this->assertRegexp('/text=test1/', $content); - $this->assertRegexp('/text=foo--test2/', $content2); - } - - public function testWriteContentWithEmoji() - { - $this->createHandler('myToken', 'channel1', 'Monolog', true, 'alien'); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/icon_emoji=%3Aalien%3A/', $content); - } - - /** - * @dataProvider provideLevelColors - */ - public function testWriteContentWithColors($level, $expectedColor) - { - $this->createHandler(); - $this->handler->handle($this->getRecord($level, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/%22color%22%3A%22'.$expectedColor.'/', $content); - } - - public function testWriteContentWithPlainTextMessage() - { - $this->createHandler('myToken', 'channel1', 'Monolog', false); - $this->handler->handle($this->getRecord(Logger::CRITICAL, 'test1')); - fseek($this->res, 0); - $content = fread($this->res, 1024); - - $this->assertRegexp('/text=test1/', $content); - } - - public function provideLevelColors() - { - return array( - array(Logger::DEBUG, urlencode(SlackRecord::COLOR_DEFAULT)), - array(Logger::INFO, SlackRecord::COLOR_GOOD), - array(Logger::NOTICE, SlackRecord::COLOR_GOOD), - array(Logger::WARNING, SlackRecord::COLOR_WARNING), - array(Logger::ERROR, SlackRecord::COLOR_DANGER), - array(Logger::CRITICAL, SlackRecord::COLOR_DANGER), - array(Logger::ALERT, SlackRecord::COLOR_DANGER), - array(Logger::EMERGENCY,SlackRecord::COLOR_DANGER), - ); - } - - private function createHandler($token = 'myToken', $channel = 'channel1', $username = 'Monolog', $useAttachment = true, $iconEmoji = null, $useShortAttachment = false, $includeExtra = false) - { - $constructorArgs = array($token, $channel, $username, $useAttachment, $iconEmoji, Logger::DEBUG, true, $useShortAttachment, $includeExtra); - $this->res = fopen('php://memory', 'a'); - $this->handler = $this->getMock( - '\Monolog\Handler\SlackHandler', - array('fsockopen', 'streamSetTimeout', 'closeSocket'), - $constructorArgs - ); - - $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString'); - $reflectionProperty->setAccessible(true); - $reflectionProperty->setValue($this->handler, 'localhost:1234'); - - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - $this->handler->expects($this->any()) - ->method('closeSocket') - ->will($this->returnValue(true)); - - $this->handler->setFormatter($this->getIdentityFormatter()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php deleted file mode 100644 index c9229e26..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SlackWebhookHandlerTest.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; -use Monolog\Formatter\LineFormatter; -use Monolog\Handler\Slack\SlackRecord; - -/** - * @author Haralan Dobrev - * @see https://api.slack.com/incoming-webhooks - * @coversDefaultClass Monolog\Handler\SlackWebhookHandler - */ -class SlackWebhookHandlerTest extends TestCase -{ - const WEBHOOK_URL = 'https://hooks.slack.com/services/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E'; - - /** - * @covers ::__construct - * @covers ::getSlackRecord - */ - public function testConstructorMinimal() - { - $handler = new SlackWebhookHandler(self::WEBHOOK_URL); - $record = $this->getRecord(); - $slackRecord = $handler->getSlackRecord(); - $this->assertInstanceOf('Monolog\Handler\Slack\SlackRecord', $slackRecord); - $this->assertEquals(array( - 'attachments' => array( - array( - 'fallback' => 'test', - 'text' => 'test', - 'color' => SlackRecord::COLOR_WARNING, - 'fields' => array( - array( - 'title' => 'Level', - 'value' => 'WARNING', - 'short' => false, - ), - ), - 'title' => 'Message', - 'mrkdwn_in' => array('fields'), - 'ts' => $record['datetime']->getTimestamp(), - ), - ), - ), $slackRecord->getSlackData($record)); - } - - /** - * @covers ::__construct - * @covers ::getSlackRecord - */ - public function testConstructorFull() - { - $handler = new SlackWebhookHandler( - self::WEBHOOK_URL, - 'test-channel', - 'test-username', - false, - ':ghost:', - false, - false, - Logger::DEBUG, - false - ); - - $slackRecord = $handler->getSlackRecord(); - $this->assertInstanceOf('Monolog\Handler\Slack\SlackRecord', $slackRecord); - $this->assertEquals(array( - 'username' => 'test-username', - 'text' => 'test', - 'channel' => 'test-channel', - 'icon_emoji' => ':ghost:', - ), $slackRecord->getSlackData($this->getRecord())); - } - - /** - * @covers ::getFormatter - */ - public function testGetFormatter() - { - $handler = new SlackWebhookHandler(self::WEBHOOK_URL); - $formatter = $handler->getFormatter(); - $this->assertInstanceOf('Monolog\Formatter\FormatterInterface', $formatter); - } - - /** - * @covers ::setFormatter - */ - public function testSetFormatter() - { - $handler = new SlackWebhookHandler(self::WEBHOOK_URL); - $formatter = new LineFormatter(); - $handler->setFormatter($formatter); - $this->assertSame($formatter, $handler->getFormatter()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php deleted file mode 100644 index b1b02bde..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SlackbotHandlerTest.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Haralan Dobrev - * @see https://slack.com/apps/A0F81R8ET-slackbot - * @coversDefaultClass Monolog\Handler\SlackbotHandler - */ -class SlackbotHandlerTest extends TestCase -{ - /** - * @covers ::__construct - */ - public function testConstructorMinimal() - { - $handler = new SlackbotHandler('test-team', 'test-token', 'test-channel'); - $this->assertInstanceOf('Monolog\Handler\AbstractProcessingHandler', $handler); - } - - /** - * @covers ::__construct - */ - public function testConstructorFull() - { - $handler = new SlackbotHandler( - 'test-team', - 'test-token', - 'test-channel', - Logger::DEBUG, - false - ); - $this->assertInstanceOf('Monolog\Handler\AbstractProcessingHandler', $handler); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php deleted file mode 100644 index 1f9c1f28..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php +++ /dev/null @@ -1,309 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @author Pablo de Leon Belloc - */ -class SocketHandlerTest extends TestCase -{ - /** - * @var Monolog\Handler\SocketHandler - */ - private $handler; - - /** - * @var resource - */ - private $res; - - /** - * @expectedException UnexpectedValueException - */ - public function testInvalidHostname() - { - $this->createHandler('garbage://here'); - $this->writeRecord('data'); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testBadConnectionTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setConnectionTimeout(-1); - } - - public function testSetConnectionTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setConnectionTimeout(10.1); - $this->assertEquals(10.1, $this->handler->getConnectionTimeout()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testBadTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setTimeout(-1); - } - - public function testSetTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setTimeout(10.25); - $this->assertEquals(10.25, $this->handler->getTimeout()); - } - - public function testSetWritingTimeout() - { - $this->createHandler('localhost:1234'); - $this->handler->setWritingTimeout(10.25); - $this->assertEquals(10.25, $this->handler->getWritingTimeout()); - } - - public function testSetConnectionString() - { - $this->createHandler('tcp://localhost:9090'); - $this->assertEquals('tcp://localhost:9090', $this->handler->getConnectionString()); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testExceptionIsThrownOnFsockopenError() - { - $this->setMockHandler(array('fsockopen')); - $this->handler->expects($this->once()) - ->method('fsockopen') - ->will($this->returnValue(false)); - $this->writeRecord('Hello world'); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testExceptionIsThrownOnPfsockopenError() - { - $this->setMockHandler(array('pfsockopen')); - $this->handler->expects($this->once()) - ->method('pfsockopen') - ->will($this->returnValue(false)); - $this->handler->setPersistent(true); - $this->writeRecord('Hello world'); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testExceptionIsThrownIfCannotSetTimeout() - { - $this->setMockHandler(array('streamSetTimeout')); - $this->handler->expects($this->once()) - ->method('streamSetTimeout') - ->will($this->returnValue(false)); - $this->writeRecord('Hello world'); - } - - /** - * @expectedException RuntimeException - */ - public function testWriteFailsOnIfFwriteReturnsFalse() - { - $this->setMockHandler(array('fwrite')); - - $callback = function ($arg) { - $map = array( - 'Hello world' => 6, - 'world' => false, - ); - - return $map[$arg]; - }; - - $this->handler->expects($this->exactly(2)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - - $this->writeRecord('Hello world'); - } - - /** - * @expectedException RuntimeException - */ - public function testWriteFailsIfStreamTimesOut() - { - $this->setMockHandler(array('fwrite', 'streamGetMetadata')); - - $callback = function ($arg) { - $map = array( - 'Hello world' => 6, - 'world' => 5, - ); - - return $map[$arg]; - }; - - $this->handler->expects($this->exactly(1)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - $this->handler->expects($this->exactly(1)) - ->method('streamGetMetadata') - ->will($this->returnValue(array('timed_out' => true))); - - $this->writeRecord('Hello world'); - } - - /** - * @expectedException RuntimeException - */ - public function testWriteFailsOnIncompleteWrite() - { - $this->setMockHandler(array('fwrite', 'streamGetMetadata')); - - $res = $this->res; - $callback = function ($string) use ($res) { - fclose($res); - - return strlen('Hello'); - }; - - $this->handler->expects($this->exactly(1)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - $this->handler->expects($this->exactly(1)) - ->method('streamGetMetadata') - ->will($this->returnValue(array('timed_out' => false))); - - $this->writeRecord('Hello world'); - } - - public function testWriteWithMemoryFile() - { - $this->setMockHandler(); - $this->writeRecord('test1'); - $this->writeRecord('test2'); - $this->writeRecord('test3'); - fseek($this->res, 0); - $this->assertEquals('test1test2test3', fread($this->res, 1024)); - } - - public function testWriteWithMock() - { - $this->setMockHandler(array('fwrite')); - - $callback = function ($arg) { - $map = array( - 'Hello world' => 6, - 'world' => 5, - ); - - return $map[$arg]; - }; - - $this->handler->expects($this->exactly(2)) - ->method('fwrite') - ->will($this->returnCallback($callback)); - - $this->writeRecord('Hello world'); - } - - public function testClose() - { - $this->setMockHandler(); - $this->writeRecord('Hello world'); - $this->assertInternalType('resource', $this->res); - $this->handler->close(); - $this->assertFalse(is_resource($this->res), "Expected resource to be closed after closing handler"); - } - - public function testCloseDoesNotClosePersistentSocket() - { - $this->setMockHandler(); - $this->handler->setPersistent(true); - $this->writeRecord('Hello world'); - $this->assertTrue(is_resource($this->res)); - $this->handler->close(); - $this->assertTrue(is_resource($this->res)); - } - - /** - * @expectedException \RuntimeException - */ - public function testAvoidInfiniteLoopWhenNoDataIsWrittenForAWritingTimeoutSeconds() - { - $this->setMockHandler(array('fwrite', 'streamGetMetadata')); - - $this->handler->expects($this->any()) - ->method('fwrite') - ->will($this->returnValue(0)); - - $this->handler->expects($this->any()) - ->method('streamGetMetadata') - ->will($this->returnValue(array('timed_out' => false))); - - $this->handler->setWritingTimeout(1); - - $this->writeRecord('Hello world'); - } - - private function createHandler($connectionString) - { - $this->handler = new SocketHandler($connectionString); - $this->handler->setFormatter($this->getIdentityFormatter()); - } - - private function writeRecord($string) - { - $this->handler->handle($this->getRecord(Logger::WARNING, $string)); - } - - private function setMockHandler(array $methods = array()) - { - $this->res = fopen('php://memory', 'a'); - - $defaultMethods = array('fsockopen', 'pfsockopen', 'streamSetTimeout'); - $newMethods = array_diff($methods, $defaultMethods); - - $finalMethods = array_merge($defaultMethods, $newMethods); - - $this->handler = $this->getMock( - '\Monolog\Handler\SocketHandler', $finalMethods, array('localhost:1234') - ); - - if (!in_array('fsockopen', $methods)) { - $this->handler->expects($this->any()) - ->method('fsockopen') - ->will($this->returnValue($this->res)); - } - - if (!in_array('pfsockopen', $methods)) { - $this->handler->expects($this->any()) - ->method('pfsockopen') - ->will($this->returnValue($this->res)); - } - - if (!in_array('streamSetTimeout', $methods)) { - $this->handler->expects($this->any()) - ->method('streamSetTimeout') - ->will($this->returnValue(true)); - } - - $this->handler->setFormatter($this->getIdentityFormatter()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php deleted file mode 100644 index 487030fe..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/StreamHandlerTest.php +++ /dev/null @@ -1,184 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class StreamHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWrite() - { - $handle = fopen('php://memory', 'a+'); - $handler = new StreamHandler($handle); - $handler->setFormatter($this->getIdentityFormatter()); - $handler->handle($this->getRecord(Logger::WARNING, 'test')); - $handler->handle($this->getRecord(Logger::WARNING, 'test2')); - $handler->handle($this->getRecord(Logger::WARNING, 'test3')); - fseek($handle, 0); - $this->assertEquals('testtest2test3', fread($handle, 100)); - } - - /** - * @covers Monolog\Handler\StreamHandler::close - */ - public function testCloseKeepsExternalHandlersOpen() - { - $handle = fopen('php://memory', 'a+'); - $handler = new StreamHandler($handle); - $this->assertTrue(is_resource($handle)); - $handler->close(); - $this->assertTrue(is_resource($handle)); - } - - /** - * @covers Monolog\Handler\StreamHandler::close - */ - public function testClose() - { - $handler = new StreamHandler('php://memory'); - $handler->handle($this->getRecord(Logger::WARNING, 'test')); - $streamProp = new \ReflectionProperty('Monolog\Handler\StreamHandler', 'stream'); - $streamProp->setAccessible(true); - $handle = $streamProp->getValue($handler); - - $this->assertTrue(is_resource($handle)); - $handler->close(); - $this->assertFalse(is_resource($handle)); - } - - /** - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteCreatesTheStreamResource() - { - $handler = new StreamHandler('php://memory'); - $handler->handle($this->getRecord()); - } - - /** - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteLocking() - { - $temp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'monolog_locked_log'; - $handler = new StreamHandler($temp, Logger::DEBUG, true, null, true); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException LogicException - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteMissingResource() - { - $handler = new StreamHandler(null); - $handler->handle($this->getRecord()); - } - - public function invalidArgumentProvider() - { - return array( - array(1), - array(array()), - array(array('bogus://url')), - ); - } - - /** - * @dataProvider invalidArgumentProvider - * @expectedException InvalidArgumentException - * @covers Monolog\Handler\StreamHandler::__construct - */ - public function testWriteInvalidArgument($invalidArgument) - { - $handler = new StreamHandler($invalidArgument); - } - - /** - * @expectedException UnexpectedValueException - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteInvalidResource() - { - $handler = new StreamHandler('bogus://url'); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException UnexpectedValueException - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteNonExistingResource() - { - $handler = new StreamHandler('ftp://foo/bar/baz/'.rand(0, 10000)); - $handler->handle($this->getRecord()); - } - - /** - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteNonExistingPath() - { - $handler = new StreamHandler(sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); - $handler->handle($this->getRecord()); - } - - /** - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteNonExistingFileResource() - { - $handler = new StreamHandler('file://'.sys_get_temp_dir().'/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException Exception - * @expectedExceptionMessageRegExp /There is no existing directory at/ - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteNonExistingAndNotCreatablePath() - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - $this->markTestSkipped('Permissions checks can not run on windows'); - } - $handler = new StreamHandler('/foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); - $handler->handle($this->getRecord()); - } - - /** - * @expectedException Exception - * @expectedExceptionMessageRegExp /There is no existing directory at/ - * @covers Monolog\Handler\StreamHandler::__construct - * @covers Monolog\Handler\StreamHandler::write - */ - public function testWriteNonExistingAndNotCreatableFileResource() - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - $this->markTestSkipped('Permissions checks can not run on windows'); - } - $handler = new StreamHandler('file:///foo/bar/'.rand(0, 10000).DIRECTORY_SEPARATOR.rand(0, 10000)); - $handler->handle($this->getRecord()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php deleted file mode 100644 index 1d62940f..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SwiftMailerHandlerTest.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; -use Monolog\TestCase; - -class SwiftMailerHandlerTest extends TestCase -{ - /** @var \Swift_Mailer|\PHPUnit_Framework_MockObject_MockObject */ - private $mailer; - - public function setUp() - { - $this->mailer = $this - ->getMockBuilder('Swift_Mailer') - ->disableOriginalConstructor() - ->getMock(); - } - - public function testMessageCreationIsLazyWhenUsingCallback() - { - $this->mailer->expects($this->never()) - ->method('send'); - - $callback = function () { - throw new \RuntimeException('Swift_Message creation callback should not have been called in this test'); - }; - $handler = new SwiftMailerHandler($this->mailer, $callback); - - $records = array( - $this->getRecord(Logger::DEBUG), - $this->getRecord(Logger::INFO), - ); - $handler->handleBatch($records); - } - - public function testMessageCanBeCustomizedGivenLoggedData() - { - // Wire Mailer to expect a specific Swift_Message with a customized Subject - $expectedMessage = new \Swift_Message(); - $this->mailer->expects($this->once()) - ->method('send') - ->with($this->callback(function ($value) use ($expectedMessage) { - return $value instanceof \Swift_Message - && $value->getSubject() === 'Emergency' - && $value === $expectedMessage; - })); - - // Callback dynamically changes subject based on number of logged records - $callback = function ($content, array $records) use ($expectedMessage) { - $subject = count($records) > 0 ? 'Emergency' : 'Normal'; - $expectedMessage->setSubject($subject); - - return $expectedMessage; - }; - $handler = new SwiftMailerHandler($this->mailer, $callback); - - // Logging 1 record makes this an Emergency - $records = array( - $this->getRecord(Logger::EMERGENCY), - ); - $handler->handleBatch($records); - } - - public function testMessageSubjectFormatting() - { - // Wire Mailer to expect a specific Swift_Message with a customized Subject - $messageTemplate = new \Swift_Message(); - $messageTemplate->setSubject('Alert: %level_name% %message%'); - $receivedMessage = null; - - $this->mailer->expects($this->once()) - ->method('send') - ->with($this->callback(function ($value) use (&$receivedMessage) { - $receivedMessage = $value; - return true; - })); - - $handler = new SwiftMailerHandler($this->mailer, $messageTemplate); - - $records = array( - $this->getRecord(Logger::EMERGENCY), - ); - $handler->handleBatch($records); - - $this->assertEquals('Alert: EMERGENCY test', $receivedMessage->getSubject()); - } - - public function testMessageHaveUniqueId() - { - $messageTemplate = new \Swift_Message(); - $handler = new SwiftMailerHandler($this->mailer, $messageTemplate); - - $method = new \ReflectionMethod('Monolog\Handler\SwiftMailerHandler', 'buildMessage'); - $method->setAccessible(true); - $method->invokeArgs($handler, array($messageTemplate, array())); - - $builtMessage1 = $method->invoke($handler, $messageTemplate, array()); - $builtMessage2 = $method->invoke($handler, $messageTemplate, array()); - - $this->assertFalse($builtMessage1->getId() === $builtMessage2->getId(), 'Two different messages have the same id'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php deleted file mode 100644 index 8f9e46bf..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogHandlerTest.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\Logger; - -class SyslogHandlerTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Handler\SyslogHandler::__construct - */ - public function testConstruct() - { - $handler = new SyslogHandler('test'); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - - $handler = new SyslogHandler('test', LOG_USER); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - - $handler = new SyslogHandler('test', 'user'); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - - $handler = new SyslogHandler('test', LOG_USER, Logger::DEBUG, true, LOG_PERROR); - $this->assertInstanceOf('Monolog\Handler\SyslogHandler', $handler); - } - - /** - * @covers Monolog\Handler\SyslogHandler::__construct - */ - public function testConstructInvalidFacility() - { - $this->setExpectedException('UnexpectedValueException'); - $handler = new SyslogHandler('test', 'unknown'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php deleted file mode 100644 index 7ee8a985..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/SyslogUdpHandlerTest.php +++ /dev/null @@ -1,76 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -/** - * @requires extension sockets - */ -class SyslogUdpHandlerTest extends TestCase -{ - /** - * @expectedException UnexpectedValueException - */ - public function testWeValidateFacilities() - { - $handler = new SyslogUdpHandler("ip", null, "invalidFacility"); - } - - public function testWeSplitIntoLines() - { - $time = '2014-01-07T12:34'; - $pid = getmypid(); - $host = gethostname(); - - $handler = $this->getMockBuilder('\Monolog\Handler\SyslogUdpHandler') - ->setConstructorArgs(array("127.0.0.1", 514, "authpriv")) - ->setMethods(array('getDateTime')) - ->getMock(); - - $handler->method('getDateTime') - ->willReturn($time); - - $handler->setFormatter(new \Monolog\Formatter\ChromePHPFormatter()); - - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol')); - $socket->expects($this->at(0)) - ->method('write') - ->with("lol", "<".(LOG_AUTHPRIV + LOG_WARNING).">1 $time $host php $pid - - "); - $socket->expects($this->at(1)) - ->method('write') - ->with("hej", "<".(LOG_AUTHPRIV + LOG_WARNING).">1 $time $host php $pid - - "); - - $handler->setSocket($socket); - - $handler->handle($this->getRecordWithMessage("hej\nlol")); - } - - public function testSplitWorksOnEmptyMsg() - { - $handler = new SyslogUdpHandler("127.0.0.1", 514, "authpriv"); - $handler->setFormatter($this->getIdentityFormatter()); - - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('write'), array('lol', 'lol')); - $socket->expects($this->never()) - ->method('write'); - - $handler->setSocket($socket); - - $handler->handle($this->getRecordWithMessage(null)); - } - - protected function getRecordWithMessage($msg) - { - return array('message' => $msg, 'level' => \Monolog\Logger::WARNING, 'context' => null, 'extra' => array(), 'channel' => 'lol'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php deleted file mode 100644 index bfb8d3df..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -/** - * @covers Monolog\Handler\TestHandler - */ -class TestHandlerTest extends TestCase -{ - /** - * @dataProvider methodProvider - */ - public function testHandler($method, $level) - { - $handler = new TestHandler; - $record = $this->getRecord($level, 'test'.$method); - $this->assertFalse($handler->hasRecords($level)); - $this->assertFalse($handler->hasRecord($record, $level)); - $this->assertFalse($handler->{'has'.$method}($record), 'has'.$method); - $this->assertFalse($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains'); - $this->assertFalse($handler->{'has'.$method.'ThatPasses'}(function ($rec) { - return true; - }), 'has'.$method.'ThatPasses'); - $this->assertFalse($handler->{'has'.$method.'ThatMatches'}('/test\w+/')); - $this->assertFalse($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records'); - $handler->handle($record); - - $this->assertFalse($handler->{'has'.$method}('bar'), 'has'.$method); - $this->assertTrue($handler->hasRecords($level)); - $this->assertTrue($handler->hasRecord($record, $level)); - $this->assertTrue($handler->{'has'.$method}($record), 'has'.$method); - $this->assertTrue($handler->{'has'.$method}('test'.$method), 'has'.$method); - $this->assertTrue($handler->{'has'.$method.'ThatContains'}('test'), 'has'.$method.'ThatContains'); - $this->assertTrue($handler->{'has'.$method.'ThatPasses'}(function ($rec) { - return true; - }), 'has'.$method.'ThatPasses'); - $this->assertTrue($handler->{'has'.$method.'ThatMatches'}('/test\w+/')); - $this->assertTrue($handler->{'has'.$method.'Records'}(), 'has'.$method.'Records'); - - $records = $handler->getRecords(); - unset($records[0]['formatted']); - $this->assertEquals(array($record), $records); - } - - public function methodProvider() - { - return array( - array('Emergency', Logger::EMERGENCY), - array('Alert' , Logger::ALERT), - array('Critical' , Logger::CRITICAL), - array('Error' , Logger::ERROR), - array('Warning' , Logger::WARNING), - array('Info' , Logger::INFO), - array('Notice' , Logger::NOTICE), - array('Debug' , Logger::DEBUG), - ); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php deleted file mode 100644 index fa524d00..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/UdpSocketTest.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Handler\SyslogUdp\UdpSocket; - -/** - * @requires extension sockets - */ -class UdpSocketTest extends TestCase -{ - public function testWeDoNotTruncateShortMessages() - { - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - - $socket->expects($this->at(0)) - ->method('send') - ->with("HEADER: The quick brown fox jumps over the lazy dog"); - - $socket->write("The quick brown fox jumps over the lazy dog", "HEADER: "); - } - - public function testLongMessagesAreTruncated() - { - $socket = $this->getMock('\Monolog\Handler\SyslogUdp\UdpSocket', array('send'), array('lol', 'lol')); - - $truncatedString = str_repeat("derp", 16254).'d'; - - $socket->expects($this->exactly(1)) - ->method('send') - ->with("HEADER" . $truncatedString); - - $longString = str_repeat("derp", 20000); - - $socket->write($longString, "HEADER"); - } - - public function testDoubleCloseDoesNotError() - { - $socket = new UdpSocket('127.0.0.1', 514); - $socket->close(); - $socket->close(); - } - - /** - * @expectedException LogicException - */ - public function testWriteAfterCloseErrors() - { - $socket = new UdpSocket('127.0.0.1', 514); - $socket->close(); - $socket->write('foo', "HEADER"); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php deleted file mode 100644 index 8d37a1fc..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; -use Monolog\Logger; - -class WhatFailureGroupHandlerTest extends TestCase -{ - /** - * @covers Monolog\Handler\WhatFailureGroupHandler::__construct - * @expectedException InvalidArgumentException - */ - public function testConstructorOnlyTakesHandler() - { - new WhatFailureGroupHandler(array(new TestHandler(), "foo")); - } - - /** - * @covers Monolog\Handler\WhatFailureGroupHandler::__construct - * @covers Monolog\Handler\WhatFailureGroupHandler::handle - */ - public function testHandle() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new WhatFailureGroupHandler($testHandlers); - $handler->handle($this->getRecord(Logger::DEBUG)); - $handler->handle($this->getRecord(Logger::INFO)); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - } - - /** - * @covers Monolog\Handler\WhatFailureGroupHandler::handleBatch - */ - public function testHandleBatch() - { - $testHandlers = array(new TestHandler(), new TestHandler()); - $handler = new WhatFailureGroupHandler($testHandlers); - $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO))); - foreach ($testHandlers as $test) { - $this->assertTrue($test->hasDebugRecords()); - $this->assertTrue($test->hasInfoRecords()); - $this->assertTrue(count($test->getRecords()) === 2); - } - } - - /** - * @covers Monolog\Handler\WhatFailureGroupHandler::isHandling - */ - public function testIsHandling() - { - $testHandlers = array(new TestHandler(Logger::ERROR), new TestHandler(Logger::WARNING)); - $handler = new WhatFailureGroupHandler($testHandlers); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::ERROR))); - $this->assertTrue($handler->isHandling($this->getRecord(Logger::WARNING))); - $this->assertFalse($handler->isHandling($this->getRecord(Logger::DEBUG))); - } - - /** - * @covers Monolog\Handler\WhatFailureGroupHandler::handle - */ - public function testHandleUsesProcessors() - { - $test = new TestHandler(); - $handler = new WhatFailureGroupHandler(array($test)); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } - - /** - * @covers Monolog\Handler\WhatFailureGroupHandler::handle - */ - public function testHandleException() - { - $test = new TestHandler(); - $exception = new ExceptionTestHandler(); - $handler = new WhatFailureGroupHandler(array($exception, $test, $exception)); - $handler->pushProcessor(function ($record) { - $record['extra']['foo'] = true; - - return $record; - }); - $handler->handle($this->getRecord(Logger::WARNING)); - $this->assertTrue($test->hasWarningRecords()); - $records = $test->getRecords(); - $this->assertTrue($records[0]['extra']['foo']); - } -} - -class ExceptionTestHandler extends TestHandler -{ - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - parent::handle($record); - - throw new \Exception("ExceptionTestHandler::handle"); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php deleted file mode 100644 index 69b001ea..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Handler/ZendMonitorHandlerTest.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Handler; - -use Monolog\TestCase; - -class ZendMonitorHandlerTest extends TestCase -{ - protected $zendMonitorHandler; - - public function setUp() - { - if (!function_exists('zend_monitor_custom_event')) { - $this->markTestSkipped('ZendServer is not installed'); - } - } - - /** - * @covers Monolog\Handler\ZendMonitorHandler::write - */ - public function testWrite() - { - $record = $this->getRecord(); - $formatterResult = array( - 'message' => $record['message'], - ); - - $zendMonitor = $this->getMockBuilder('Monolog\Handler\ZendMonitorHandler') - ->setMethods(array('writeZendMonitorCustomEvent', 'getDefaultFormatter')) - ->getMock(); - - $formatterMock = $this->getMockBuilder('Monolog\Formatter\NormalizerFormatter') - ->disableOriginalConstructor() - ->getMock(); - - $formatterMock->expects($this->once()) - ->method('format') - ->will($this->returnValue($formatterResult)); - - $zendMonitor->expects($this->once()) - ->method('getDefaultFormatter') - ->will($this->returnValue($formatterMock)); - - $levelMap = $zendMonitor->getLevelMap(); - - $zendMonitor->expects($this->once()) - ->method('writeZendMonitorCustomEvent') - ->with($levelMap[$record['level']], $record['message'], $formatterResult); - - $zendMonitor->handle($record); - } - - /** - * @covers Monolog\Handler\ZendMonitorHandler::getDefaultFormatter - */ - public function testGetDefaultFormatterReturnsNormalizerFormatter() - { - $zendMonitor = new ZendMonitorHandler(); - $this->assertInstanceOf('Monolog\Formatter\NormalizerFormatter', $zendMonitor->getDefaultFormatter()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/LoggerTest.php b/vendor/monolog/monolog/tests/Monolog/LoggerTest.php deleted file mode 100644 index 1ecc34a0..00000000 --- a/vendor/monolog/monolog/tests/Monolog/LoggerTest.php +++ /dev/null @@ -1,548 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Processor\WebProcessor; -use Monolog\Handler\TestHandler; - -class LoggerTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers Monolog\Logger::getName - */ - public function testGetName() - { - $logger = new Logger('foo'); - $this->assertEquals('foo', $logger->getName()); - } - - /** - * @covers Monolog\Logger::getLevelName - */ - public function testGetLevelName() - { - $this->assertEquals('ERROR', Logger::getLevelName(Logger::ERROR)); - } - - /** - * @covers Monolog\Logger::withName - */ - public function testWithName() - { - $first = new Logger('first', array($handler = new TestHandler())); - $second = $first->withName('second'); - - $this->assertSame('first', $first->getName()); - $this->assertSame('second', $second->getName()); - $this->assertSame($handler, $second->popHandler()); - } - - /** - * @covers Monolog\Logger::toMonologLevel - */ - public function testConvertPSR3ToMonologLevel() - { - $this->assertEquals(Logger::toMonologLevel('debug'), 100); - $this->assertEquals(Logger::toMonologLevel('info'), 200); - $this->assertEquals(Logger::toMonologLevel('notice'), 250); - $this->assertEquals(Logger::toMonologLevel('warning'), 300); - $this->assertEquals(Logger::toMonologLevel('error'), 400); - $this->assertEquals(Logger::toMonologLevel('critical'), 500); - $this->assertEquals(Logger::toMonologLevel('alert'), 550); - $this->assertEquals(Logger::toMonologLevel('emergency'), 600); - } - - /** - * @covers Monolog\Logger::getLevelName - * @expectedException InvalidArgumentException - */ - public function testGetLevelNameThrows() - { - Logger::getLevelName(5); - } - - /** - * @covers Monolog\Logger::__construct - */ - public function testChannel() - { - $logger = new Logger('foo'); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->addWarning('test'); - list($record) = $handler->getRecords(); - $this->assertEquals('foo', $record['channel']); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testLog() - { - $logger = new Logger(__METHOD__); - - $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle')); - $handler->expects($this->once()) - ->method('handle'); - $logger->pushHandler($handler); - - $this->assertTrue($logger->addWarning('test')); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testLogNotHandled() - { - $logger = new Logger(__METHOD__); - - $handler = $this->getMock('Monolog\Handler\NullHandler', array('handle'), array(Logger::ERROR)); - $handler->expects($this->never()) - ->method('handle'); - $logger->pushHandler($handler); - - $this->assertFalse($logger->addWarning('test')); - } - - public function testHandlersInCtor() - { - $handler1 = new TestHandler; - $handler2 = new TestHandler; - $logger = new Logger(__METHOD__, array($handler1, $handler2)); - - $this->assertEquals($handler1, $logger->popHandler()); - $this->assertEquals($handler2, $logger->popHandler()); - } - - public function testProcessorsInCtor() - { - $processor1 = new WebProcessor; - $processor2 = new WebProcessor; - $logger = new Logger(__METHOD__, array(), array($processor1, $processor2)); - - $this->assertEquals($processor1, $logger->popProcessor()); - $this->assertEquals($processor2, $logger->popProcessor()); - } - - /** - * @covers Monolog\Logger::pushHandler - * @covers Monolog\Logger::popHandler - * @expectedException LogicException - */ - public function testPushPopHandler() - { - $logger = new Logger(__METHOD__); - $handler1 = new TestHandler; - $handler2 = new TestHandler; - - $logger->pushHandler($handler1); - $logger->pushHandler($handler2); - - $this->assertEquals($handler2, $logger->popHandler()); - $this->assertEquals($handler1, $logger->popHandler()); - $logger->popHandler(); - } - - /** - * @covers Monolog\Logger::setHandlers - */ - public function testSetHandlers() - { - $logger = new Logger(__METHOD__); - $handler1 = new TestHandler; - $handler2 = new TestHandler; - - $logger->pushHandler($handler1); - $logger->setHandlers(array($handler2)); - - // handler1 has been removed - $this->assertEquals(array($handler2), $logger->getHandlers()); - - $logger->setHandlers(array( - "AMapKey" => $handler1, - "Woop" => $handler2, - )); - - // Keys have been scrubbed - $this->assertEquals(array($handler1, $handler2), $logger->getHandlers()); - } - - /** - * @covers Monolog\Logger::pushProcessor - * @covers Monolog\Logger::popProcessor - * @expectedException LogicException - */ - public function testPushPopProcessor() - { - $logger = new Logger(__METHOD__); - $processor1 = new WebProcessor; - $processor2 = new WebProcessor; - - $logger->pushProcessor($processor1); - $logger->pushProcessor($processor2); - - $this->assertEquals($processor2, $logger->popProcessor()); - $this->assertEquals($processor1, $logger->popProcessor()); - $logger->popProcessor(); - } - - /** - * @covers Monolog\Logger::pushProcessor - * @expectedException InvalidArgumentException - */ - public function testPushProcessorWithNonCallable() - { - $logger = new Logger(__METHOD__); - - $logger->pushProcessor(new \stdClass()); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testProcessorsAreExecuted() - { - $logger = new Logger(__METHOD__); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->pushProcessor(function ($record) { - $record['extra']['win'] = true; - - return $record; - }); - $logger->addError('test'); - list($record) = $handler->getRecords(); - $this->assertTrue($record['extra']['win']); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testProcessorsAreCalledOnlyOnce() - { - $logger = new Logger(__METHOD__); - $handler = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler->expects($this->any()) - ->method('handle') - ->will($this->returnValue(true)) - ; - $logger->pushHandler($handler); - - $processor = $this->getMockBuilder('Monolog\Processor\WebProcessor') - ->disableOriginalConstructor() - ->setMethods(array('__invoke')) - ->getMock() - ; - $processor->expects($this->once()) - ->method('__invoke') - ->will($this->returnArgument(0)) - ; - $logger->pushProcessor($processor); - - $logger->addError('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testProcessorsNotCalledWhenNotHandled() - { - $logger = new Logger(__METHOD__); - $handler = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler); - $that = $this; - $logger->pushProcessor(function ($record) use ($that) { - $that->fail('The processor should not be called'); - }); - $logger->addAlert('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testHandlersNotCalledBeforeFirstHandling() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->never()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $handler1->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler1); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler2); - - $handler3 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler3->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $handler3->expects($this->never()) - ->method('handle') - ; - $logger->pushHandler($handler3); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testHandlersNotCalledBeforeFirstHandlingWithAssocArray() - { - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->never()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $handler1->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - - $handler3 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler3->expects($this->once()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - $handler3->expects($this->never()) - ->method('handle') - ; - - $logger = new Logger(__METHOD__, array('last' => $handler3, 'second' => $handler2, 'first' => $handler1)); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testBubblingWhenTheHandlerReturnsFalse() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler1->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler1); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(false)) - ; - $logger->pushHandler($handler2); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::addRecord - */ - public function testNotBubblingWhenTheHandlerReturnsTrue() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler1->expects($this->never()) - ->method('handle') - ; - $logger->pushHandler($handler1); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - $handler2->expects($this->once()) - ->method('handle') - ->will($this->returnValue(true)) - ; - $logger->pushHandler($handler2); - - $logger->debug('test'); - } - - /** - * @covers Monolog\Logger::isHandling - */ - public function testIsHandling() - { - $logger = new Logger(__METHOD__); - - $handler1 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler1->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(false)) - ; - - $logger->pushHandler($handler1); - $this->assertFalse($logger->isHandling(Logger::DEBUG)); - - $handler2 = $this->getMock('Monolog\Handler\HandlerInterface'); - $handler2->expects($this->any()) - ->method('isHandling') - ->will($this->returnValue(true)) - ; - - $logger->pushHandler($handler2); - $this->assertTrue($logger->isHandling(Logger::DEBUG)); - } - - /** - * @dataProvider logMethodProvider - * @covers Monolog\Logger::addDebug - * @covers Monolog\Logger::addInfo - * @covers Monolog\Logger::addNotice - * @covers Monolog\Logger::addWarning - * @covers Monolog\Logger::addError - * @covers Monolog\Logger::addCritical - * @covers Monolog\Logger::addAlert - * @covers Monolog\Logger::addEmergency - * @covers Monolog\Logger::debug - * @covers Monolog\Logger::info - * @covers Monolog\Logger::notice - * @covers Monolog\Logger::warn - * @covers Monolog\Logger::err - * @covers Monolog\Logger::crit - * @covers Monolog\Logger::alert - * @covers Monolog\Logger::emerg - */ - public function testLogMethods($method, $expectedLevel) - { - $logger = new Logger('foo'); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->{$method}('test'); - list($record) = $handler->getRecords(); - $this->assertEquals($expectedLevel, $record['level']); - } - - public function logMethodProvider() - { - return array( - // monolog methods - array('addDebug', Logger::DEBUG), - array('addInfo', Logger::INFO), - array('addNotice', Logger::NOTICE), - array('addWarning', Logger::WARNING), - array('addError', Logger::ERROR), - array('addCritical', Logger::CRITICAL), - array('addAlert', Logger::ALERT), - array('addEmergency', Logger::EMERGENCY), - - // ZF/Sf2 compat methods - array('debug', Logger::DEBUG), - array('info', Logger::INFO), - array('notice', Logger::NOTICE), - array('warn', Logger::WARNING), - array('err', Logger::ERROR), - array('crit', Logger::CRITICAL), - array('alert', Logger::ALERT), - array('emerg', Logger::EMERGENCY), - ); - } - - /** - * @dataProvider setTimezoneProvider - * @covers Monolog\Logger::setTimezone - */ - public function testSetTimezone($tz) - { - Logger::setTimezone($tz); - $logger = new Logger('foo'); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->info('test'); - list($record) = $handler->getRecords(); - $this->assertEquals($tz, $record['datetime']->getTimezone()); - } - - public function setTimezoneProvider() - { - return array_map( - function ($tz) { return array(new \DateTimeZone($tz)); }, - \DateTimeZone::listIdentifiers() - ); - } - - /** - * @dataProvider useMicrosecondTimestampsProvider - * @covers Monolog\Logger::useMicrosecondTimestamps - * @covers Monolog\Logger::addRecord - */ - public function testUseMicrosecondTimestamps($micro, $assert) - { - $logger = new Logger('foo'); - $logger->useMicrosecondTimestamps($micro); - $handler = new TestHandler; - $logger->pushHandler($handler); - $logger->info('test'); - list($record) = $handler->getRecords(); - $this->{$assert}('000000', $record['datetime']->format('u')); - } - - public function useMicrosecondTimestampsProvider() - { - return array( - // this has a very small chance of a false negative (1/10^6) - 'with microseconds' => array(true, 'assertNotSame'), - 'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'), - ); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php deleted file mode 100644 index 5adb505d..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/GitProcessorTest.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class GitProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\GitProcessor::__invoke - */ - public function testProcessor() - { - $processor = new GitProcessor(); - $record = $processor($this->getRecord()); - - $this->assertArrayHasKey('git', $record['extra']); - $this->assertTrue(!is_array($record['extra']['git']['branch'])); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php deleted file mode 100644 index 0dd411d7..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/IntrospectionProcessorTest.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Acme; - -class Tester -{ - public function test($handler, $record) - { - $handler->handle($record); - } -} - -function tester($handler, $record) -{ - $handler->handle($record); -} - -namespace Monolog\Processor; - -use Monolog\Logger; -use Monolog\TestCase; -use Monolog\Handler\TestHandler; - -class IntrospectionProcessorTest extends TestCase -{ - public function getHandler() - { - $processor = new IntrospectionProcessor(); - $handler = new TestHandler(); - $handler->pushProcessor($processor); - - return $handler; - } - - public function testProcessorFromClass() - { - $handler = $this->getHandler(); - $tester = new \Acme\Tester; - $tester->test($handler, $this->getRecord()); - list($record) = $handler->getRecords(); - $this->assertEquals(__FILE__, $record['extra']['file']); - $this->assertEquals(18, $record['extra']['line']); - $this->assertEquals('Acme\Tester', $record['extra']['class']); - $this->assertEquals('test', $record['extra']['function']); - } - - public function testProcessorFromFunc() - { - $handler = $this->getHandler(); - \Acme\tester($handler, $this->getRecord()); - list($record) = $handler->getRecords(); - $this->assertEquals(__FILE__, $record['extra']['file']); - $this->assertEquals(24, $record['extra']['line']); - $this->assertEquals(null, $record['extra']['class']); - $this->assertEquals('Acme\tester', $record['extra']['function']); - } - - public function testLevelTooLow() - { - $input = array( - 'level' => Logger::DEBUG, - 'extra' => array(), - ); - - $expected = $input; - - $processor = new IntrospectionProcessor(Logger::CRITICAL); - $actual = $processor($input); - - $this->assertEquals($expected, $actual); - } - - public function testLevelEqual() - { - $input = array( - 'level' => Logger::CRITICAL, - 'extra' => array(), - ); - - $expected = $input; - $expected['extra'] = array( - 'file' => null, - 'line' => null, - 'class' => 'ReflectionMethod', - 'function' => 'invokeArgs', - ); - - $processor = new IntrospectionProcessor(Logger::CRITICAL); - $actual = $processor($input); - - $this->assertEquals($expected, $actual); - } - - public function testLevelHigher() - { - $input = array( - 'level' => Logger::EMERGENCY, - 'extra' => array(), - ); - - $expected = $input; - $expected['extra'] = array( - 'file' => null, - 'line' => null, - 'class' => 'ReflectionMethod', - 'function' => 'invokeArgs', - ); - - $processor = new IntrospectionProcessor(Logger::CRITICAL); - $actual = $processor($input); - - $this->assertEquals($expected, $actual); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php deleted file mode 100644 index eb666144..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryPeakUsageProcessorTest.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class MemoryPeakUsageProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke - * @covers Monolog\Processor\MemoryProcessor::formatBytes - */ - public function testProcessor() - { - $processor = new MemoryPeakUsageProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('memory_peak_usage', $record['extra']); - $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_peak_usage']); - } - - /** - * @covers Monolog\Processor\MemoryPeakUsageProcessor::__invoke - * @covers Monolog\Processor\MemoryProcessor::formatBytes - */ - public function testProcessorWithoutFormatting() - { - $processor = new MemoryPeakUsageProcessor(true, false); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('memory_peak_usage', $record['extra']); - $this->assertInternalType('int', $record['extra']['memory_peak_usage']); - $this->assertGreaterThan(0, $record['extra']['memory_peak_usage']); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php deleted file mode 100644 index 4692dbfc..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/MemoryUsageProcessorTest.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class MemoryUsageProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\MemoryUsageProcessor::__invoke - * @covers Monolog\Processor\MemoryProcessor::formatBytes - */ - public function testProcessor() - { - $processor = new MemoryUsageProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('memory_usage', $record['extra']); - $this->assertRegExp('#[0-9.]+ (M|K)?B$#', $record['extra']['memory_usage']); - } - - /** - * @covers Monolog\Processor\MemoryUsageProcessor::__invoke - * @covers Monolog\Processor\MemoryProcessor::formatBytes - */ - public function testProcessorWithoutFormatting() - { - $processor = new MemoryUsageProcessor(true, false); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('memory_usage', $record['extra']); - $this->assertInternalType('int', $record['extra']['memory_usage']); - $this->assertGreaterThan(0, $record['extra']['memory_usage']); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php deleted file mode 100644 index 11f2b35a..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/MercurialProcessorTest.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class MercurialProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\MercurialProcessor::__invoke - */ - public function testProcessor() - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - exec("where hg 2>NUL", $output, $result); - } else { - exec("which hg 2>/dev/null >/dev/null", $output, $result); - } - if ($result != 0) { - $this->markTestSkipped('hg is missing'); - return; - } - - `hg init`; - $processor = new MercurialProcessor(); - $record = $processor($this->getRecord()); - - $this->assertArrayHasKey('hg', $record['extra']); - $this->assertTrue(!is_array($record['extra']['hg']['branch'])); - $this->assertTrue(!is_array($record['extra']['hg']['revision'])); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php deleted file mode 100644 index 458d2a33..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/ProcessIdProcessorTest.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class ProcessIdProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\ProcessIdProcessor::__invoke - */ - public function testProcessor() - { - $processor = new ProcessIdProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('process_id', $record['extra']); - $this->assertInternalType('int', $record['extra']['process_id']); - $this->assertGreaterThan(0, $record['extra']['process_id']); - $this->assertEquals(getmypid(), $record['extra']['process_id']); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php deleted file mode 100644 index 029a0c02..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/PsrLogMessageProcessorTest.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -class PsrLogMessageProcessorTest extends \PHPUnit_Framework_TestCase -{ - /** - * @dataProvider getPairs - */ - public function testReplacement($val, $expected) - { - $proc = new PsrLogMessageProcessor; - - $message = $proc(array( - 'message' => '{foo}', - 'context' => array('foo' => $val), - )); - $this->assertEquals($expected, $message['message']); - } - - public function getPairs() - { - return array( - array('foo', 'foo'), - array('3', '3'), - array(3, '3'), - array(null, ''), - array(true, '1'), - array(false, ''), - array(new \stdClass, '[object stdClass]'), - array(array(), '[array]'), - ); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php deleted file mode 100644 index 0d860c61..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/TagProcessorTest.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class TagProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\TagProcessor::__invoke - */ - public function testProcessor() - { - $tags = array(1, 2, 3); - $processor = new TagProcessor($tags); - $record = $processor($this->getRecord()); - - $this->assertEquals($tags, $record['extra']['tags']); - } - - /** - * @covers Monolog\Processor\TagProcessor::__invoke - */ - public function testProcessorTagModification() - { - $tags = array(1, 2, 3); - $processor = new TagProcessor($tags); - - $record = $processor($this->getRecord()); - $this->assertEquals($tags, $record['extra']['tags']); - - $processor->setTags(array('a', 'b')); - $record = $processor($this->getRecord()); - $this->assertEquals(array('a', 'b'), $record['extra']['tags']); - - $processor->addTags(array('a', 'c', 'foo' => 'bar')); - $record = $processor($this->getRecord()); - $this->assertEquals(array('a', 'b', 'a', 'c', 'foo' => 'bar'), $record['extra']['tags']); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php deleted file mode 100644 index 5d13058f..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/UidProcessorTest.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class UidProcessorTest extends TestCase -{ - /** - * @covers Monolog\Processor\UidProcessor::__invoke - */ - public function testProcessor() - { - $processor = new UidProcessor(); - $record = $processor($this->getRecord()); - $this->assertArrayHasKey('uid', $record['extra']); - } - - public function testGetUid() - { - $processor = new UidProcessor(10); - $this->assertEquals(10, strlen($processor->getUid())); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php b/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php deleted file mode 100644 index 4105baf7..00000000 --- a/vendor/monolog/monolog/tests/Monolog/Processor/WebProcessorTest.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog\Processor; - -use Monolog\TestCase; - -class WebProcessorTest extends TestCase -{ - public function testProcessor() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'HTTP_REFERER' => 'D', - 'SERVER_NAME' => 'F', - 'UNIQUE_ID' => 'G', - ); - - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertEquals($server['REQUEST_URI'], $record['extra']['url']); - $this->assertEquals($server['REMOTE_ADDR'], $record['extra']['ip']); - $this->assertEquals($server['REQUEST_METHOD'], $record['extra']['http_method']); - $this->assertEquals($server['HTTP_REFERER'], $record['extra']['referrer']); - $this->assertEquals($server['SERVER_NAME'], $record['extra']['server']); - $this->assertEquals($server['UNIQUE_ID'], $record['extra']['unique_id']); - } - - public function testProcessorDoNothingIfNoRequestUri() - { - $server = array( - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - ); - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertEmpty($record['extra']); - } - - public function testProcessorReturnNullIfNoHttpReferer() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'SERVER_NAME' => 'F', - ); - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertNull($record['extra']['referrer']); - } - - public function testProcessorDoesNotAddUniqueIdIfNotPresent() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'SERVER_NAME' => 'F', - ); - $processor = new WebProcessor($server); - $record = $processor($this->getRecord()); - $this->assertFalse(isset($record['extra']['unique_id'])); - } - - public function testProcessorAddsOnlyRequestedExtraFields() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'SERVER_NAME' => 'F', - ); - - $processor = new WebProcessor($server, array('url', 'http_method')); - $record = $processor($this->getRecord()); - - $this->assertSame(array('url' => 'A', 'http_method' => 'C'), $record['extra']); - } - - public function testProcessorConfiguringOfExtraFields() - { - $server = array( - 'REQUEST_URI' => 'A', - 'REMOTE_ADDR' => 'B', - 'REQUEST_METHOD' => 'C', - 'SERVER_NAME' => 'F', - ); - - $processor = new WebProcessor($server, array('url' => 'REMOTE_ADDR')); - $record = $processor($this->getRecord()); - - $this->assertSame(array('url' => 'B'), $record['extra']); - } - - /** - * @expectedException UnexpectedValueException - */ - public function testInvalidData() - { - new WebProcessor(new \stdClass); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php b/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php deleted file mode 100644 index ab899449..00000000 --- a/vendor/monolog/monolog/tests/Monolog/PsrLogCompatTest.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -use Monolog\Handler\TestHandler; -use Monolog\Formatter\LineFormatter; -use Monolog\Processor\PsrLogMessageProcessor; -use Psr\Log\Test\LoggerInterfaceTest; - -class PsrLogCompatTest extends LoggerInterfaceTest -{ - private $handler; - - public function getLogger() - { - $logger = new Logger('foo'); - $logger->pushHandler($handler = new TestHandler); - $logger->pushProcessor(new PsrLogMessageProcessor); - $handler->setFormatter(new LineFormatter('%level_name% %message%')); - - $this->handler = $handler; - - return $logger; - } - - public function getLogs() - { - $convert = function ($record) { - $lower = function ($match) { - return strtolower($match[0]); - }; - - return preg_replace_callback('{^[A-Z]+}', $lower, $record['formatted']); - }; - - return array_map($convert, $this->handler->getRecords()); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/RegistryTest.php b/vendor/monolog/monolog/tests/Monolog/RegistryTest.php deleted file mode 100644 index 15fdfbd2..00000000 --- a/vendor/monolog/monolog/tests/Monolog/RegistryTest.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -class RegistryTest extends \PHPUnit_Framework_TestCase -{ - protected function setUp() - { - Registry::clear(); - } - - /** - * @dataProvider hasLoggerProvider - * @covers Monolog\Registry::hasLogger - */ - public function testHasLogger(array $loggersToAdd, array $loggersToCheck, array $expectedResult) - { - foreach ($loggersToAdd as $loggerToAdd) { - Registry::addLogger($loggerToAdd); - } - foreach ($loggersToCheck as $index => $loggerToCheck) { - $this->assertSame($expectedResult[$index], Registry::hasLogger($loggerToCheck)); - } - } - - public function hasLoggerProvider() - { - $logger1 = new Logger('test1'); - $logger2 = new Logger('test2'); - $logger3 = new Logger('test3'); - - return array( - // only instances - array( - array($logger1), - array($logger1, $logger2), - array(true, false), - ), - // only names - array( - array($logger1), - array('test1', 'test2'), - array(true, false), - ), - // mixed case - array( - array($logger1, $logger2), - array('test1', $logger2, 'test3', $logger3), - array(true, true, false, false), - ), - ); - } - - /** - * @covers Monolog\Registry::clear - */ - public function testClearClears() - { - Registry::addLogger(new Logger('test1'), 'log'); - Registry::clear(); - - $this->setExpectedException('\InvalidArgumentException'); - Registry::getInstance('log'); - } - - /** - * @dataProvider removedLoggerProvider - * @covers Monolog\Registry::addLogger - * @covers Monolog\Registry::removeLogger - */ - public function testRemovesLogger($loggerToAdd, $remove) - { - Registry::addLogger($loggerToAdd); - Registry::removeLogger($remove); - - $this->setExpectedException('\InvalidArgumentException'); - Registry::getInstance($loggerToAdd->getName()); - } - - public function removedLoggerProvider() - { - $logger1 = new Logger('test1'); - - return array( - array($logger1, $logger1), - array($logger1, 'test1'), - ); - } - - /** - * @covers Monolog\Registry::addLogger - * @covers Monolog\Registry::getInstance - * @covers Monolog\Registry::__callStatic - */ - public function testGetsSameLogger() - { - $logger1 = new Logger('test1'); - $logger2 = new Logger('test2'); - - Registry::addLogger($logger1, 'test1'); - Registry::addLogger($logger2); - - $this->assertSame($logger1, Registry::getInstance('test1')); - $this->assertSame($logger2, Registry::test2()); - } - - /** - * @expectedException \InvalidArgumentException - * @covers Monolog\Registry::getInstance - */ - public function testFailsOnNonExistantLogger() - { - Registry::getInstance('test1'); - } - - /** - * @covers Monolog\Registry::addLogger - */ - public function testReplacesLogger() - { - $log1 = new Logger('test1'); - $log2 = new Logger('test2'); - - Registry::addLogger($log1, 'log'); - - Registry::addLogger($log2, 'log', true); - - $this->assertSame($log2, Registry::getInstance('log')); - } - - /** - * @expectedException \InvalidArgumentException - * @covers Monolog\Registry::addLogger - */ - public function testFailsOnUnspecifiedReplacement() - { - $log1 = new Logger('test1'); - $log2 = new Logger('test2'); - - Registry::addLogger($log1, 'log'); - - Registry::addLogger($log2, 'log'); - } -} diff --git a/vendor/monolog/monolog/tests/Monolog/TestCase.php b/vendor/monolog/monolog/tests/Monolog/TestCase.php deleted file mode 100644 index 4eb7b4c9..00000000 --- a/vendor/monolog/monolog/tests/Monolog/TestCase.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Monolog; - -class TestCase extends \PHPUnit_Framework_TestCase -{ - /** - * @return array Record - */ - protected function getRecord($level = Logger::WARNING, $message = 'test', $context = array()) - { - return array( - 'message' => $message, - 'context' => $context, - 'level' => $level, - 'level_name' => Logger::getLevelName($level), - 'channel' => 'test', - 'datetime' => \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true))), - 'extra' => array(), - ); - } - - /** - * @return array - */ - protected function getMultipleRecords() - { - return array( - $this->getRecord(Logger::DEBUG, 'debug message 1'), - $this->getRecord(Logger::DEBUG, 'debug message 2'), - $this->getRecord(Logger::INFO, 'information'), - $this->getRecord(Logger::WARNING, 'warning'), - $this->getRecord(Logger::ERROR, 'error'), - ); - } - - /** - * @return Monolog\Formatter\FormatterInterface - */ - protected function getIdentityFormatter() - { - $formatter = $this->getMock('Monolog\\Formatter\\FormatterInterface'); - $formatter->expects($this->any()) - ->method('format') - ->will($this->returnCallback(function ($record) { return $record['message']; })); - - return $formatter; - } -} diff --git a/vendor/paragonie/random_compat/LICENSE b/vendor/paragonie/random_compat/LICENSE new file mode 100644 index 00000000..45c7017d --- /dev/null +++ b/vendor/paragonie/random_compat/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Paragon Initiative Enterprises + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/paragonie/random_compat/build-phar.sh b/vendor/paragonie/random_compat/build-phar.sh new file mode 100755 index 00000000..b4a5ba31 --- /dev/null +++ b/vendor/paragonie/random_compat/build-phar.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) ) + +php -dphar.readonly=0 "$basedir/other/build_phar.php" $* \ No newline at end of file diff --git a/vendor/paragonie/random_compat/composer.json b/vendor/paragonie/random_compat/composer.json new file mode 100644 index 00000000..f2b9c4e5 --- /dev/null +++ b/vendor/paragonie/random_compat/composer.json @@ -0,0 +1,34 @@ +{ + "name": "paragonie/random_compat", + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "random", + "polyfill", + "pseudorandom" + ], + "license": "MIT", + "type": "library", + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "support": { + "issues": "https://github.com/paragonie/random_compat/issues", + "email": "info@paragonie.com", + "source": "https://github.com/paragonie/random_compat" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "vimeo/psalm": "^1", + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + } +} diff --git a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey new file mode 100644 index 00000000..eb50ebfc --- /dev/null +++ b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey @@ -0,0 +1,5 @@ +-----BEGIN PUBLIC KEY----- +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm +pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p ++h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc +-----END PUBLIC KEY----- diff --git a/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc new file mode 100644 index 00000000..6a1d7f30 --- /dev/null +++ b/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc @@ -0,0 +1,11 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.22 (MingW32) + +iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip +QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg +1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW +NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA +NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV +JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74= +=B6+8 +-----END PGP SIGNATURE----- diff --git a/vendor/paragonie/random_compat/lib/random.php b/vendor/paragonie/random_compat/lib/random.php new file mode 100644 index 00000000..c7731a56 --- /dev/null +++ b/vendor/paragonie/random_compat/lib/random.php @@ -0,0 +1,32 @@ +buildFromDirectory(dirname(__DIR__).'/lib'); +rename( + dirname(__DIR__).'/lib/index.php', + dirname(__DIR__).'/lib/random.php' +); + +/** + * If we pass an (optional) path to a private key as a second argument, we will + * sign the Phar with OpenSSL. + * + * If you leave this out, it will produce an unsigned .phar! + */ +if ($argc > 1) { + if (!@is_readable($argv[1])) { + echo 'Could not read the private key file:', $argv[1], "\n"; + exit(255); + } + $pkeyFile = file_get_contents($argv[1]); + + $private = openssl_get_privatekey($pkeyFile); + if ($private !== false) { + $pkey = ''; + openssl_pkey_export($private, $pkey); + $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey); + + /** + * Save the corresponding public key to the file + */ + if (!@is_readable($dist.'/random_compat.phar.pubkey')) { + $details = openssl_pkey_get_details($private); + file_put_contents( + $dist.'/random_compat.phar.pubkey', + $details['key'] + ); + } + } else { + echo 'An error occurred reading the private key from OpenSSL.', "\n"; + exit(255); + } +} diff --git a/vendor/paragonie/random_compat/psalm-autoload.php b/vendor/paragonie/random_compat/psalm-autoload.php new file mode 100644 index 00000000..d71d1b81 --- /dev/null +++ b/vendor/paragonie/random_compat/psalm-autoload.php @@ -0,0 +1,9 @@ + + + + + + + + + + + + + + + diff --git a/vendor/phpdocumentor/reflection-common/.github/dependabot.yml b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml new file mode 100644 index 00000000..c630ffa6 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: composer + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 diff --git a/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml new file mode 100644 index 00000000..484410e9 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml @@ -0,0 +1,223 @@ +on: + push: + branches: + - 2.x + pull_request: +name: Qa workflow +jobs: + setup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + + - name: Restore/cache tools folder + uses: actions/cache@v1 + with: + path: tools + key: all-tools-${{ github.sha }} + restore-keys: | + all-tools-${{ github.sha }}- + all-tools- + + - name: composer + uses: docker://composer + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: install --no-interaction --prefer-dist --optimize-autoloader + + - name: Install phive + run: make install-phive + + - name: Install PHAR dependencies + run: tools/phive.phar --no-progress install --copy --trust-gpg-keys 4AA394086372C20A,8A03EA3B385DBAA1 --force-accept-unsigned + + phpunit-with-coverage: + runs-on: ubuntu-latest + name: Unit tests + needs: setup + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 7.2 + ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 + coverage: pcov + + - name: Restore/cache tools folder + uses: actions/cache@v1 + with: + path: tools + key: all-tools-${{ github.sha }} + restore-keys: | + all-tools-${{ github.sha }}- + all-tools- + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ubuntu-latest-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ubuntu-latest-composer- + + - name: Install Composer dependencies + run: | + composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader + + - name: Run PHPUnit + run: php tools/phpunit + + phpunit: + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: + - ubuntu-latest + - windows-latest + - macOS-latest + php-versions: ['7.2', '7.3', '7.4', '8.0'] + name: Unit tests for PHP version ${{ matrix.php-versions }} on ${{ matrix.operating-system }} + needs: + - setup + - phpunit-with-coverage + steps: + - uses: actions/checkout@v2 + + - name: Restore/cache tools folder + uses: actions/cache@v1 + with: + path: tools + key: all-tools-${{ github.sha }} + restore-keys: | + all-tools-${{ github.sha }}- + all-tools- + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 + coverage: none + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: | + composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader + + - name: Run PHPUnit + continue-on-error: true + run: php tools/phpunit + + codestyle: + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + - name: Code style check + uses: phpDocumentor/coding-standard@latest + with: + args: -s + + phpstan: + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + - name: PHPStan + uses: phpDocumentor/phpstan-ga@latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: analyse src --configuration phpstan.neon + + psalm: + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 7.2 + ini-values: memory_limit=2G, display_errors=On, error_reporting=-1 + tools: psalm + coverage: none + + - name: Get composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache composer dependencies + uses: actions/cache@v1 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install Composer dependencies + run: | + composer install --no-progress --no-suggest --prefer-dist --optimize-autoloader + + - name: Psalm + run: psalm --output-format=github + + bc_check: + name: BC Check + runs-on: ubuntu-latest + needs: [setup, phpunit] + steps: + - uses: actions/checkout@v2 + - name: fetch tags + run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* + - name: Restore/cache vendor folder + uses: actions/cache@v1 + with: + path: vendor + key: all-build-${{ hashFiles('**/composer.lock') }} + restore-keys: | + all-build-${{ hashFiles('**/composer.lock') }} + all-build- + - name: Roave BC Check + uses: docker://nyholm/roave-bc-check-ga diff --git a/vendor/phpdocumentor/reflection-common/.travis.yml b/vendor/phpdocumentor/reflection-common/.travis.yml deleted file mode 100644 index 958ecf86..00000000 --- a/vendor/phpdocumentor/reflection-common/.travis.yml +++ /dev/null @@ -1,35 +0,0 @@ -language: php -php: - - 5.5 - - 5.6 - - 7.0 - - 7.1 - - hhvm - - nightly - -matrix: - allow_failures: - - php: - - hhvm - - nightly - -cache: - directories: - - $HOME/.composer/cache - -script: - - vendor/bin/phpunit --coverage-clover=coverage.clover -v - - composer update --no-interaction --prefer-source - - vendor/bin/phpunit -v - -before_script: - - composer install --no-interaction - -after_script: - - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi - -notifications: - irc: "irc.freenode.org#phpdocumentor" - email: - - me@mikevanriel.com - - ashnazg@php.net diff --git a/vendor/phpdocumentor/reflection-common/README.md b/vendor/phpdocumentor/reflection-common/README.md index 68a80c82..70f830dc 100644 --- a/vendor/phpdocumentor/reflection-common/README.md +++ b/vendor/phpdocumentor/reflection-common/README.md @@ -1,2 +1,11 @@ -# ReflectionCommon -[![Build Status](https://travis-ci.org/phpDocumentor/ReflectionCommon.svg?branch=master)](https://travis-ci.org/phpDocumentor/ReflectionCommon) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +![Qa workflow](https://github.com/phpDocumentor/ReflectionCommon/workflows/Qa%20workflow/badge.svg) +[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/ReflectionCommon.svg)](https://coveralls.io/github/phpDocumentor/ReflectionCommon?branch=master) +[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) +[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/ReflectionCommon.svg)](https://scrutinizer-ci.com/g/phpDocumentor/ReflectionCommon/?branch=master) +[![Stable Version](https://img.shields.io/packagist/v/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) +[![Unstable Version](https://img.shields.io/packagist/vpre/phpDocumentor/Reflection-Common.svg)](https://packagist.org/packages/phpDocumentor/Reflection-Common) + + +ReflectionCommon +================ diff --git a/vendor/phpdocumentor/reflection-common/composer.json b/vendor/phpdocumentor/reflection-common/composer.json index 90eee0f0..4d128b49 100644 --- a/vendor/phpdocumentor/reflection-common/composer.json +++ b/vendor/phpdocumentor/reflection-common/composer.json @@ -11,19 +11,18 @@ } ], "require": { - "php": ">=5.5" + "php": "^7.2 || ^8.0" }, "autoload" : { "psr-4" : { - "phpDocumentor\\Reflection\\": ["src"] + "phpDocumentor\\Reflection\\": "src/" } }, "require-dev": { - "phpunit/phpunit": "^4.6" }, "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-2.x": "2.x-dev" } } } diff --git a/vendor/phpdocumentor/reflection-common/src/Element.php b/vendor/phpdocumentor/reflection-common/src/Element.php index 712e30e8..8923e4fb 100644 --- a/vendor/phpdocumentor/reflection-common/src/Element.php +++ b/vendor/phpdocumentor/reflection-common/src/Element.php @@ -1,11 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -19,22 +20,16 @@ interface File { /** * Returns the content of the file as a string. - * - * @return string */ - public function getContents(); + public function getContents() : string; /** * Returns md5 hash of the file. - * - * @return string */ - public function md5(); + public function md5() : string; /** * Returns an relative path to the file. - * - * @return string */ - public function path(); + public function path() : string; } diff --git a/vendor/phpdocumentor/reflection-common/src/Fqsen.php b/vendor/phpdocumentor/reflection-common/src/Fqsen.php index ce88d03f..8fc5d344 100644 --- a/vendor/phpdocumentor/reflection-common/src/Fqsen.php +++ b/vendor/phpdocumentor/reflection-common/src/Fqsen.php @@ -1,51 +1,60 @@ name = $matches[2]; } else { $matches = explode('\\', $fqsen); - $this->name = trim(end($matches), '()'); + $name = end($matches); + assert(is_string($name)); + $this->name = trim($name, '()'); } } /** * converts this class to string. - * - * @return string */ - public function __toString() + public function __toString() : string { return $this->fqsen; } /** * Returns the name of the element without path. - * - * @return string */ - public function getName() + public function getName() : string { return $this->name; } diff --git a/vendor/phpdocumentor/reflection-common/src/Location.php b/vendor/phpdocumentor/reflection-common/src/Location.php index 57603219..177deede 100644 --- a/vendor/phpdocumentor/reflection-common/src/Location.php +++ b/vendor/phpdocumentor/reflection-common/src/Location.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -14,10 +15,12 @@ /** * The location where an element occurs within a file. + * + * @psalm-immutable */ final class Location { - /** @var int */ + /** @var int */ private $lineNumber = 0; /** @var int */ @@ -25,32 +28,25 @@ final class Location /** * Initializes the location for an element using its line number in the file and optionally the column number. - * - * @param int $lineNumber - * @param int $columnNumber */ - public function __construct($lineNumber, $columnNumber = 0) + public function __construct(int $lineNumber, int $columnNumber = 0) { - $this->lineNumber = $lineNumber; + $this->lineNumber = $lineNumber; $this->columnNumber = $columnNumber; } /** * Returns the line number that is covered by this location. - * - * @return integer */ - public function getLineNumber() + public function getLineNumber() : int { return $this->lineNumber; } /** * Returns the column number (character position on a line) for this location object. - * - * @return integer */ - public function getColumnNumber() + public function getColumnNumber() : int { return $this->columnNumber; } diff --git a/vendor/phpdocumentor/reflection-common/src/Project.php b/vendor/phpdocumentor/reflection-common/src/Project.php index 3ed1e393..57839fd1 100644 --- a/vendor/phpdocumentor/reflection-common/src/Project.php +++ b/vendor/phpdocumentor/reflection-common/src/Project.php @@ -1,11 +1,13 @@ appveyor.yml + - '%LOCALAPPDATA%\Composer\files' + +init: + - SET PATH=C:\Program Files\OpenSSL;c:\tools\php;%PATH% + - SET COMPOSER_NO_INTERACTION=1 + - SET PHP=1 + - SET ANSICON=121x90 (121x90) + + +install: + - IF EXIST c:\tools\php (SET PHP=0) + - ps: appveyor-retry cinst --params '""/InstallDir:C:\tools\php""' --ignore-checksums -y php --version ((choco search php --exact --all-versions -r | select-string -pattern $env:php_ver_target | sort { [version]($_ -split '\|' | select -last 1) } -Descending | Select-Object -first 1) -replace '[php|]','') + - cd c:\tools\php + - IF %PHP%==1 copy /Y php.ini-development php.ini + - IF %PHP%==1 echo max_execution_time=1200 >> php.ini + - IF %PHP%==1 echo date.timezone="UTC" >> php.ini + - IF %PHP%==1 echo extension_dir=ext >> php.ini + - IF %PHP%==1 echo extension=php_curl.dll >> php.ini + - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini + - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini + - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini + - IF %PHP%==1 echo zend.assertions=1 >> php.ini + - IF %PHP%==1 echo assert.exception=On >> php.ini + - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat + - appveyor-retry appveyor DownloadFile https://getcomposer.org/composer.phar + - cd c:\reflectiondocblock + - composer install --no-interaction --prefer-dist --no-progress + - composer global require phpunit/phpunit ^6 + - composer global config bin-dir --absolute + +test_script: + - cd c:\reflectiondocblock + - c:\Users\appveyor\AppData\Roaming\Composer\vendor\bin\phpunit --no-coverage diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json index e3dc38a9..9bbf8eb6 100644 --- a/vendor/phpdocumentor/reflection-docblock/composer.json +++ b/vendor/phpdocumentor/reflection-docblock/composer.json @@ -11,8 +11,8 @@ ], "require": { "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0", - "phpdocumentor/type-resolver": "^0.4.0", + "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", + "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", "webmozart/assert": "^1.0" }, "autoload": { @@ -23,8 +23,9 @@ }, "require-dev": { "mockery/mockery": "^1.0", + "phpdocumentor/type-resolver": "0.4.*", "phpunit/phpunit": "^6.4", - "doctrine/instantiator": "~1.0.5" + "doctrine/instantiator": "^1.0.5" }, "extra": { "branch-alias": { diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php index 14bb7177..b549214a 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php @@ -1,4 +1,7 @@ create($body, $context) : null; + $description = $descriptionFactory && $body !== "" ? $descriptionFactory->create($body, $context) : null; return new static($name, $description); } diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php index 75225299..78bc3e20 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php @@ -102,12 +102,8 @@ public static function create( ) \s+ )? - # Legacy method name (not captured) - (?: - [\w_]+\(\)\s+ - )? # Method name - ([\w\|_\\\\]+) + ([\w_]+) # Arguments (?: \(([^\)]*)\) diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php index 7d699d88..cfa32250 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php @@ -22,14 +22,8 @@ /** * Reflection class for the {@}param tag in a Docblock. */ -final class Param extends BaseTag implements Factory\StaticMethod +final class Param extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'param'; - - /** @var Type */ - private $type; - /** @var string */ private $variableName = ''; @@ -47,6 +41,7 @@ public function __construct($variableName, Type $type = null, $isVariadic = fals Assert::string($variableName); Assert::boolean($isVariadic); + $this->name = 'param'; $this->variableName = $variableName; $this->type = $type; $this->isVariadic = $isVariadic; @@ -65,19 +60,25 @@ public static function create( Assert::stringNotEmpty($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + list($firstPart, $body) = self::extractTypeFromBody($body); $type = null; + $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; $isVariadic = false; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && (strlen($firstPart) > 0) && ($firstPart[0] !== '$')) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] === '$' || substr($parts[0], 0, 4) === '...$')) { + if (isset($parts[0]) + && (strlen($parts[0]) > 0) + && ($parts[0][0] === '$' || substr($parts[0], 0, 4) === '...$') + ) { $variableName = array_shift($parts); array_shift($parts); @@ -106,16 +107,6 @@ public function getVariableName() return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns whether this tag is variadic. * @@ -134,8 +125,8 @@ public function isVariadic() public function __toString() { return ($this->type ? $this->type . ' ' : '') - . ($this->isVariadic() ? '...' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + . ($this->isVariadic() ? '...' : '') + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); } } diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php index f0ef7c07..96688b9d 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php @@ -22,26 +22,21 @@ /** * Reflection class for a {@}property tag in a Docblock. */ -class Property extends BaseTag implements Factory\StaticMethod +class Property extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'property'; - - /** @var Type */ - private $type; - /** @var string */ protected $variableName = ''; /** - * @param string $variableName - * @param Type $type + * @param string $variableName + * @param Type $type * @param Description $description */ public function __construct($variableName, Type $type = null, Description $description = null) { Assert::string($variableName); + $this->name = 'property'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; @@ -59,14 +54,17 @@ public static function create( Assert::stringNotEmpty($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + list($firstPart, $body) = self::extractTypeFromBody($body); $type = null; + $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && (strlen($firstPart) > 0) && ($firstPart[0] !== '$')) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ it must be the variable name @@ -94,16 +92,6 @@ public function getVariableName() return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. * @@ -112,7 +100,7 @@ public function getType() public function __toString() { return ($this->type ? $this->type . ' ' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); } } diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php index e41c0c1c..935c79d3 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php @@ -22,26 +22,21 @@ /** * Reflection class for a {@}property-read tag in a Docblock. */ -class PropertyRead extends BaseTag implements Factory\StaticMethod +class PropertyRead extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'property-read'; - - /** @var Type */ - private $type; - /** @var string */ protected $variableName = ''; /** - * @param string $variableName - * @param Type $type + * @param string $variableName + * @param Type $type * @param Description $description */ public function __construct($variableName, Type $type = null, Description $description = null) { Assert::string($variableName); + $this->name = 'property-read'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; @@ -59,14 +54,17 @@ public static function create( Assert::stringNotEmpty($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + list($firstPart, $body) = self::extractTypeFromBody($body); $type = null; + $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && (strlen($firstPart) > 0) && ($firstPart[0] !== '$')) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ it must be the variable name @@ -94,16 +92,6 @@ public function getVariableName() return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. * @@ -112,7 +100,7 @@ public function getType() public function __toString() { return ($this->type ? $this->type . ' ' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); } } diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php index cfdb0ed0..6ccb2277 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php @@ -22,26 +22,21 @@ /** * Reflection class for a {@}property-write tag in a Docblock. */ -class PropertyWrite extends BaseTag implements Factory\StaticMethod +class PropertyWrite extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'property-write'; - - /** @var Type */ - private $type; - /** @var string */ protected $variableName = ''; /** - * @param string $variableName - * @param Type $type + * @param string $variableName + * @param Type $type * @param Description $description */ public function __construct($variableName, Type $type = null, Description $description = null) { Assert::string($variableName); + $this->name = 'property-write'; $this->variableName = $variableName; $this->type = $type; $this->description = $description; @@ -59,14 +54,17 @@ public static function create( Assert::stringNotEmpty($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + list($firstPart, $body) = self::extractTypeFromBody($body); $type = null; + $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && (strlen($firstPart) > 0) && ($firstPart[0] !== '$')) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ it must be the variable name @@ -94,16 +92,6 @@ public function getVariableName() return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. * @@ -112,7 +100,7 @@ public function getType() public function __toString() { return ($this->type ? $this->type . ' ' : '') - . '$' . $this->variableName - . ($this->description ? ' ' . $this->description : ''); + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); } } diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php index ca5bda70..f3c97ce8 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php @@ -22,15 +22,11 @@ /** * Reflection class for a {@}return tag in a Docblock. */ -final class Return_ extends BaseTag implements Factory\StaticMethod +final class Return_ extends TagWithType implements Factory\StaticMethod { - protected $name = 'return'; - - /** @var Type */ - private $type; - public function __construct(Type $type, Description $description = null) { + $this->name = 'return'; $this->type = $type; $this->description = $description; } @@ -47,24 +43,14 @@ public static function create( Assert::string($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/\s+/Su', $body, 2); + list($type, $description) = self::extractTypeFromBody($body); - $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context); - $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); return new static($type, $description); } - /** - * Returns the type section of the variable. - * - * @return Type - */ - public function getType() - { - return $this->type; - } - public function __toString() { return $this->type . ' ' . $this->description; diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php new file mode 100644 index 00000000..7781caf5 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php @@ -0,0 +1,60 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\Type; + +abstract class TagWithType extends BaseTag +{ + /** @var Type */ + protected $type; + + /** + * Returns the type section of the variable. + * + * @return Type + */ + public function getType() + { + return $this->type; + } + + protected static function extractTypeFromBody(string $body) : array + { + $type = ''; + $nestingLevel = 0; + for ($i = 0; $i < strlen($body); $i++) { + $character = $body[$i]; + + if (trim($character) === '' && $nestingLevel === 0) { + break; + } + + $type .= $character; + if (in_array($character, ['<', '(', '[', '{'])) { + $nestingLevel++; + } + + if (in_array($character, ['>', ')', ']', '}'])) { + $nestingLevel--; + } + } + + $description = trim(substr($body, strlen($type))); + + return [$type, $description]; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php index 349e773b..cf93cd09 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php @@ -22,16 +22,12 @@ /** * Reflection class for a {@}throws tag in a Docblock. */ -final class Throws extends BaseTag implements Factory\StaticMethod +final class Throws extends TagWithType implements Factory\StaticMethod { - protected $name = 'throws'; - - /** @var Type */ - private $type; - public function __construct(Type $type, Description $description = null) { - $this->type = $type; + $this->name = 'throws'; + $this->type = $type; $this->description = $description; } @@ -47,24 +43,14 @@ public static function create( Assert::string($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/\s+/Su', $body, 2); + list($type, $description) = self::extractTypeFromBody($body); - $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context); - $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); + $type = $typeResolver->resolve($type, $context); + $description = $descriptionFactory->create($description, $context); return new static($type, $description); } - /** - * Returns the type section of the variable. - * - * @return Type - */ - public function getType() - { - return $this->type; - } - public function __toString() { return $this->type . ' ' . $this->description; diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php index 8907c951..a0b40460 100644 --- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php @@ -22,29 +22,24 @@ /** * Reflection class for a {@}var tag in a Docblock. */ -class Var_ extends BaseTag implements Factory\StaticMethod +class Var_ extends TagWithType implements Factory\StaticMethod { - /** @var string */ - protected $name = 'var'; - - /** @var Type */ - private $type; - /** @var string */ protected $variableName = ''; /** - * @param string $variableName - * @param Type $type + * @param string $variableName + * @param Type $type * @param Description $description */ public function __construct($variableName, Type $type = null, Description $description = null) { Assert::string($variableName); + $this->name = 'var'; $this->variableName = $variableName; - $this->type = $type; - $this->description = $description; + $this->type = $type; + $this->description = $description; } /** @@ -59,14 +54,17 @@ public static function create( Assert::stringNotEmpty($body); Assert::allNotNull([$typeResolver, $descriptionFactory]); - $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); - $type = null; + list($firstPart, $body) = self::extractTypeFromBody($body); + $parts = preg_split('/(\s+)/Su', $body, 2, PREG_SPLIT_DELIM_CAPTURE); + $type = null; $variableName = ''; // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { - $type = $typeResolver->resolve(array_shift($parts), $context); - array_shift($parts); + if ($firstPart && (strlen($firstPart) > 0) && ($firstPart[0] !== '$')) { + $type = $typeResolver->resolve($firstPart, $context); + } else { + // first part is not a type; we should prepend it to the parts array for further processing + array_unshift($parts, $firstPart); } // if the next item starts with a $ or ...$ it must be the variable name @@ -94,16 +92,6 @@ public function getVariableName() return $this->variableName; } - /** - * Returns the variable's type or null if unknown. - * - * @return Type|null - */ - public function getType() - { - return $this->type; - } - /** * Returns a string representation for this tag. * diff --git a/vendor/phpdocumentor/type-resolver/README.md b/vendor/phpdocumentor/type-resolver/README.md index fad34006..f30d3a24 100644 --- a/vendor/phpdocumentor/type-resolver/README.md +++ b/vendor/phpdocumentor/type-resolver/README.md @@ -1,3 +1,11 @@ +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +![](https://github.com/phpdocumentor/typeresolver/workflows/Qa%20workflow/badge.svg?branch=1.x) +[![Coveralls Coverage](https://img.shields.io/coveralls/github/phpDocumentor/TypeResolver.svg)](https://coveralls.io/github/phpDocumentor/TypeResolver?branch=1.x) +[![Scrutinizer Code Coverage](https://img.shields.io/scrutinizer/coverage/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) +[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/phpDocumentor/TypeResolver.svg)](https://scrutinizer-ci.com/g/phpDocumentor/TypeResolver/?branch=1.x) +![Packagist Version](https://img.shields.io/packagist/v/phpdocumentor/type-resolver?label=Packagist%20stable) +![Packagist Version](https://img.shields.io/packagist/vpre/phpdocumentor/type-resolver?label=Packagist%20unstable) + TypeResolver and FqsenResolver ============================== @@ -22,8 +30,7 @@ The easiest way to install this library is with [Composer](https://getcomposer.o ## Examples -Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and -check which type of action that your want to accomplish. +Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and check which type of action that your want to accomplish. ## On Types and Element Names @@ -39,6 +46,7 @@ The TypeResolver can resolve: - a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`). - a composite such as an array of string (`@var string[]`). - a compound such as a string or integer (`@var string|integer`). +- an array expression (`@var (string|TypeResolver)[]`) - an object or interface such as the TypeResolver class (`@var TypeResolver` or `@var \phpDocumentor\Reflection\TypeResolver`) @@ -58,8 +66,7 @@ Where the FqsenResolver can resolve: ## Resolving a type -In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` -and call its `resolve` method like this: +In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` and call its `resolve` method like this: ```php $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); @@ -70,31 +77,30 @@ In this example you will receive a Value Object of class `\phpDocumentor\Reflect elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type `\phpDocumentor\Reflection\Types\Integer`. -The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but -in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver -in which namespace the given expression occurs and which namespace aliases (or imports) apply. +The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. + +### Resolving nullable types + +Php 7.1 introduced nullable types e.g. `?string`. Type resolver will resolve the original type without the nullable notation `?` +just like it would do without the `?`. After that the type is wrapped in a `\phpDocumentor\Reflection\Types\Nullable` object. +The `Nullable` type has a method to fetch the actual type. ## Resolving an FQSEN -A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using -the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: +A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); ``` -In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class -name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. +In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. -The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural -Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will -inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. +The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. ## Resolving partial Classes and Structural Element Names -Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class -names. +Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class names. For example, you have this file: @@ -116,9 +122,8 @@ class Classy ``` Suppose that you would want to resolve (and expand) the type in the `@var` tag and the element name in the `@see` tag. -For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating -a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in -play. + +For the resolvers to know how to expand partial names you have to provide a bit of _Context_ for them by instantiating a new class named `\phpDocumentor\Reflection\Types\Context` with the name of the namespace and the aliases that are in play. ### Creating a Context @@ -131,9 +136,7 @@ $context = new \phpDocumentor\Reflection\Types\Context( ); ``` -Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector -object or by providing the namespace that you'd like to extract and the source code of the file in which the given -type expression occurs. +Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector object or by providing the namespace that you'd like to extract and the source code of the file in which the given type expression occurs. ```php $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); @@ -149,8 +152,7 @@ $context = $contextFactory->createForNamespace('\My\Example', file_get_contents( ### Using the Context -After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver -class as second argument and the Resolvers will take this into account when resolving partial names. +After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver class as second argument and the Resolvers will take this into account when resolving partial names. To obtain the resolved class name for the `@var` tag in the example above you can do: @@ -159,24 +161,17 @@ $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); $type = $typeResolver->resolve('Types\Context', $context); ``` -When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call -the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be -`phpDocumentor\Reflection\Types\Context`. +When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be `phpDocumentor\Reflection\Types\Context`. > Why is the FQSEN wrapped in another object `Object_`? > -> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common -> type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it -> is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. +> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. -Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To -resolve that you can do the following: +Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To resolve that you can do the following: ```php $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); $type = $fqsenResolver->resolve('Classy::otherFunction()', $context); ``` -Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the -`resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to -`\My\Example\Classy::otherFunction()`. +Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the `resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to `\My\Example\Classy::otherFunction()`. diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json index 82ead156..242ecbe3 100644 --- a/vendor/phpdocumentor/type-resolver/composer.json +++ b/vendor/phpdocumentor/type-resolver/composer.json @@ -1,27 +1,34 @@ { - "name": "phpdocumentor/type-resolver", - "type": "library", + "name": "phpdocumentor/type-resolver", + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "type": "library", "license": "MIT", "authors": [ - {"name": "Mike van Riel", "email": "me@mikevanriel.com"} + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } ], "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*" }, "autoload": { - "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]} + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } }, "autoload-dev": { - "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]} - }, - "require-dev": { - "phpunit/phpunit": "^5.2||^4.8.24", - "mockery/mockery": "^0.9.4" + "psr-4": { + "phpDocumentor\\Reflection\\": ["tests/unit", "tests/benchmark"] + } }, "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-1.x": "1.x-dev" } } } diff --git a/vendor/phpdocumentor/type-resolver/composer.lock b/vendor/phpdocumentor/type-resolver/composer.lock new file mode 100644 index 00000000..8fa8b874 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/composer.lock @@ -0,0 +1,71 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "ee8aea1f755e1772266bc7e041d8ee5b", + "packages": [ + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2020-06-27T09:03:43+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.2 || ^8.0" + }, + "platform-dev": { + "ext-tokenizer": "*" + } +} diff --git a/vendor/phpdocumentor/type-resolver/phpbench.json b/vendor/phpdocumentor/type-resolver/phpbench.json new file mode 100644 index 00000000..ced1ebab --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/phpbench.json @@ -0,0 +1,10 @@ +{ + "bootstrap": "vendor/autoload.php", + "path": "tests/benchmark", + "extensions": [ + "Jaapio\\Blackfire\\Extension" + ], + "blackfire" : { + "env": "c12030d0-c177-47e2-b466-4994c40dc993" + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php index 9aa6ba30..6447a015 100644 --- a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php +++ b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php @@ -1,25 +1,35 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +use InvalidArgumentException; use phpDocumentor\Reflection\Types\Context; +use function explode; +use function implode; +use function strpos; +/** + * Resolver for Fqsen using Context information + * + * @psalm-immutable + */ class FqsenResolver { /** @var string Definition of the NAMESPACE operator in PHP */ - const OPERATOR_NAMESPACE = '\\'; + private const OPERATOR_NAMESPACE = '\\'; - public function resolve($fqsen, Context $context = null) + public function resolve(string $fqsen, ?Context $context = null) : Fqsen { if ($context === null) { $context = new Context(''); @@ -34,12 +44,8 @@ public function resolve($fqsen, Context $context = null) /** * Tests whether the given type is a Fully Qualified Structural Element Name. - * - * @param string $type - * - * @return bool */ - private function isFqsen($type) + private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } @@ -48,13 +54,9 @@ private function isFqsen($type) * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. * - * @param string $type - * @param Context $context - * - * @return Fqsen - * @throws \InvalidArgumentException when type is not a valid FQSEN. + * @throws InvalidArgumentException When type is not a valid FQSEN. */ - private function resolvePartialStructuralElementName($type, Context $context) + private function resolvePartialStructuralElementName(string $type, Context $context) : Fqsen { $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); @@ -63,7 +65,7 @@ private function resolvePartialStructuralElementName($type, Context $context) // if the first segment is not an alias; prepend namespace name and return if (!isset($namespaceAliases[$typeParts[0]])) { $namespace = $context->getNamespace(); - if ('' !== $namespace) { + if ($namespace !== '') { $namespace .= self::OPERATOR_NAMESPACE; } diff --git a/vendor/phpdocumentor/type-resolver/src/PseudoType.php b/vendor/phpdocumentor/type-resolver/src/PseudoType.php new file mode 100644 index 00000000..f94cff5b --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/PseudoType.php @@ -0,0 +1,19 @@ + - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +/** + * @psalm-immutable + */ interface Type { - public function __toString(); + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string; } diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php index 08b2a5f8..07e1b833 100644 --- a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php +++ b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php @@ -1,39 +1,81 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection; +use ArrayIterator; +use InvalidArgumentException; use phpDocumentor\Reflection\Types\Array_; +use phpDocumentor\Reflection\Types\ClassString; +use phpDocumentor\Reflection\Types\Collection; use phpDocumentor\Reflection\Types\Compound; use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\Expression; +use phpDocumentor\Reflection\Types\Integer; +use phpDocumentor\Reflection\Types\Intersection; use phpDocumentor\Reflection\Types\Iterable_; use phpDocumentor\Reflection\Types\Nullable; use phpDocumentor\Reflection\Types\Object_; +use phpDocumentor\Reflection\Types\String_; +use RuntimeException; +use function array_key_exists; +use function array_pop; +use function array_values; +use function class_exists; +use function class_implements; +use function count; +use function end; +use function in_array; +use function key; +use function preg_split; +use function strpos; +use function strtolower; +use function trim; +use const PREG_SPLIT_DELIM_CAPTURE; +use const PREG_SPLIT_NO_EMPTY; final class TypeResolver { /** @var string Definition of the ARRAY operator for types */ - const OPERATOR_ARRAY = '[]'; + private const OPERATOR_ARRAY = '[]'; /** @var string Definition of the NAMESPACE operator in PHP */ - const OPERATOR_NAMESPACE = '\\'; + private const OPERATOR_NAMESPACE = '\\'; + + /** @var int the iterator parser is inside a compound context */ + private const PARSER_IN_COMPOUND = 0; + + /** @var int the iterator parser is inside a nullable expression context */ + private const PARSER_IN_NULLABLE = 1; + + /** @var int the iterator parser is inside an array expression context */ + private const PARSER_IN_ARRAY_EXPRESSION = 2; - /** @var string[] List of recognized keywords and unto which Value Object they map */ - private $keywords = array( + /** @var int the iterator parser is inside a collection expression context */ + private const PARSER_IN_COLLECTION_EXPRESSION = 3; + + /** + * @var array List of recognized keywords and unto which Value Object they map + * @psalm-var array> + */ + private $keywords = [ 'string' => Types\String_::class, + 'class-string' => Types\ClassString::class, 'int' => Types\Integer::class, 'integer' => Types\Integer::class, 'bool' => Types\Boolean::class, 'boolean' => Types\Boolean::class, + 'real' => Types\Float_::class, 'float' => Types\Float_::class, 'double' => Types\Float_::class, 'object' => Object_::class, @@ -45,24 +87,25 @@ final class TypeResolver 'scalar' => Types\Scalar::class, 'callback' => Types\Callable_::class, 'callable' => Types\Callable_::class, - 'false' => Types\Boolean::class, - 'true' => Types\Boolean::class, + 'false' => PseudoTypes\False_::class, + 'true' => PseudoTypes\True_::class, 'self' => Types\Self_::class, '$this' => Types\This::class, 'static' => Types\Static_::class, 'parent' => Types\Parent_::class, 'iterable' => Iterable_::class, - ); + ]; - /** @var FqsenResolver */ + /** + * @var FqsenResolver + * @psalm-readonly + */ private $fqsenResolver; /** * Initializes this TypeResolver with the means to create and resolve Fqsen objects. - * - * @param FqsenResolver $fqsenResolver */ - public function __construct(FqsenResolver $fqsenResolver = null) + public function __construct(?FqsenResolver $fqsenResolver = null) { $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); } @@ -77,74 +120,236 @@ public function __construct(FqsenResolver $fqsenResolver = null) * This method only works as expected if the namespace and aliases are set; * no dynamic reflection is being performed here. * - * @param string $type The relative or absolute type. - * @param Context $context - * - * @uses Context::getNamespace() to determine with what to prefix the type name. * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be - * replaced with another namespace. + * replaced with another namespace. + * @uses Context::getNamespace() to determine with what to prefix the type name. * - * @return Type|null + * @param string $type The relative or absolute type. */ - public function resolve($type, Context $context = null) + public function resolve(string $type, ?Context $context = null) : Type { - if (!is_string($type)) { - throw new \InvalidArgumentException( - 'Attempted to resolve type but it appeared not to be a string, received: ' . var_export($type, true) - ); - } - $type = trim($type); if (!$type) { - throw new \InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); + throw new InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); } if ($context === null) { $context = new Context(''); } + // split the type string into tokens `|`, `?`, `<`, `>`, `,`, `(`, `)`, `[]`, '<', '>' and type names + $tokens = preg_split( + '/(\\||\\?|<|>|&|, ?|\\(|\\)|\\[\\]+)/', + $type, + -1, + PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE + ); + + if ($tokens === false) { + throw new InvalidArgumentException('Unable to split the type string "' . $type . '" into tokens'); + } + + /** @var ArrayIterator $tokenIterator */ + $tokenIterator = new ArrayIterator($tokens); + + return $this->parseTypes($tokenIterator, $context, self::PARSER_IN_COMPOUND); + } + + /** + * Analyse each tokens and creates types + * + * @param ArrayIterator $tokens the iterator on tokens + * @param int $parserContext on of self::PARSER_* constants, indicating + * the context where we are in the parsing + */ + private function parseTypes(ArrayIterator $tokens, Context $context, int $parserContext) : Type + { + $types = []; + $token = ''; + $compoundToken = '|'; + while ($tokens->valid()) { + $token = $tokens->current(); + if ($token === null) { + throw new RuntimeException( + 'Unexpected nullable character' + ); + } + + if ($token === '|' || $token === '&') { + if (count($types) === 0) { + throw new RuntimeException( + 'A type is missing before a type separator' + ); + } + + if (!in_array($parserContext, [ + self::PARSER_IN_COMPOUND, + self::PARSER_IN_ARRAY_EXPRESSION, + self::PARSER_IN_COLLECTION_EXPRESSION, + ], true) + ) { + throw new RuntimeException( + 'Unexpected type separator' + ); + } + + $compoundToken = $token; + $tokens->next(); + } elseif ($token === '?') { + if (!in_array($parserContext, [ + self::PARSER_IN_COMPOUND, + self::PARSER_IN_ARRAY_EXPRESSION, + self::PARSER_IN_COLLECTION_EXPRESSION, + ], true) + ) { + throw new RuntimeException( + 'Unexpected nullable character' + ); + } + + $tokens->next(); + $type = $this->parseTypes($tokens, $context, self::PARSER_IN_NULLABLE); + $types[] = new Nullable($type); + } elseif ($token === '(') { + $tokens->next(); + $type = $this->parseTypes($tokens, $context, self::PARSER_IN_ARRAY_EXPRESSION); + + $token = $tokens->current(); + if ($token === null) { // Someone did not properly close their array expression .. + break; + } + + $tokens->next(); + + $resolvedType = new Expression($type); + + $types[] = $resolvedType; + } elseif ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION && $token[0] === ')') { + break; + } elseif ($token === '<') { + if (count($types) === 0) { + throw new RuntimeException( + 'Unexpected collection operator "<", class name is missing' + ); + } + + $classType = array_pop($types); + if ($classType !== null) { + if ((string) $classType === 'class-string') { + $types[] = $this->resolveClassString($tokens, $context); + } else { + $types[] = $this->resolveCollection($tokens, $classType, $context); + } + } + + $tokens->next(); + } elseif ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION + && ($token === '>' || trim($token) === ',') + ) { + break; + } elseif ($token === self::OPERATOR_ARRAY) { + end($types); + $last = key($types); + $lastItem = $types[$last]; + if ($lastItem instanceof Expression) { + $lastItem = $lastItem->getValueType(); + } + + $types[$last] = new Array_($lastItem); + + $tokens->next(); + } else { + $type = $this->resolveSingleType($token, $context); + $tokens->next(); + if ($parserContext === self::PARSER_IN_NULLABLE) { + return $type; + } + + $types[] = $type; + } + } + + if ($token === '|' || $token === '&') { + throw new RuntimeException( + 'A type is missing after a type separator' + ); + } + + if (count($types) === 0) { + if ($parserContext === self::PARSER_IN_NULLABLE) { + throw new RuntimeException( + 'A type is missing after a nullable character' + ); + } + + if ($parserContext === self::PARSER_IN_ARRAY_EXPRESSION) { + throw new RuntimeException( + 'A type is missing in an array expression' + ); + } + + if ($parserContext === self::PARSER_IN_COLLECTION_EXPRESSION) { + throw new RuntimeException( + 'A type is missing in a collection expression' + ); + } + } elseif (count($types) === 1) { + return $types[0]; + } + + if ($compoundToken === '|') { + return new Compound(array_values($types)); + } + + return new Intersection(array_values($types)); + } + + /** + * resolve the given type into a type object + * + * @param string $type the type string, representing a single type + * + * @return Type|Array_|Object_ + * + * @psalm-mutation-free + */ + private function resolveSingleType(string $type, Context $context) : object + { switch (true) { - case $this->isNullableType($type): - return $this->resolveNullableType($type, $context); case $this->isKeyword($type): return $this->resolveKeyword($type); - case ($this->isCompoundType($type)): - return $this->resolveCompoundType($type, $context); - case $this->isTypedArray($type): - return $this->resolveTypedArray($type, $context); case $this->isFqsen($type): return $this->resolveTypedObject($type); case $this->isPartialStructuralElementName($type): return $this->resolveTypedObject($type, $context); + // @codeCoverageIgnoreStart default: // I haven't got the foggiest how the logic would come here but added this as a defense. - throw new \RuntimeException( + throw new RuntimeException( 'Unable to resolve type "' . $type . '", there is no known method to resolve it' ); } + // @codeCoverageIgnoreEnd } /** * Adds a keyword to the list of Keywords and associates it with a specific Value Object. * - * @param string $keyword - * @param string $typeClassName - * - * @return void + * @psalm-param class-string $typeClassName */ - public function addKeyword($keyword, $typeClassName) + public function addKeyword(string $keyword, string $typeClassName) : void { if (!class_exists($typeClassName)) { - throw new \InvalidArgumentException( + throw new InvalidArgumentException( 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' . ' but we could not find the class ' . $typeClassName ); } - if (!in_array(Type::class, class_implements($typeClassName))) { - throw new \InvalidArgumentException( + if (!in_array(Type::class, class_implements($typeClassName), true)) { + throw new InvalidArgumentException( 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' ); } @@ -152,28 +357,16 @@ public function addKeyword($keyword, $typeClassName) $this->keywords[$keyword] = $typeClassName; } - /** - * Detects whether the given type represents an array. - * - * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. - * - * @return bool - */ - private function isTypedArray($type) - { - return substr($type, -2) === self::OPERATOR_ARRAY; - } - /** * Detects whether the given type represents a PHPDoc keyword. * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * - * @return bool + * @psalm-mutation-free */ - private function isKeyword($type) + private function isKeyword(string $type) : bool { - return in_array(strtolower($type), array_keys($this->keywords), true); + return array_key_exists(strtolower($type), $this->keywords); } /** @@ -181,9 +374,9 @@ private function isKeyword($type) * * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. * - * @return bool + * @psalm-mutation-free */ - private function isPartialStructuralElementName($type) + private function isPartialStructuralElementName(string $type) : bool { return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); } @@ -191,108 +384,160 @@ private function isPartialStructuralElementName($type) /** * Tests whether the given type is a Fully Qualified Structural Element Name. * - * @param string $type - * - * @return bool + * @psalm-mutation-free */ - private function isFqsen($type) + private function isFqsen(string $type) : bool { return strpos($type, self::OPERATOR_NAMESPACE) === 0; } /** - * Tests whether the given type is a compound type (i.e. `string|int`). - * - * @param string $type + * Resolves the given keyword (such as `string`) into a Type object representing that keyword. * - * @return bool + * @psalm-mutation-free */ - private function isCompoundType($type) + private function resolveKeyword(string $type) : Type { - return strpos($type, '|') !== false; - } + $className = $this->keywords[strtolower($type)]; - /** - * Test whether the given type is a nullable type (i.e. `?string`) - * - * @param string $type - * - * @return bool - */ - private function isNullableType($type) - { - return $type[0] === '?'; + return new $className(); } /** - * Resolves the given typed array string (i.e. `string[]`) into an Array object with the right types set. - * - * @param string $type - * @param Context $context + * Resolves the given FQSEN string into an FQSEN object. * - * @return Array_ + * @psalm-mutation-free */ - private function resolveTypedArray($type, Context $context) + private function resolveTypedObject(string $type, ?Context $context = null) : Object_ { - return new Array_($this->resolve(substr($type, 0, -2), $context)); + return new Object_($this->fqsenResolver->resolve($type, $context)); } /** - * Resolves the given keyword (such as `string`) into a Type object representing that keyword. + * Resolves class string * - * @param string $type - * - * @return Type + * @param ArrayIterator $tokens */ - private function resolveKeyword($type) + private function resolveClassString(ArrayIterator $tokens, Context $context) : Type { - $className = $this->keywords[strtolower($type)]; + $tokens->next(); - return new $className(); - } + $classType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); - /** - * Resolves the given FQSEN string into an FQSEN object. - * - * @param string $type - * @param Context|null $context - * - * @return Object_ - */ - private function resolveTypedObject($type, Context $context = null) - { - return new Object_($this->fqsenResolver->resolve($type, $context)); + if (!$classType instanceof Object_ || $classType->getFqsen() === null) { + throw new RuntimeException( + $classType . ' is not a class string' + ); + } + + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException( + 'class-string: ">" is missing' + ); + } + + throw new RuntimeException( + 'Unexpected character "' . $token . '", ">" is missing' + ); + } + + return new ClassString($classType->getFqsen()); } /** - * Resolves a compound type (i.e. `string|int`) into the appropriate Type objects or FQSEN. + * Resolves the collection values and keys * - * @param string $type - * @param Context $context + * @param ArrayIterator $tokens * - * @return Compound + * @return Array_|Iterable_|Collection */ - private function resolveCompoundType($type, Context $context) + private function resolveCollection(ArrayIterator $tokens, Type $classType, Context $context) : Type { - $types = []; + $isArray = ((string) $classType === 'array'); + $isIterable = ((string) $classType === 'iterable'); + + // allow only "array", "iterable" or class name before "<" + if (!$isArray && !$isIterable + && (!$classType instanceof Object_ || $classType->getFqsen() === null)) { + throw new RuntimeException( + $classType . ' is not a collection' + ); + } + + $tokens->next(); - foreach (explode('|', $type) as $part) { - $types[] = $this->resolve($part, $context); + $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + $keyType = null; + + $token = $tokens->current(); + if ($token !== null && trim($token) === ',') { + // if we have a comma, then we just parsed the key type, not the value type + $keyType = $valueType; + if ($isArray) { + // check the key type for an "array" collection. We allow only + // strings or integers. + if (!$keyType instanceof String_ && + !$keyType instanceof Integer && + !$keyType instanceof Compound + ) { + throw new RuntimeException( + 'An array can have only integers or strings as keys' + ); + } + + if ($keyType instanceof Compound) { + foreach ($keyType->getIterator() as $item) { + if (!$item instanceof String_ && + !$item instanceof Integer + ) { + throw new RuntimeException( + 'An array can have only integers or strings as keys' + ); + } + } + } + } + + $tokens->next(); + // now let's parse the value type + $valueType = $this->parseTypes($tokens, $context, self::PARSER_IN_COLLECTION_EXPRESSION); + } + + $token = $tokens->current(); + if ($token !== '>') { + if (empty($token)) { + throw new RuntimeException( + 'Collection: ">" is missing' + ); + } + + throw new RuntimeException( + 'Unexpected character "' . $token . '", ">" is missing' + ); } - return new Compound($types); + if ($isArray) { + return new Array_($valueType, $keyType); + } + + if ($isIterable) { + return new Iterable_($valueType, $keyType); + } + + if ($classType instanceof Object_) { + return $this->makeCollectionFromObject($classType, $valueType, $keyType); + } + + throw new RuntimeException('Invalid $classType provided'); } /** - * Resolve nullable types (i.e. `?string`) into a Nullable type wrapper - * - * @param string $type - * @param Context $context - * - * @return Nullable + * @psalm-pure */ - private function resolveNullableType($type, Context $context) + private function makeCollectionFromObject(Object_ $object, Type $valueType, ?Type $keyType = null) : Collection { - return new Nullable($this->resolve(ltrim($type, '?'), $context)); + return new Collection($object->getFqsen(), $valueType, $keyType); } } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php new file mode 100644 index 00000000..bbea4f14 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php @@ -0,0 +1,83 @@ +valueType = $valueType; + $this->defaultKeyType = new Compound([new String_(), new Integer()]); + $this->keyType = $keyType; + } + + /** + * Returns the type for the keys of this array. + */ + public function getKeyType() : Type + { + return $this->keyType ?? $this->defaultKeyType; + } + + /** + * Returns the value for the keys of this array. + */ + public function getValueType() : Type + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + if ($this->keyType) { + return 'array<' . $this->keyType . ',' . $this->valueType . '>'; + } + + if ($this->valueType instanceof Mixed_) { + return 'array'; + } + + if ($this->valueType instanceof Compound) { + return '(' . $this->valueType . ')[]'; + } + + return $this->valueType . '[]'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php new file mode 100644 index 00000000..95222958 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php @@ -0,0 +1,124 @@ + + */ +abstract class AggregatedType implements Type, IteratorAggregate +{ + /** + * @psalm-allow-private-mutation + * @var array + */ + private $types = []; + + /** @var string */ + private $token; + + /** + * @param array $types + */ + public function __construct(array $types, string $token) + { + foreach ($types as $type) { + $this->add($type); + } + + $this->token = $token; + } + + /** + * Returns the type at the given index. + */ + public function get(int $index) : ?Type + { + if (!$this->has($index)) { + return null; + } + + return $this->types[$index]; + } + + /** + * Tests if this compound type has a type with the given index. + */ + public function has(int $index) : bool + { + return array_key_exists($index, $this->types); + } + + /** + * Tests if this compound type contains the given type. + */ + public function contains(Type $type) : bool + { + foreach ($this->types as $typePart) { + // if the type is duplicate; do not add it + if ((string) $typePart === (string) $type) { + return true; + } + } + + return false; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return implode($this->token, $this->types); + } + + /** + * @return ArrayIterator + */ + public function getIterator() : ArrayIterator + { + return new ArrayIterator($this->types); + } + + /** + * @psalm-suppress ImpureMethodCall + */ + private function add(Type $type) : void + { + if ($type instanceof self) { + foreach ($type->getIterator() as $subType) { + $this->add($subType); + } + + return; + } + + // if the type is duplicate; do not add it + if ($this->contains($type)) { + return; + } + + $this->types[] = $type; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php index 49b7c6ea..7f880e2d 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php @@ -1,19 +1,18 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; -use phpDocumentor\Reflection\Type; - /** * Represents an array type as described in the PSR-5, the PHPDoc Standard. * @@ -22,65 +21,9 @@ * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed_'. * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a * type name. + * + * @psalm-immutable */ -final class Array_ implements Type +final class Array_ extends AbstractList { - /** @var Type */ - private $valueType; - - /** @var Type */ - private $keyType; - - /** - * Initializes this representation of an array with the given Type or Fqsen. - * - * @param Type $valueType - * @param Type $keyType - */ - public function __construct(Type $valueType = null, Type $keyType = null) - { - if ($keyType === null) { - $keyType = new Compound([ new String_(), new Integer() ]); - } - if ($valueType === null) { - $valueType = new Mixed_(); - } - - $this->valueType = $valueType; - $this->keyType = $keyType; - } - - /** - * Returns the type for the keys of this array. - * - * @return Type - */ - public function getKeyType() - { - return $this->keyType; - } - - /** - * Returns the value for the keys of this array. - * - * @return Type - */ - public function getValueType() - { - return $this->valueType; - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string - */ - public function __toString() - { - if ($this->valueType instanceof Mixed_) { - return 'array'; - } - - return $this->valueType . '[]'; - } } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php b/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php index f82b19e5..9163b51b 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a Boolean type. + * + * @psalm-immutable */ -final class Boolean implements Type +class Boolean implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'bool'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php index 68ebfbd0..1522325e 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a Callable type. + * + * @psalm-immutable */ final class Callable_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'callable'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php b/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php new file mode 100644 index 00000000..f847f172 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php @@ -0,0 +1,56 @@ +fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen() : ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + if ($this->fqsen === null) { + return 'class-string'; + } + + return 'class-string<' . (string) $this->fqsen . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Collection.php b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php new file mode 100644 index 00000000..84b4463a --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Collection.php @@ -0,0 +1,68 @@ +` + * 2. `ACollectionObject` + * + * - ACollectionObject can be 'array' or an object that can act as an array + * - aValueType and aKeyType can be any type expression + * + * @psalm-immutable + */ +final class Collection extends AbstractList +{ + /** @var Fqsen|null */ + private $fqsen; + + /** + * Initializes this representation of an array with the given Type or Fqsen. + */ + public function __construct(?Fqsen $fqsen, Type $valueType, ?Type $keyType = null) + { + parent::__construct($valueType, $keyType); + + $this->fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + */ + public function getFqsen() : ?Fqsen + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + $objectType = (string) ($this->fqsen ?? 'object'); + + if ($this->keyType === null) { + return $objectType . '<' . $this->valueType . '>'; + } + + return $objectType . '<' . $this->keyType . ',' . $this->valueType . '>'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php index be986c31..ad426cc2 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php @@ -1,19 +1,18 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; -use ArrayIterator; -use IteratorAggregate; use phpDocumentor\Reflection\Type; /** @@ -22,72 +21,18 @@ * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type * may contain a value with any of the given types. + * + * @psalm-immutable */ -final class Compound implements Type, IteratorAggregate +final class Compound extends AggregatedType { - /** @var Type[] */ - private $types; - /** * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface. * - * @param Type[] $types - * @throws \InvalidArgumentException when types are not all instance of Type + * @param array $types */ public function __construct(array $types) { - foreach ($types as $type) { - if (!$type instanceof Type) { - throw new \InvalidArgumentException('A compound type can only have other types as elements'); - } - } - - $this->types = $types; - } - - /** - * Returns the type at the given index. - * - * @param integer $index - * - * @return Type|null - */ - public function get($index) - { - if (!$this->has($index)) { - return null; - } - - return $this->types[$index]; - } - - /** - * Tests if this compound type has a type with the given index. - * - * @param integer $index - * - * @return bool - */ - public function has($index) - { - return isset($this->types[$index]); - } - - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string - */ - public function __toString() - { - return implode('|', $this->types); - } - - /** - * {@inheritdoc} - */ - public function getIterator() - { - return new ArrayIterator($this->types); + parent::__construct($types, '|'); } } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/vendor/phpdocumentor/type-resolver/src/Types/Context.php index 4e9ce5a0..c134d7cf 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Context.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Context.php @@ -1,17 +1,22 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; +use function strlen; +use function substr; +use function trim; + /** * Provides information about the Context in which the DocBlock occurs that receives this context. * @@ -25,32 +30,40 @@ * * @see ContextFactory::createFromClassReflector() * @see ContextFactory::createForNamespace() + * + * @psalm-immutable */ final class Context { /** @var string The current namespace. */ private $namespace; - /** @var array List of namespace aliases => Fully Qualified Namespace. */ + /** + * @var string[] List of namespace aliases => Fully Qualified Namespace. + * @psalm-var array + */ private $namespaceAliases; /** * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) * format (without a preceding `\`). * - * @param string $namespace The namespace where this DocBlock resides in. - * @param array $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + * @param string $namespace The namespace where this DocBlock resides in. + * @param string[] $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + * + * @psalm-param array $namespaceAliases */ - public function __construct($namespace, array $namespaceAliases = []) + public function __construct(string $namespace, array $namespaceAliases = []) { - $this->namespace = ('global' !== $namespace && 'default' !== $namespace) - ? trim((string)$namespace, '\\') + $this->namespace = $namespace !== 'global' && $namespace !== 'default' + ? trim($namespace, '\\') : ''; foreach ($namespaceAliases as $alias => $fqnn) { if ($fqnn[0] === '\\') { $fqnn = substr($fqnn, 1); } + if ($fqnn[strlen($fqnn) - 1] === '\\') { $fqnn = substr($fqnn, 0, -1); } @@ -63,10 +76,8 @@ public function __construct($namespace, array $namespaceAliases = []) /** * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. - * - * @return string */ - public function getNamespace() + public function getNamespace() : string { return $this->namespace; } @@ -76,8 +87,10 @@ public function getNamespace() * the alias for the imported Namespace. * * @return string[] + * + * @psalm-return array */ - public function getNamespaceAliases() + public function getNamespaceAliases() : array { return $this->namespaceAliases; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php index 30936a30..5d09d565 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php @@ -1,17 +1,56 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; +use ArrayIterator; +use InvalidArgumentException; +use ReflectionClass; +use ReflectionClassConstant; +use ReflectionMethod; +use ReflectionParameter; +use ReflectionProperty; +use Reflector; +use RuntimeException; +use UnexpectedValueException; +use function define; +use function defined; +use function file_exists; +use function file_get_contents; +use function get_class; +use function in_array; +use function is_string; +use function strrpos; +use function substr; +use function token_get_all; +use function trim; +use const T_AS; +use const T_CLASS; +use const T_CURLY_OPEN; +use const T_DOLLAR_OPEN_CURLY_BRACES; +use const T_NAMESPACE; +use const T_NS_SEPARATOR; +use const T_STRING; +use const T_USE; + +if (!defined('T_NAME_QUALIFIED')) { + define('T_NAME_QUALIFIED', 'T_NAME_QUALIFIED'); +} + +if (!defined('T_NAME_FULLY_QUALIFIED')) { + define('T_NAME_FULLY_QUALIFIED', 'T_NAME_FULLY_QUALIFIED'); +} + /** * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor. * @@ -24,31 +63,99 @@ final class ContextFactory { /** The literal used at the end of a use statement. */ - const T_LITERAL_END_OF_USE = ';'; + private const T_LITERAL_END_OF_USE = ';'; /** The literal used between sets of use statements */ - const T_LITERAL_USE_SEPARATOR = ','; + private const T_LITERAL_USE_SEPARATOR = ','; /** * Build a Context given a Class Reflection. * - * @param \Reflector $reflector - * * @see Context for more information on Contexts. - * - * @return Context */ - public function createFromReflector(\Reflector $reflector) + public function createFromReflector(Reflector $reflector) : Context { - if (method_exists($reflector, 'getDeclaringClass')) { - $reflector = $reflector->getDeclaringClass(); + if ($reflector instanceof ReflectionClass) { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $reflector */ + + return $this->createFromReflectionClass($reflector); } - $fileName = $reflector->getFileName(); - $namespace = $reflector->getNamespaceName(); + if ($reflector instanceof ReflectionParameter) { + return $this->createFromReflectionParameter($reflector); + } + + if ($reflector instanceof ReflectionMethod) { + return $this->createFromReflectionMethod($reflector); + } + + if ($reflector instanceof ReflectionProperty) { + return $this->createFromReflectionProperty($reflector); + } - if (file_exists($fileName)) { - return $this->createForNamespace($namespace, file_get_contents($fileName)); + if ($reflector instanceof ReflectionClassConstant) { + return $this->createFromReflectionClassConstant($reflector); + } + + throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector)); + } + + private function createFromReflectionParameter(ReflectionParameter $parameter) : Context + { + $class = $parameter->getDeclaringClass(); + if (!$class) { + throw new InvalidArgumentException('Unable to get class of ' . $parameter->getName()); + } + + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionMethod(ReflectionMethod $method) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + $class = $method->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionProperty(ReflectionProperty $property) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + $class = $property->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + private function createFromReflectionClassConstant(ReflectionClassConstant $constant) : Context + { + //phpcs:ignore SlevomatCodingStandard.Commenting.InlineDocCommentDeclaration.MissingVariable + /** @var ReflectionClass $class */ + $class = $constant->getDeclaringClass(); + + return $this->createFromReflectionClass($class); + } + + /** + * @param ReflectionClass $class + */ + private function createFromReflectionClass(ReflectionClass $class) : Context + { + $fileName = $class->getFileName(); + $namespace = $class->getNamespaceName(); + + if (is_string($fileName) && file_exists($fileName)) { + $contents = file_get_contents($fileName); + if ($contents === false) { + throw new RuntimeException('Unable to read file "' . $fileName . '"'); + } + + return $this->createForNamespace($namespace, $contents); } return new Context($namespace, []); @@ -57,22 +164,22 @@ public function createFromReflector(\Reflector $reflector) /** * Build a Context for a namespace in the provided file contents. * - * @param string $namespace It does not matter if a `\` precedes the namespace name, this method first normalizes. - * @param string $fileContents the file's contents to retrieve the aliases from with the given namespace. - * * @see Context for more information on Contexts. * - * @return Context + * @param string $namespace It does not matter if a `\` precedes the namespace name, + * this method first normalizes. + * @param string $fileContents The file's contents to retrieve the aliases from with the given namespace. */ - public function createForNamespace($namespace, $fileContents) + public function createForNamespace(string $namespace, string $fileContents) : Context { - $namespace = trim($namespace, '\\'); - $useStatements = []; + $namespace = trim($namespace, '\\'); + $useStatements = []; $currentNamespace = ''; - $tokens = new \ArrayIterator(token_get_all($fileContents)); + $tokens = new ArrayIterator(token_get_all($fileContents)); while ($tokens->valid()) { - switch ($tokens->current()[0]) { + $currentToken = $tokens->current(); + switch ($currentToken[0]) { case T_NAMESPACE: $currentNamespace = $this->parseNamespace($tokens); break; @@ -80,30 +187,35 @@ public function createForNamespace($namespace, $fileContents) // Fast-forward the iterator through the class so that any // T_USE tokens found within are skipped - these are not // valid namespace use statements so should be ignored. - $braceLevel = 0; + $braceLevel = 0; $firstBraceFound = false; while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { - if ($tokens->current() === '{' - || $tokens->current()[0] === T_CURLY_OPEN - || $tokens->current()[0] === T_DOLLAR_OPEN_CURLY_BRACES) { + $currentToken = $tokens->current(); + if ($currentToken === '{' + || in_array($currentToken[0], [T_CURLY_OPEN, T_DOLLAR_OPEN_CURLY_BRACES], true)) { if (!$firstBraceFound) { $firstBraceFound = true; } - $braceLevel++; + + ++$braceLevel; } - if ($tokens->current() === '}') { - $braceLevel--; + if ($currentToken === '}') { + --$braceLevel; } + $tokens->next(); } + break; case T_USE: if ($currentNamespace === $namespace) { - $useStatements = array_merge($useStatements, $this->parseUseStatement($tokens)); + $useStatements += $this->parseUseStatement($tokens); } + break; } + $tokens->next(); } @@ -113,18 +225,16 @@ public function createForNamespace($namespace, $fileContents) /** * Deduce the name from tokens when we are at the T_NAMESPACE token. * - * @param \ArrayIterator $tokens - * - * @return string + * @param ArrayIterator $tokens */ - private function parseNamespace(\ArrayIterator $tokens) + private function parseNamespace(ArrayIterator $tokens) : string { // skip to the first string or namespace separator $this->skipToNextStringOrNamespaceSeparator($tokens); $name = ''; - while ($tokens->valid() && ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) - ) { + $acceptedTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED]; + while ($tokens->valid() && in_array($tokens->current()[0], $acceptedTokens, true)) { $name .= $tokens->current()[1]; $tokens->next(); } @@ -135,22 +245,23 @@ private function parseNamespace(\ArrayIterator $tokens) /** * Deduce the names of all imports when we are at the T_USE token. * - * @param \ArrayIterator $tokens + * @param ArrayIterator $tokens * * @return string[] + * + * @psalm-return array */ - private function parseUseStatement(\ArrayIterator $tokens) + private function parseUseStatement(ArrayIterator $tokens) : array { $uses = []; - $continue = true; - while ($continue) { + while ($tokens->valid()) { $this->skipToNextStringOrNamespaceSeparator($tokens); - list($alias, $fqnn) = $this->extractUseStatement($tokens); - $uses[$alias] = $fqnn; - if ($tokens->current()[0] === self::T_LITERAL_END_OF_USE) { - $continue = false; + $uses += $this->extractUseStatements($tokens); + $currentToken = $tokens->current(); + if ($currentToken[0] === self::T_LITERAL_END_OF_USE) { + return $uses; } } @@ -160,51 +271,153 @@ private function parseUseStatement(\ArrayIterator $tokens) /** * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. * - * @param \ArrayIterator $tokens - * - * @return void + * @param ArrayIterator $tokens */ - private function skipToNextStringOrNamespaceSeparator(\ArrayIterator $tokens) + private function skipToNextStringOrNamespaceSeparator(ArrayIterator $tokens) : void { - while ($tokens->valid() && ($tokens->current()[0] !== T_STRING) && ($tokens->current()[0] !== T_NS_SEPARATOR)) { + while ($tokens->valid()) { + $currentToken = $tokens->current(); + if (in_array($currentToken[0], [T_STRING, T_NS_SEPARATOR], true)) { + break; + } + + if ($currentToken[0] === T_NAME_QUALIFIED) { + break; + } + + if (defined('T_NAME_FULLY_QUALIFIED') && $currentToken[0] === T_NAME_FULLY_QUALIFIED) { + break; + } + $tokens->next(); } } /** * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of - * a USE statement yet. + * a USE statement yet. This will return a key/value array of the alias => namespace. * - * @param \ArrayIterator $tokens + * @param ArrayIterator $tokens * - * @return string + * @return string[] + * + * @psalm-suppress TypeDoesNotContainType + * + * @psalm-return array */ - private function extractUseStatement(\ArrayIterator $tokens) + private function extractUseStatements(ArrayIterator $tokens) : array { - $result = ['']; - while ($tokens->valid() - && ($tokens->current()[0] !== self::T_LITERAL_USE_SEPARATOR) - && ($tokens->current()[0] !== self::T_LITERAL_END_OF_USE) - ) { - if ($tokens->current()[0] === T_AS) { - $result[] = ''; + $extractedUseStatements = []; + $groupedNs = ''; + $currentNs = ''; + $currentAlias = ''; + $state = 'start'; + + while ($tokens->valid()) { + $currentToken = $tokens->current(); + $tokenId = is_string($currentToken) ? $currentToken : $currentToken[0]; + $tokenValue = is_string($currentToken) ? null : $currentToken[1]; + switch ($state) { + case 'start': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_NAME_QUALIFIED: + case T_NAME_FULLY_QUALIFIED: + $currentNs .= (string) $tokenValue; + $currentAlias = substr( + (string) $tokenValue, + (int) (strrpos((string) $tokenValue, '\\')) + 1 + ); + break; + case T_CURLY_OPEN: + case '{': + $state = 'grouped'; + $groupedNs = $currentNs; + break; + case T_AS: + $state = 'start-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'start-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'grouped': + switch ($tokenId) { + case T_STRING: + case T_NS_SEPARATOR: + $currentNs .= (string) $tokenValue; + $currentAlias = $tokenValue; + break; + case T_AS: + $state = 'grouped-alias'; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } + + break; + case 'grouped-alias': + switch ($tokenId) { + case T_STRING: + $currentAlias = $tokenValue; + break; + case self::T_LITERAL_USE_SEPARATOR: + $state = 'grouped'; + $extractedUseStatements[(string) $currentAlias] = $currentNs; + $currentNs = $groupedNs; + $currentAlias = ''; + break; + case self::T_LITERAL_END_OF_USE: + $state = 'end'; + break; + default: + break; + } } - if ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) { - $result[count($result) - 1] .= $tokens->current()[1]; + + if ($state === 'end') { + break; } + $tokens->next(); } - if (count($result) == 1) { - $backslashPos = strrpos($result[0], '\\'); - - if (false !== $backslashPos) { - $result[] = substr($result[0], $backslashPos + 1); - } else { - $result[] = $result[0]; - } + if ($groupedNs !== $currentNs) { + $extractedUseStatements[(string) $currentAlias] = $currentNs; } - return array_reverse($result); + return $extractedUseStatements; } } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Expression.php b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php new file mode 100644 index 00000000..4a8ae1fc --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Expression.php @@ -0,0 +1,51 @@ +valueType = $valueType; + } + + /** + * Returns the value for the keys of this array. + */ + public function getValueType() : Type + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + */ + public function __toString() : string + { + return '(' . $this->valueType . ')'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php index e58d8966..e70ce7dd 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a Float. + * + * @psalm-immutable */ final class Float_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'float'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Integer.php b/vendor/phpdocumentor/type-resolver/src/Types/Integer.php index be4555ef..2cfd7e9e 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Integer.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Integer.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -14,14 +15,17 @@ use phpDocumentor\Reflection\Type; +/** + * Value object representing Integer type + * + * @psalm-immutable + */ final class Integer implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'int'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php b/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php new file mode 100644 index 00000000..ced37b62 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php @@ -0,0 +1,37 @@ + $types + */ + public function __construct(array $types) + { + parent::__construct($types, '&'); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php index 0cbf48f7..a03a7cd3 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php @@ -1,31 +1,38 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; -use phpDocumentor\Reflection\Type; - /** * Value Object representing iterable type + * + * @psalm-immutable */ -final class Iterable_ implements Type +final class Iterable_ extends AbstractList { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { - return 'iterable'; + if ($this->keyType) { + return 'iterable<' . $this->keyType . ',' . $this->valueType . '>'; + } + + if ($this->valueType instanceof Mixed_) { + return 'iterable'; + } + + return 'iterable<' . $this->valueType . '>'; } } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php index c1c165f4..2fedff40 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing an unknown, or mixed, type. + * + * @psalm-immutable */ final class Mixed_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'mixed'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Null_.php b/vendor/phpdocumentor/type-resolver/src/Types/Null_.php index 203b4227..f5994d9a 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Null_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Null_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing a null value or type. + * + * @psalm-immutable */ final class Null_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'null'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php b/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php index 3c6d1b13..80aaf4ec 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,18 +17,16 @@ /** * Value Object representing a nullable type. The real type is wrapped. + * + * @psalm-immutable */ final class Nullable implements Type { - /** - * @var Type - */ + /** @var Type The actual type that is wrapped */ private $realType; /** * Initialises this nullable type using the real type embedded - * - * @param Type $realType */ public function __construct(Type $realType) { @@ -36,20 +35,16 @@ public function __construct(Type $realType) /** * Provide access to the actual type directly, if needed. - * - * @return Type */ - public function getActualType() + public function getActualType() : Type { return $this->realType; } /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return '?' . $this->realType->__toString(); } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php index 389f7c70..4cfe2a0c 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php @@ -1,19 +1,22 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ namespace phpDocumentor\Reflection\Types; +use InvalidArgumentException; use phpDocumentor\Reflection\Fqsen; use phpDocumentor\Reflection\Type; +use function strpos; /** * Value Object representing an object. @@ -21,6 +24,8 @@ * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN, * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects * in general. + * + * @psalm-immutable */ final class Object_ implements Type { @@ -30,15 +35,14 @@ final class Object_ implements Type /** * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'. * - * @param Fqsen $fqsen - * @throws \InvalidArgumentException when provided $fqsen is not a valid type. + * @throws InvalidArgumentException When provided $fqsen is not a valid type. */ - public function __construct(Fqsen $fqsen = null) + public function __construct(?Fqsen $fqsen = null) { - if (strpos((string)$fqsen, '::') !== false || strpos((string)$fqsen, '()') !== false) { - throw new \InvalidArgumentException( + if (strpos((string) $fqsen, '::') !== false || strpos((string) $fqsen, '()') !== false) { + throw new InvalidArgumentException( 'Object types can only refer to a class, interface or trait but a method, function, constant or ' - . 'property was received: ' . (string)$fqsen + . 'property was received: ' . (string) $fqsen ); } @@ -47,23 +51,16 @@ public function __construct(Fqsen $fqsen = null) /** * Returns the FQSEN associated with this object. - * - * @return Fqsen|null */ - public function getFqsen() + public function getFqsen() : ?Fqsen { return $this->fqsen; } - /** - * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string - */ - public function __toString() + public function __toString() : string { if ($this->fqsen) { - return (string)$this->fqsen; + return (string) $this->fqsen; } return 'object'; diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php index aabdbfb3..08900abc 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -18,15 +19,15 @@ * Value Object representing the 'parent' type. * * Parent, as a Type, represents the parent class of class in which the associated element was defined. + * + * @psalm-immutable */ final class Parent_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'parent'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php b/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php index a1b613dc..2d4a794c 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing the 'resource' Type. + * + * @psalm-immutable */ final class Resource_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'resource'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php b/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php index 1e2a6602..00ac3691 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing the 'scalar' pseudo-type, which is either a string, integer, float or boolean. + * + * @psalm-immutable */ final class Scalar implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'scalar'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Self_.php b/vendor/phpdocumentor/type-resolver/src/Types/Self_.php index 1ba3fc5a..7fa13fa5 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Self_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Self_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -18,15 +19,15 @@ * Value Object representing the 'self' type. * * Self, as a Type, represents the class in which the associated element was defined. + * + * @psalm-immutable */ final class Self_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'self'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Static_.php b/vendor/phpdocumentor/type-resolver/src/Types/Static_.php index 9eb67299..568400ce 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Static_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Static_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -23,15 +24,15 @@ * * See the documentation on late static binding in the PHP Documentation for more information on the difference between * static and self. + * + * @psalm-immutable */ final class Static_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'static'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/String_.php b/vendor/phpdocumentor/type-resolver/src/Types/String_.php index 8db59685..6b92e413 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/String_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/String_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -16,15 +17,15 @@ /** * Value Object representing the type 'string'. + * + * @psalm-immutable */ final class String_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'string'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/This.php b/vendor/phpdocumentor/type-resolver/src/Types/This.php index c098a939..58cb3af0 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/This.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/This.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -19,15 +20,15 @@ * * $this, as a Type, represents the instance of the class associated with the element as it was called. $this is * commonly used when documenting fluent interfaces since it represents that the same object is returned. + * + * @psalm-immutable */ final class This implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return '$this'; } diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Void_.php b/vendor/phpdocumentor/type-resolver/src/Types/Void_.php index 3d1be272..5cabad50 100644 --- a/vendor/phpdocumentor/type-resolver/src/Types/Void_.php +++ b/vendor/phpdocumentor/type-resolver/src/Types/Void_.php @@ -1,12 +1,13 @@ - * @license http://www.opensource.org/licenses/mit-license.php MIT * @link http://phpdoc.org */ @@ -19,15 +20,15 @@ * * Void is generally only used when working with return types as it signifies that the method intentionally does not * return any value. + * + * @psalm-immutable */ final class Void_ implements Type { /** * Returns a rendered output of the Type as it would be used in a DocBlock. - * - * @return string */ - public function __toString() + public function __toString() : string { return 'void'; } diff --git a/vendor/psr/log/.gitignore b/vendor/psr/log/.gitignore deleted file mode 100644 index 22d0d82f..00000000 --- a/vendor/psr/log/.gitignore +++ /dev/null @@ -1 +0,0 @@ -vendor diff --git a/vendor/psr/log/Psr/Log/LoggerInterface.php b/vendor/psr/log/Psr/Log/LoggerInterface.php index 5ea72438..2206cfde 100644 --- a/vendor/psr/log/Psr/Log/LoggerInterface.php +++ b/vendor/psr/log/Psr/Log/LoggerInterface.php @@ -22,8 +22,8 @@ interface LoggerInterface /** * System is unusable. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -35,8 +35,8 @@ public function emergency($message, array $context = array()); * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -47,8 +47,8 @@ public function alert($message, array $context = array()); * * Example: Application component unavailable, unexpected exception. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -58,8 +58,8 @@ public function critical($message, array $context = array()); * Runtime errors that do not require immediate action but should typically * be logged and monitored. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -71,8 +71,8 @@ public function error($message, array $context = array()); * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -81,8 +81,8 @@ public function warning($message, array $context = array()); /** * Normal but significant events. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -93,8 +93,8 @@ public function notice($message, array $context = array()); * * Example: User logs in, SQL logs. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -103,8 +103,8 @@ public function info($message, array $context = array()); /** * Detailed debug information. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -113,11 +113,13 @@ public function debug($message, array $context = array()); /** * Logs with an arbitrary level. * - * @param mixed $level - * @param string $message - * @param array $context + * @param mixed $level + * @param string $message + * @param mixed[] $context * * @return void + * + * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()); } diff --git a/vendor/psr/log/Psr/Log/LoggerTrait.php b/vendor/psr/log/Psr/Log/LoggerTrait.php index 867225df..e392fef0 100644 --- a/vendor/psr/log/Psr/Log/LoggerTrait.php +++ b/vendor/psr/log/Psr/Log/LoggerTrait.php @@ -135,6 +135,8 @@ public function debug($message, array $context = array()) * @param array $context * * @return void + * + * @throws \Psr\Log\InvalidArgumentException */ abstract public function log($level, $message, array $context = array()); } diff --git a/vendor/psr/log/Psr/Log/NullLogger.php b/vendor/psr/log/Psr/Log/NullLogger.php index d8cd682c..c8f7293b 100644 --- a/vendor/psr/log/Psr/Log/NullLogger.php +++ b/vendor/psr/log/Psr/Log/NullLogger.php @@ -20,6 +20,8 @@ class NullLogger extends AbstractLogger * @param array $context * * @return void + * + * @throws \Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()) { diff --git a/vendor/psr/log/Psr/Log/Test/DummyTest.php b/vendor/psr/log/Psr/Log/Test/DummyTest.php new file mode 100644 index 00000000..9638c110 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/DummyTest.php @@ -0,0 +1,18 @@ + true, 'null' => null, @@ -110,6 +114,7 @@ public function testContextCanContainAnything() 'nested' => array('with object' => new DummyTest), 'object' => new \DateTime, 'resource' => fopen('php://memory', 'r'), + 'closed' => $closed, ); $this->getLogger()->warning('Crazy context data', $context); @@ -131,10 +136,3 @@ public function testContextExceptionKeyCanBeExceptionOrOtherValues() $this->assertEquals($expected, $this->getLogs()); } } - -class DummyTest -{ - public function __toString() - { - } -} diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php new file mode 100644 index 00000000..1be32304 --- /dev/null +++ b/vendor/psr/log/Psr/Log/Test/TestLogger.php @@ -0,0 +1,147 @@ + $level, + 'message' => $message, + 'context' => $context, + ]; + + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + public function hasRecords($level) + { + return isset($this->recordsByLevel[$level]); + } + + public function hasRecord($record, $level) + { + if (is_string($record)) { + $record = ['message' => $record]; + } + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + return true; + }, $level); + } + + public function hasRecordThatContains($message, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + public function hasRecordThatMatches($regex, $level) + { + return $this->hasRecordThatPasses(function ($rec) use ($regex) { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + public function hasRecordThatPasses(callable $predicate, $level) + { + if (!isset($this->recordsByLevel[$level])) { + return false; + } + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if (call_user_func($predicate, $rec, $i)) { + return true; + } + } + return false; + } + + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = strtolower($matches[2]); + if (method_exists($this, $genericMethod)) { + $args[] = $level; + return call_user_func_array([$this, $genericMethod], $args); + } + } + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } + + public function reset() + { + $this->records = []; + $this->recordsByLevel = []; + } +} diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md index 574bc1cb..a9f20c43 100644 --- a/vendor/psr/log/README.md +++ b/vendor/psr/log/README.md @@ -7,6 +7,13 @@ This repository holds all interfaces/classes/traits related to Note that this is not a logger of its own. It is merely an interface that describes a logger. See the specification for more details. +Installation +------------ + +```bash +composer require psr/log +``` + Usage ----- @@ -31,6 +38,12 @@ class Foo if ($this->logger) { $this->logger->info('Doing work'); } + + try { + $this->doSomethingElse(); + } catch (Exception $exception) { + $this->logger->error('Oh no!', array('exception' => $exception)); + } // do something useful } diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json index 87934d70..3f6d4eea 100644 --- a/vendor/psr/log/composer.json +++ b/vendor/psr/log/composer.json @@ -20,7 +20,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } } } diff --git a/vendor/ralouphie/getallheaders/LICENSE b/vendor/ralouphie/getallheaders/LICENSE new file mode 100644 index 00000000..be5540c2 --- /dev/null +++ b/vendor/ralouphie/getallheaders/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ralph Khattar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/ralouphie/getallheaders/README.md b/vendor/ralouphie/getallheaders/README.md new file mode 100644 index 00000000..9430d76b --- /dev/null +++ b/vendor/ralouphie/getallheaders/README.md @@ -0,0 +1,27 @@ +getallheaders +============= + +PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3. + +[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders) +[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master) +[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders) + + +This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php). + +## Install + +For PHP version **`>= 5.6`**: + +``` +composer require ralouphie/getallheaders +``` + +For PHP version **`< 5.6`**: + +``` +composer require ralouphie/getallheaders "^2" +``` diff --git a/vendor/ralouphie/getallheaders/composer.json b/vendor/ralouphie/getallheaders/composer.json new file mode 100644 index 00000000..de8ce62e --- /dev/null +++ b/vendor/ralouphie/getallheaders/composer.json @@ -0,0 +1,26 @@ +{ + "name": "ralouphie/getallheaders", + "description": "A polyfill for getallheaders.", + "license": "MIT", + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^5 || ^6.5", + "php-coveralls/php-coveralls": "^2.1" + }, + "autoload": { + "files": ["src/getallheaders.php"] + }, + "autoload-dev": { + "psr-4": { + "getallheaders\\Tests\\": "tests/" + } + } +} diff --git a/vendor/ralouphie/getallheaders/src/getallheaders.php b/vendor/ralouphie/getallheaders/src/getallheaders.php new file mode 100644 index 00000000..c7285a5b --- /dev/null +++ b/vendor/ralouphie/getallheaders/src/getallheaders.php @@ -0,0 +1,46 @@ + 'Content-Type', + 'CONTENT_LENGTH' => 'Content-Length', + 'CONTENT_MD5' => 'Content-Md5', + ); + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) === 'HTTP_') { + $key = substr($key, 5); + if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { + $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key)))); + $headers[$key] = $value; + } + } elseif (isset($copy_server[$key])) { + $headers[$copy_server[$key]] = $value; + } + } + + if (!isset($headers['Authorization'])) { + if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { + $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + } elseif (isset($_SERVER['PHP_AUTH_USER'])) { + $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; + $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); + } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { + $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; + } + } + + return $headers; + } + +} diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 00000000..58414dc7 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,227 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param string|int $int + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 00000000..3f853aaf --- /dev/null +++ b/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 00000000..8add1ab0 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 00000000..0bc45cfd --- /dev/null +++ b/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($input) { return p\Ctype::ctype_alnum($input); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($input) { return p\Ctype::ctype_alpha($input); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($input) { return p\Ctype::ctype_cntrl($input); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($input) { return p\Ctype::ctype_digit($input); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($input) { return p\Ctype::ctype_graph($input); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($input) { return p\Ctype::ctype_lower($input); } +} +if (!function_exists('ctype_print')) { + function ctype_print($input) { return p\Ctype::ctype_print($input); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($input) { return p\Ctype::ctype_punct($input); } +} +if (!function_exists('ctype_space')) { + function ctype_space($input) { return p\Ctype::ctype_space($input); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($input) { return p\Ctype::ctype_upper($input); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($input) { return p\Ctype::ctype_xdigit($input); } +} diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 00000000..2088bb9f --- /dev/null +++ b/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": ["polyfill", "compatibility", "portable", "ctype"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-intl-idn/Idn.php b/vendor/symfony/polyfill-intl-idn/Idn.php new file mode 100644 index 00000000..535248a2 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Idn.php @@ -0,0 +1,925 @@ + and Trevor Rowbotham + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Idn; + +use Exception; +use Normalizer; +use Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges; +use Symfony\Polyfill\Intl\Idn\Resources\unidata\Regex; + +/** + * @see https://www.unicode.org/reports/tr46/ + * + * @internal + */ +final class Idn +{ + const ERROR_EMPTY_LABEL = 1; + const ERROR_LABEL_TOO_LONG = 2; + const ERROR_DOMAIN_NAME_TOO_LONG = 4; + const ERROR_LEADING_HYPHEN = 8; + const ERROR_TRAILING_HYPHEN = 0x10; + const ERROR_HYPHEN_3_4 = 0x20; + const ERROR_LEADING_COMBINING_MARK = 0x40; + const ERROR_DISALLOWED = 0x80; + const ERROR_PUNYCODE = 0x100; + const ERROR_LABEL_HAS_DOT = 0x200; + const ERROR_INVALID_ACE_LABEL = 0x400; + const ERROR_BIDI = 0x800; + const ERROR_CONTEXTJ = 0x1000; + const ERROR_CONTEXTO_PUNCTUATION = 0x2000; + const ERROR_CONTEXTO_DIGITS = 0x4000; + + const INTL_IDNA_VARIANT_2003 = 0; + const INTL_IDNA_VARIANT_UTS46 = 1; + + const IDNA_DEFAULT = 0; + const IDNA_ALLOW_UNASSIGNED = 1; + const IDNA_USE_STD3_RULES = 2; + const IDNA_CHECK_BIDI = 4; + const IDNA_CHECK_CONTEXTJ = 8; + const IDNA_NONTRANSITIONAL_TO_ASCII = 16; + const IDNA_NONTRANSITIONAL_TO_UNICODE = 32; + + const MAX_DOMAIN_SIZE = 253; + const MAX_LABEL_SIZE = 63; + + const BASE = 36; + const TMIN = 1; + const TMAX = 26; + const SKEW = 38; + const DAMP = 700; + const INITIAL_BIAS = 72; + const INITIAL_N = 128; + const DELIMITER = '-'; + const MAX_INT = 2147483647; + + /** + * Contains the numeric value of a basic code point (for use in representing integers) in the + * range 0 to BASE-1, or -1 if b is does not represent a value. + * + * @var array + */ + private static $basicToDigit = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + ); + + /** + * @var array + */ + private static $virama; + + /** + * @var array + */ + private static $mapped; + + /** + * @var array + */ + private static $ignored; + + /** + * @var array + */ + private static $deviation; + + /** + * @var array + */ + private static $disallowed; + + /** + * @var array + */ + private static $disallowed_STD3_mapped; + + /** + * @var array + */ + private static $disallowed_STD3_valid; + + /** + * @var bool + */ + private static $mappingTableLoaded = false; + + /** + * @see https://www.unicode.org/reports/tr46/#ToASCII + * + * @param string $domainName + * @param int $options + * @param int $variant + * @param array $idna_info + * + * @return string|false + */ + public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) + { + if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { + @trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED); + } + + $options = array( + 'CheckHyphens' => true, + 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), + 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), + 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), + 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_ASCII), + 'VerifyDnsLength' => true, + ); + $info = new Info(); + $labels = self::process((string) $domainName, $options, $info); + + foreach ($labels as $i => $label) { + // Only convert labels to punycode that contain non-ASCII code points + if (1 === preg_match('/[^\x00-\x7F]/', $label)) { + try { + $label = 'xn--'.self::punycodeEncode($label); + } catch (Exception $e) { + $info->errors |= self::ERROR_PUNYCODE; + } + + $labels[$i] = $label; + } + } + + if ($options['VerifyDnsLength']) { + self::validateDomainAndLabelLength($labels, $info); + } + + $idna_info = array( + 'result' => implode('.', $labels), + 'isTransitionalDifferent' => $info->transitionalDifferent, + 'errors' => $info->errors, + ); + + return 0 === $info->errors ? $idna_info['result'] : false; + } + + /** + * @see https://www.unicode.org/reports/tr46/#ToUnicode + * + * @param string $domainName + * @param int $options + * @param int $variant + * @param array $idna_info + * + * @return string|false + */ + public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) + { + if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { + @trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', E_USER_DEPRECATED); + } + + $info = new Info(); + $labels = self::process((string) $domainName, array( + 'CheckHyphens' => true, + 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), + 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), + 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), + 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_UNICODE), + ), $info); + $idna_info = array( + 'result' => implode('.', $labels), + 'isTransitionalDifferent' => $info->transitionalDifferent, + 'errors' => $info->errors, + ); + + return 0 === $info->errors ? $idna_info['result'] : false; + } + + /** + * @param string $label + * + * @return bool + */ + private static function isValidContextJ(array $codePoints, $label) + { + if (!isset(self::$virama)) { + self::$virama = require __DIR__.\DIRECTORY_SEPARATOR.'Resources'.\DIRECTORY_SEPARATOR.'unidata'.\DIRECTORY_SEPARATOR.'virama.php'; + } + + $offset = 0; + + foreach ($codePoints as $i => $codePoint) { + if (0x200C !== $codePoint && 0x200D !== $codePoint) { + continue; + } + + if (!isset($codePoints[$i - 1])) { + return false; + } + + // If Canonical_Combining_Class(Before(cp)) .eq. Virama Then True; + if (isset(self::$virama[$codePoints[$i - 1]])) { + continue; + } + + // If RegExpMatch((Joining_Type:{L,D})(Joining_Type:T)*\u200C(Joining_Type:T)*(Joining_Type:{R,D})) Then + // True; + // Generated RegExp = ([Joining_Type:{L,D}][Joining_Type:T]*\u200C[Joining_Type:T]*)[Joining_Type:{R,D}] + if (0x200C === $codePoint && 1 === preg_match(Regex::ZWNJ, $label, $matches, PREG_OFFSET_CAPTURE, $offset)) { + $offset += \strlen($matches[1][0]); + + continue; + } + + return false; + } + + return true; + } + + /** + * @see https://www.unicode.org/reports/tr46/#ProcessingStepMap + * + * @param string $input + * @param array $options + * + * @return string + */ + private static function mapCodePoints($input, array $options, Info $info) + { + $str = ''; + $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; + $transitional = $options['Transitional_Processing']; + + foreach (self::utf8Decode($input) as $codePoint) { + $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); + + switch ($data['status']) { + case 'disallowed': + $info->errors |= self::ERROR_DISALLOWED; + + // no break. + + case 'valid': + $str .= mb_chr($codePoint, 'utf-8'); + + break; + + case 'ignored': + // Do nothing. + break; + + case 'mapped': + $str .= $data['mapping']; + + break; + + case 'deviation': + $info->transitionalDifferent = true; + $str .= ($transitional ? $data['mapping'] : mb_chr($codePoint, 'utf-8')); + + break; + } + } + + return $str; + } + + /** + * @see https://www.unicode.org/reports/tr46/#Processing + * + * @param string $domain + * @param array $options + * + * @return array + */ + private static function process($domain, array $options, Info $info) + { + // If VerifyDnsLength is not set, we are doing ToUnicode otherwise we are doing ToASCII and + // we need to respect the VerifyDnsLength option. + $checkForEmptyLabels = !isset($options['VerifyDnsLength']) || $options['VerifyDnsLength']; + + if ($checkForEmptyLabels && '' === $domain) { + $info->errors |= self::ERROR_EMPTY_LABEL; + + return array($domain); + } + + // Step 1. Map each code point in the domain name string + $domain = self::mapCodePoints($domain, $options, $info); + + // Step 2. Normalize the domain name string to Unicode Normalization Form C. + if (!Normalizer::isNormalized($domain, Normalizer::FORM_C)) { + $domain = Normalizer::normalize($domain, Normalizer::FORM_C); + } + + // Step 3. Break the string into labels at U+002E (.) FULL STOP. + $labels = explode('.', $domain); + $lastLabelIndex = \count($labels) - 1; + + // Step 4. Convert and validate each label in the domain name string. + foreach ($labels as $i => $label) { + $validationOptions = $options; + + if ('xn--' === substr($label, 0, 4)) { + try { + $label = self::punycodeDecode(substr($label, 4)); + } catch (Exception $e) { + $info->errors |= self::ERROR_PUNYCODE; + + continue; + } + + $validationOptions['Transitional_Processing'] = false; + $labels[$i] = $label; + } + + self::validateLabel($label, $info, $validationOptions, $i > 0 && $i === $lastLabelIndex); + } + + if ($info->bidiDomain && !$info->validBidiDomain) { + $info->errors |= self::ERROR_BIDI; + } + + // Any input domain name string that does not record an error has been successfully + // processed according to this specification. Conversely, if an input domain_name string + // causes an error, then the processing of the input domain_name string fails. Determining + // what to do with error input is up to the caller, and not in the scope of this document. + return $labels; + } + + /** + * @see https://tools.ietf.org/html/rfc5893#section-2 + * + * @param string $label + */ + private static function validateBidiLabel($label, Info $info) + { + if (1 === preg_match(Regex::RTL_LABEL, $label)) { + $info->bidiDomain = true; + + // Step 1. The first character must be a character with Bidi property L, R, or AL. + // If it has the R or AL property, it is an RTL label + if (1 !== preg_match(Regex::BIDI_STEP_1_RTL, $label)) { + $info->validBidiDomain = false; + + return; + } + + // Step 2. In an RTL label, only characters with the Bidi properties R, AL, AN, EN, ES, + // CS, ET, ON, BN, or NSM are allowed. + if (1 === preg_match(Regex::BIDI_STEP_2, $label)) { + $info->validBidiDomain = false; + + return; + } + + // Step 3. In an RTL label, the end of the label must be a character with Bidi property + // R, AL, EN, or AN, followed by zero or more characters with Bidi property NSM. + if (1 !== preg_match(Regex::BIDI_STEP_3, $label)) { + $info->validBidiDomain = false; + + return; + } + + // Step 4. In an RTL label, if an EN is present, no AN may be present, and vice versa. + if (1 === preg_match(Regex::BIDI_STEP_4_AN, $label) && 1 === preg_match(Regex::BIDI_STEP_4_EN, $label)) { + $info->validBidiDomain = false; + + return; + } + + return; + } + + // We are a LTR label + // Step 1. The first character must be a character with Bidi property L, R, or AL. + // If it has the L property, it is an LTR label. + if (1 !== preg_match(Regex::BIDI_STEP_1_LTR, $label)) { + $info->validBidiDomain = false; + + return; + } + + // Step 5. In an LTR label, only characters with the Bidi properties L, EN, + // ES, CS, ET, ON, BN, or NSM are allowed. + if (1 === preg_match(Regex::BIDI_STEP_5, $label)) { + $info->validBidiDomain = false; + + return; + } + + // Step 6.In an LTR label, the end of the label must be a character with Bidi property L or + // EN, followed by zero or more characters with Bidi property NSM. + if (1 !== preg_match(Regex::BIDI_STEP_6, $label)) { + $info->validBidiDomain = false; + + return; + } + } + + /** + * @param array $labels + */ + private static function validateDomainAndLabelLength(array $labels, Info $info) + { + $maxDomainSize = self::MAX_DOMAIN_SIZE; + $length = \count($labels); + + // Number of "." delimiters. + $domainLength = $length - 1; + + // If the last label is empty and it is not the first label, then it is the root label. + // Increase the max size by 1, making it 254, to account for the root label's "." + // delimiter. This also means we don't need to check the last label's length for being too + // long. + if ($length > 1 && '' === $labels[$length - 1]) { + ++$maxDomainSize; + --$length; + } + + for ($i = 0; $i < $length; ++$i) { + $bytes = \strlen($labels[$i]); + $domainLength += $bytes; + + if ($bytes > self::MAX_LABEL_SIZE) { + $info->errors |= self::ERROR_LABEL_TOO_LONG; + } + } + + if ($domainLength > $maxDomainSize) { + $info->errors |= self::ERROR_DOMAIN_NAME_TOO_LONG; + } + } + + /** + * @see https://www.unicode.org/reports/tr46/#Validity_Criteria + * + * @param string $label + * @param array $options + * @param bool $canBeEmpty + */ + private static function validateLabel($label, Info $info, array $options, $canBeEmpty) + { + if ('' === $label) { + if (!$canBeEmpty && (!isset($options['VerifyDnsLength']) || $options['VerifyDnsLength'])) { + $info->errors |= self::ERROR_EMPTY_LABEL; + } + + return; + } + + // Step 1. The label must be in Unicode Normalization Form C. + if (!Normalizer::isNormalized($label, Normalizer::FORM_C)) { + $info->errors |= self::ERROR_INVALID_ACE_LABEL; + } + + $codePoints = self::utf8Decode($label); + + if ($options['CheckHyphens']) { + // Step 2. If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character + // in both the thrid and fourth positions. + if (isset($codePoints[2], $codePoints[3]) && 0x002D === $codePoints[2] && 0x002D === $codePoints[3]) { + $info->errors |= self::ERROR_HYPHEN_3_4; + } + + // Step 3. If CheckHyphens, the label must neither begin nor end with a U+002D + // HYPHEN-MINUS character. + if ('-' === substr($label, 0, 1)) { + $info->errors |= self::ERROR_LEADING_HYPHEN; + } + + if ('-' === substr($label, -1, 1)) { + $info->errors |= self::ERROR_TRAILING_HYPHEN; + } + } + + // Step 4. The label must not contain a U+002E (.) FULL STOP. + if (false !== strpos($label, '.')) { + $info->errors |= self::ERROR_LABEL_HAS_DOT; + } + + // Step 5. The label must not begin with a combining mark, that is: General_Category=Mark. + if (1 === preg_match(Regex::COMBINING_MARK, $label)) { + $info->errors |= self::ERROR_LEADING_COMBINING_MARK; + } + + // Step 6. Each code point in the label must only have certain status values according to + // Section 5, IDNA Mapping Table: + $transitional = $options['Transitional_Processing']; + $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; + + foreach ($codePoints as $codePoint) { + $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); + $status = $data['status']; + + if ('valid' === $status || (!$transitional && 'deviation' === $status)) { + continue; + } + + $info->errors |= self::ERROR_DISALLOWED; + + break; + } + + // Step 7. If CheckJoiners, the label must satisify the ContextJ rules from Appendix A, in + // The Unicode Code Points and Internationalized Domain Names for Applications (IDNA) + // [IDNA2008]. + if ($options['CheckJoiners'] && !self::isValidContextJ($codePoints, $label)) { + $info->errors |= self::ERROR_CONTEXTJ; + } + + // Step 8. If CheckBidi, and if the domain name is a Bidi domain name, then the label must + // satisfy all six of the numbered conditions in [IDNA2008] RFC 5893, Section 2. + if ($options['CheckBidi'] && (!$info->bidiDomain || $info->validBidiDomain)) { + self::validateBidiLabel($label, $info); + } + } + + /** + * @see https://tools.ietf.org/html/rfc3492#section-6.2 + * + * @param string $input + * + * @return string + */ + private static function punycodeDecode($input) + { + $n = self::INITIAL_N; + $out = 0; + $i = 0; + $bias = self::INITIAL_BIAS; + $lastDelimIndex = strrpos($input, self::DELIMITER); + $b = false === $lastDelimIndex ? 0 : $lastDelimIndex; + $inputLength = \strlen($input); + $output = array(); + $bytes = array_map('ord', str_split($input)); + + for ($j = 0; $j < $b; ++$j) { + if ($bytes[$j] > 0x7F) { + throw new Exception('Invalid input'); + } + + $output[$out++] = $input[$j]; + } + + if ($b > 0) { + ++$b; + } + + for ($in = $b; $in < $inputLength; ++$out) { + $oldi = $i; + $w = 1; + + for ($k = self::BASE; /* no condition */; $k += self::BASE) { + if ($in >= $inputLength) { + throw new Exception('Invalid input'); + } + + $digit = self::$basicToDigit[$bytes[$in++] & 0xFF]; + + if ($digit < 0) { + throw new Exception('Invalid input'); + } + + if ($digit > intdiv(self::MAX_INT - $i, $w)) { + throw new Exception('Integer overflow'); + } + + $i += $digit * $w; + + if ($k <= $bias) { + $t = self::TMIN; + } elseif ($k >= $bias + self::TMAX) { + $t = self::TMAX; + } else { + $t = $k - $bias; + } + + if ($digit < $t) { + break; + } + + $baseMinusT = self::BASE - $t; + + if ($w > intdiv(self::MAX_INT, $baseMinusT)) { + throw new Exception('Integer overflow'); + } + + $w *= $baseMinusT; + } + + $outPlusOne = $out + 1; + $bias = self::adaptBias($i - $oldi, $outPlusOne, 0 === $oldi); + + if (intdiv($i, $outPlusOne) > self::MAX_INT - $n) { + throw new Exception('Integer overflow'); + } + + $n += intdiv($i, $outPlusOne); + $i %= $outPlusOne; + array_splice($output, $i++, 0, array(mb_chr($n, 'utf-8'))); + } + + return implode('', $output); + } + + /** + * @see https://tools.ietf.org/html/rfc3492#section-6.3 + * + * @param string $input + * + * @return string + */ + private static function punycodeEncode($input) + { + $n = self::INITIAL_N; + $delta = 0; + $out = 0; + $bias = self::INITIAL_BIAS; + $inputLength = 0; + $output = ''; + $iter = self::utf8Decode($input); + + foreach ($iter as $codePoint) { + ++$inputLength; + + if ($codePoint < 0x80) { + $output .= \chr($codePoint); + ++$out; + } + } + + $h = $out; + $b = $out; + + if ($b > 0) { + $output .= self::DELIMITER; + ++$out; + } + + while ($h < $inputLength) { + $m = self::MAX_INT; + + foreach ($iter as $codePoint) { + if ($codePoint >= $n && $codePoint < $m) { + $m = $codePoint; + } + } + + if ($m - $n > intdiv(self::MAX_INT - $delta, $h + 1)) { + throw new Exception('Integer overflow'); + } + + $delta += ($m - $n) * ($h + 1); + $n = $m; + + foreach ($iter as $codePoint) { + if ($codePoint < $n && 0 === ++$delta) { + throw new Exception('Integer overflow'); + } + + if ($codePoint === $n) { + $q = $delta; + + for ($k = self::BASE; /* no condition */; $k += self::BASE) { + if ($k <= $bias) { + $t = self::TMIN; + } elseif ($k >= $bias + self::TMAX) { + $t = self::TMAX; + } else { + $t = $k - $bias; + } + + if ($q < $t) { + break; + } + + $qMinusT = $q - $t; + $baseMinusT = self::BASE - $t; + $output .= self::encodeDigit($t + ($qMinusT) % ($baseMinusT), false); + ++$out; + $q = intdiv($qMinusT, $baseMinusT); + } + + $output .= self::encodeDigit($q, false); + ++$out; + $bias = self::adaptBias($delta, $h + 1, $h === $b); + $delta = 0; + ++$h; + } + } + + ++$delta; + ++$n; + } + + return $output; + } + + /** + * @see https://tools.ietf.org/html/rfc3492#section-6.1 + * + * @param int $delta + * @param int $numPoints + * @param bool $firstTime + * + * @return int + */ + private static function adaptBias($delta, $numPoints, $firstTime) + { + // xxx >> 1 is a faster way of doing intdiv(xxx, 2) + $delta = $firstTime ? intdiv($delta, self::DAMP) : $delta >> 1; + $delta += intdiv($delta, $numPoints); + $k = 0; + + while ($delta > ((self::BASE - self::TMIN) * self::TMAX) >> 1) { + $delta = intdiv($delta, self::BASE - self::TMIN); + $k += self::BASE; + } + + return $k + intdiv((self::BASE - self::TMIN + 1) * $delta, $delta + self::SKEW); + } + + /** + * @param int $d + * @param bool $flag + * + * @return string + */ + private static function encodeDigit($d, $flag) + { + return \chr($d + 22 + 75 * ($d < 26 ? 1 : 0) - (($flag ? 1 : 0) << 5)); + } + + /** + * Takes a UTF-8 encoded string and converts it into a series of integer code points. Any + * invalid byte sequences will be replaced by a U+FFFD replacement code point. + * + * @see https://encoding.spec.whatwg.org/#utf-8-decoder + * + * @param string $input + * + * @return array + */ + private static function utf8Decode($input) + { + $bytesSeen = 0; + $bytesNeeded = 0; + $lowerBoundary = 0x80; + $upperBoundary = 0xBF; + $codePoint = 0; + $codePoints = array(); + $length = \strlen($input); + + for ($i = 0; $i < $length; ++$i) { + $byte = \ord($input[$i]); + + if (0 === $bytesNeeded) { + if ($byte >= 0x00 && $byte <= 0x7F) { + $codePoints[] = $byte; + + continue; + } + + if ($byte >= 0xC2 && $byte <= 0xDF) { + $bytesNeeded = 1; + $codePoint = $byte & 0x1F; + } elseif ($byte >= 0xE0 && $byte <= 0xEF) { + if (0xE0 === $byte) { + $lowerBoundary = 0xA0; + } elseif (0xED === $byte) { + $upperBoundary = 0x9F; + } + + $bytesNeeded = 2; + $codePoint = $byte & 0xF; + } elseif ($byte >= 0xF0 && $byte <= 0xF4) { + if (0xF0 === $byte) { + $lowerBoundary = 0x90; + } elseif (0xF4 === $byte) { + $upperBoundary = 0x8F; + } + + $bytesNeeded = 3; + $codePoint = $byte & 0x7; + } else { + $codePoints[] = 0xFFFD; + } + + continue; + } + + if ($byte < $lowerBoundary || $byte > $upperBoundary) { + $codePoint = 0; + $bytesNeeded = 0; + $bytesSeen = 0; + $lowerBoundary = 0x80; + $upperBoundary = 0xBF; + --$i; + $codePoints[] = 0xFFFD; + + continue; + } + + $lowerBoundary = 0x80; + $upperBoundary = 0xBF; + $codePoint = ($codePoint << 6) | ($byte & 0x3F); + + if (++$bytesSeen !== $bytesNeeded) { + continue; + } + + $codePoints[] = $codePoint; + $codePoint = 0; + $bytesNeeded = 0; + $bytesSeen = 0; + } + + // String unexpectedly ended, so append a U+FFFD code point. + if (0 !== $bytesNeeded) { + $codePoints[] = 0xFFFD; + } + + return $codePoints; + } + + /** + * @param int $codePoint + * @param bool $useSTD3ASCIIRules + * + * @return array{status: string, mapping?: string} + */ + private static function lookupCodePointStatus($codePoint, $useSTD3ASCIIRules) + { + if (!self::$mappingTableLoaded) { + self::$mappingTableLoaded = true; + self::$mapped = require __DIR__.'/Resources/unidata/mapped.php'; + self::$ignored = require __DIR__.'/Resources/unidata/ignored.php'; + self::$deviation = require __DIR__.'/Resources/unidata/deviation.php'; + self::$disallowed = require __DIR__.'/Resources/unidata/disallowed.php'; + self::$disallowed_STD3_mapped = require __DIR__.'/Resources/unidata/disallowed_STD3_mapped.php'; + self::$disallowed_STD3_valid = require __DIR__.'/Resources/unidata/disallowed_STD3_valid.php'; + } + + if (isset(self::$mapped[$codePoint])) { + return array('status' => 'mapped', 'mapping' => self::$mapped[$codePoint]); + } + + if (isset(self::$ignored[$codePoint])) { + return array('status' => 'ignored'); + } + + if (isset(self::$deviation[$codePoint])) { + return array('status' => 'deviation', 'mapping' => self::$deviation[$codePoint]); + } + + if (isset(self::$disallowed[$codePoint]) || DisallowedRanges::inRange($codePoint)) { + return array('status' => 'disallowed'); + } + + $isDisallowedMapped = isset(self::$disallowed_STD3_mapped[$codePoint]); + + if ($isDisallowedMapped || isset(self::$disallowed_STD3_valid[$codePoint])) { + $status = 'disallowed'; + + if (!$useSTD3ASCIIRules) { + $status = $isDisallowedMapped ? 'mapped' : 'valid'; + } + + if ($isDisallowedMapped) { + return array('status' => $status, 'mapping' => self::$disallowed_STD3_mapped[$codePoint]); + } + + return array('status' => $status); + } + + return array('status' => 'valid'); + } +} diff --git a/vendor/symfony/polyfill-intl-idn/Info.php b/vendor/symfony/polyfill-intl-idn/Info.php new file mode 100644 index 00000000..25c3582b --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Info.php @@ -0,0 +1,23 @@ + and Trevor Rowbotham + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Idn; + +/** + * @internal + */ +class Info +{ + public $bidiDomain = false; + public $errors = 0; + public $validBidiDomain = true; + public $transitionalDifferent = false; +} diff --git a/vendor/symfony/polyfill-intl-idn/LICENSE b/vendor/symfony/polyfill-intl-idn/LICENSE new file mode 100644 index 00000000..03c5e257 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier and Trevor Rowbotham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-idn/README.md b/vendor/symfony/polyfill-intl-idn/README.md new file mode 100644 index 00000000..2e75f2e5 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Intl: Idn +============================ + +This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php new file mode 100644 index 00000000..5bb70e48 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php @@ -0,0 +1,375 @@ += 128 && $codePoint <= 159) { + return true; + } + + if ($codePoint >= 2155 && $codePoint <= 2207) { + return true; + } + + if ($codePoint >= 3676 && $codePoint <= 3712) { + return true; + } + + if ($codePoint >= 3808 && $codePoint <= 3839) { + return true; + } + + if ($codePoint >= 4059 && $codePoint <= 4095) { + return true; + } + + if ($codePoint >= 4256 && $codePoint <= 4293) { + return true; + } + + if ($codePoint >= 6849 && $codePoint <= 6911) { + return true; + } + + if ($codePoint >= 11859 && $codePoint <= 11903) { + return true; + } + + if ($codePoint >= 42955 && $codePoint <= 42996) { + return true; + } + + if ($codePoint >= 55296 && $codePoint <= 57343) { + return true; + } + + if ($codePoint >= 57344 && $codePoint <= 63743) { + return true; + } + + if ($codePoint >= 64218 && $codePoint <= 64255) { + return true; + } + + if ($codePoint >= 64976 && $codePoint <= 65007) { + return true; + } + + if ($codePoint >= 65630 && $codePoint <= 65663) { + return true; + } + + if ($codePoint >= 65953 && $codePoint <= 65999) { + return true; + } + + if ($codePoint >= 66046 && $codePoint <= 66175) { + return true; + } + + if ($codePoint >= 66518 && $codePoint <= 66559) { + return true; + } + + if ($codePoint >= 66928 && $codePoint <= 67071) { + return true; + } + + if ($codePoint >= 67432 && $codePoint <= 67583) { + return true; + } + + if ($codePoint >= 67760 && $codePoint <= 67807) { + return true; + } + + if ($codePoint >= 67904 && $codePoint <= 67967) { + return true; + } + + if ($codePoint >= 68256 && $codePoint <= 68287) { + return true; + } + + if ($codePoint >= 68528 && $codePoint <= 68607) { + return true; + } + + if ($codePoint >= 68681 && $codePoint <= 68735) { + return true; + } + + if ($codePoint >= 68922 && $codePoint <= 69215) { + return true; + } + + if ($codePoint >= 69298 && $codePoint <= 69375) { + return true; + } + + if ($codePoint >= 69466 && $codePoint <= 69551) { + return true; + } + + if ($codePoint >= 70207 && $codePoint <= 70271) { + return true; + } + + if ($codePoint >= 70517 && $codePoint <= 70655) { + return true; + } + + if ($codePoint >= 70874 && $codePoint <= 71039) { + return true; + } + + if ($codePoint >= 71134 && $codePoint <= 71167) { + return true; + } + + if ($codePoint >= 71370 && $codePoint <= 71423) { + return true; + } + + if ($codePoint >= 71488 && $codePoint <= 71679) { + return true; + } + + if ($codePoint >= 71740 && $codePoint <= 71839) { + return true; + } + + if ($codePoint >= 72026 && $codePoint <= 72095) { + return true; + } + + if ($codePoint >= 72441 && $codePoint <= 72703) { + return true; + } + + if ($codePoint >= 72887 && $codePoint <= 72959) { + return true; + } + + if ($codePoint >= 73130 && $codePoint <= 73439) { + return true; + } + + if ($codePoint >= 73465 && $codePoint <= 73647) { + return true; + } + + if ($codePoint >= 74650 && $codePoint <= 74751) { + return true; + } + + if ($codePoint >= 75076 && $codePoint <= 77823) { + return true; + } + + if ($codePoint >= 78905 && $codePoint <= 82943) { + return true; + } + + if ($codePoint >= 83527 && $codePoint <= 92159) { + return true; + } + + if ($codePoint >= 92784 && $codePoint <= 92879) { + return true; + } + + if ($codePoint >= 93072 && $codePoint <= 93759) { + return true; + } + + if ($codePoint >= 93851 && $codePoint <= 93951) { + return true; + } + + if ($codePoint >= 94112 && $codePoint <= 94175) { + return true; + } + + if ($codePoint >= 101590 && $codePoint <= 101631) { + return true; + } + + if ($codePoint >= 101641 && $codePoint <= 110591) { + return true; + } + + if ($codePoint >= 110879 && $codePoint <= 110927) { + return true; + } + + if ($codePoint >= 111356 && $codePoint <= 113663) { + return true; + } + + if ($codePoint >= 113828 && $codePoint <= 118783) { + return true; + } + + if ($codePoint >= 119366 && $codePoint <= 119519) { + return true; + } + + if ($codePoint >= 119673 && $codePoint <= 119807) { + return true; + } + + if ($codePoint >= 121520 && $codePoint <= 122879) { + return true; + } + + if ($codePoint >= 122923 && $codePoint <= 123135) { + return true; + } + + if ($codePoint >= 123216 && $codePoint <= 123583) { + return true; + } + + if ($codePoint >= 123648 && $codePoint <= 124927) { + return true; + } + + if ($codePoint >= 125143 && $codePoint <= 125183) { + return true; + } + + if ($codePoint >= 125280 && $codePoint <= 126064) { + return true; + } + + if ($codePoint >= 126133 && $codePoint <= 126208) { + return true; + } + + if ($codePoint >= 126270 && $codePoint <= 126463) { + return true; + } + + if ($codePoint >= 126652 && $codePoint <= 126703) { + return true; + } + + if ($codePoint >= 126706 && $codePoint <= 126975) { + return true; + } + + if ($codePoint >= 127406 && $codePoint <= 127461) { + return true; + } + + if ($codePoint >= 127590 && $codePoint <= 127743) { + return true; + } + + if ($codePoint >= 129202 && $codePoint <= 129279) { + return true; + } + + if ($codePoint >= 129751 && $codePoint <= 129791) { + return true; + } + + if ($codePoint >= 129995 && $codePoint <= 130031) { + return true; + } + + if ($codePoint >= 130042 && $codePoint <= 131069) { + return true; + } + + if ($codePoint >= 173790 && $codePoint <= 173823) { + return true; + } + + if ($codePoint >= 191457 && $codePoint <= 194559) { + return true; + } + + if ($codePoint >= 195102 && $codePoint <= 196605) { + return true; + } + + if ($codePoint >= 201547 && $codePoint <= 262141) { + return true; + } + + if ($codePoint >= 262144 && $codePoint <= 327677) { + return true; + } + + if ($codePoint >= 327680 && $codePoint <= 393213) { + return true; + } + + if ($codePoint >= 393216 && $codePoint <= 458749) { + return true; + } + + if ($codePoint >= 458752 && $codePoint <= 524285) { + return true; + } + + if ($codePoint >= 524288 && $codePoint <= 589821) { + return true; + } + + if ($codePoint >= 589824 && $codePoint <= 655357) { + return true; + } + + if ($codePoint >= 655360 && $codePoint <= 720893) { + return true; + } + + if ($codePoint >= 720896 && $codePoint <= 786429) { + return true; + } + + if ($codePoint >= 786432 && $codePoint <= 851965) { + return true; + } + + if ($codePoint >= 851968 && $codePoint <= 917501) { + return true; + } + + if ($codePoint >= 917536 && $codePoint <= 917631) { + return true; + } + + if ($codePoint >= 917632 && $codePoint <= 917759) { + return true; + } + + if ($codePoint >= 918000 && $codePoint <= 983037) { + return true; + } + + if ($codePoint >= 983040 && $codePoint <= 1048573) { + return true; + } + + if ($codePoint >= 1048576 && $codePoint <= 1114109) { + return true; + } + + return false; + } +} diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php new file mode 100644 index 00000000..5c1c51dd --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php @@ -0,0 +1,24 @@ + 'ss', + 962 => 'σ', + 8204 => '', + 8205 => '', +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php new file mode 100644 index 00000000..25a5f564 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php @@ -0,0 +1,2638 @@ + true, + 889 => true, + 896 => true, + 897 => true, + 898 => true, + 899 => true, + 907 => true, + 909 => true, + 930 => true, + 1216 => true, + 1328 => true, + 1367 => true, + 1368 => true, + 1419 => true, + 1420 => true, + 1424 => true, + 1480 => true, + 1481 => true, + 1482 => true, + 1483 => true, + 1484 => true, + 1485 => true, + 1486 => true, + 1487 => true, + 1515 => true, + 1516 => true, + 1517 => true, + 1518 => true, + 1525 => true, + 1526 => true, + 1527 => true, + 1528 => true, + 1529 => true, + 1530 => true, + 1531 => true, + 1532 => true, + 1533 => true, + 1534 => true, + 1535 => true, + 1536 => true, + 1537 => true, + 1538 => true, + 1539 => true, + 1540 => true, + 1541 => true, + 1564 => true, + 1565 => true, + 1757 => true, + 1806 => true, + 1807 => true, + 1867 => true, + 1868 => true, + 1970 => true, + 1971 => true, + 1972 => true, + 1973 => true, + 1974 => true, + 1975 => true, + 1976 => true, + 1977 => true, + 1978 => true, + 1979 => true, + 1980 => true, + 1981 => true, + 1982 => true, + 1983 => true, + 2043 => true, + 2044 => true, + 2094 => true, + 2095 => true, + 2111 => true, + 2140 => true, + 2141 => true, + 2143 => true, + 2229 => true, + 2248 => true, + 2249 => true, + 2250 => true, + 2251 => true, + 2252 => true, + 2253 => true, + 2254 => true, + 2255 => true, + 2256 => true, + 2257 => true, + 2258 => true, + 2274 => true, + 2436 => true, + 2445 => true, + 2446 => true, + 2449 => true, + 2450 => true, + 2473 => true, + 2481 => true, + 2483 => true, + 2484 => true, + 2485 => true, + 2490 => true, + 2491 => true, + 2501 => true, + 2502 => true, + 2505 => true, + 2506 => true, + 2511 => true, + 2512 => true, + 2513 => true, + 2514 => true, + 2515 => true, + 2516 => true, + 2517 => true, + 2518 => true, + 2520 => true, + 2521 => true, + 2522 => true, + 2523 => true, + 2526 => true, + 2532 => true, + 2533 => true, + 2559 => true, + 2560 => true, + 2564 => true, + 2571 => true, + 2572 => true, + 2573 => true, + 2574 => true, + 2577 => true, + 2578 => true, + 2601 => true, + 2609 => true, + 2612 => true, + 2615 => true, + 2618 => true, + 2619 => true, + 2621 => true, + 2627 => true, + 2628 => true, + 2629 => true, + 2630 => true, + 2633 => true, + 2634 => true, + 2638 => true, + 2639 => true, + 2640 => true, + 2642 => true, + 2643 => true, + 2644 => true, + 2645 => true, + 2646 => true, + 2647 => true, + 2648 => true, + 2653 => true, + 2655 => true, + 2656 => true, + 2657 => true, + 2658 => true, + 2659 => true, + 2660 => true, + 2661 => true, + 2679 => true, + 2680 => true, + 2681 => true, + 2682 => true, + 2683 => true, + 2684 => true, + 2685 => true, + 2686 => true, + 2687 => true, + 2688 => true, + 2692 => true, + 2702 => true, + 2706 => true, + 2729 => true, + 2737 => true, + 2740 => true, + 2746 => true, + 2747 => true, + 2758 => true, + 2762 => true, + 2766 => true, + 2767 => true, + 2769 => true, + 2770 => true, + 2771 => true, + 2772 => true, + 2773 => true, + 2774 => true, + 2775 => true, + 2776 => true, + 2777 => true, + 2778 => true, + 2779 => true, + 2780 => true, + 2781 => true, + 2782 => true, + 2783 => true, + 2788 => true, + 2789 => true, + 2802 => true, + 2803 => true, + 2804 => true, + 2805 => true, + 2806 => true, + 2807 => true, + 2808 => true, + 2816 => true, + 2820 => true, + 2829 => true, + 2830 => true, + 2833 => true, + 2834 => true, + 2857 => true, + 2865 => true, + 2868 => true, + 2874 => true, + 2875 => true, + 2885 => true, + 2886 => true, + 2889 => true, + 2890 => true, + 2894 => true, + 2895 => true, + 2896 => true, + 2897 => true, + 2898 => true, + 2899 => true, + 2900 => true, + 2904 => true, + 2905 => true, + 2906 => true, + 2907 => true, + 2910 => true, + 2916 => true, + 2917 => true, + 2936 => true, + 2937 => true, + 2938 => true, + 2939 => true, + 2940 => true, + 2941 => true, + 2942 => true, + 2943 => true, + 2944 => true, + 2945 => true, + 2948 => true, + 2955 => true, + 2956 => true, + 2957 => true, + 2961 => true, + 2966 => true, + 2967 => true, + 2968 => true, + 2971 => true, + 2973 => true, + 2976 => true, + 2977 => true, + 2978 => true, + 2981 => true, + 2982 => true, + 2983 => true, + 2987 => true, + 2988 => true, + 2989 => true, + 3002 => true, + 3003 => true, + 3004 => true, + 3005 => true, + 3011 => true, + 3012 => true, + 3013 => true, + 3017 => true, + 3022 => true, + 3023 => true, + 3025 => true, + 3026 => true, + 3027 => true, + 3028 => true, + 3029 => true, + 3030 => true, + 3032 => true, + 3033 => true, + 3034 => true, + 3035 => true, + 3036 => true, + 3037 => true, + 3038 => true, + 3039 => true, + 3040 => true, + 3041 => true, + 3042 => true, + 3043 => true, + 3044 => true, + 3045 => true, + 3067 => true, + 3068 => true, + 3069 => true, + 3070 => true, + 3071 => true, + 3085 => true, + 3089 => true, + 3113 => true, + 3130 => true, + 3131 => true, + 3132 => true, + 3141 => true, + 3145 => true, + 3150 => true, + 3151 => true, + 3152 => true, + 3153 => true, + 3154 => true, + 3155 => true, + 3156 => true, + 3159 => true, + 3163 => true, + 3164 => true, + 3165 => true, + 3166 => true, + 3167 => true, + 3172 => true, + 3173 => true, + 3184 => true, + 3185 => true, + 3186 => true, + 3187 => true, + 3188 => true, + 3189 => true, + 3190 => true, + 3213 => true, + 3217 => true, + 3241 => true, + 3252 => true, + 3258 => true, + 3259 => true, + 3269 => true, + 3273 => true, + 3278 => true, + 3279 => true, + 3280 => true, + 3281 => true, + 3282 => true, + 3283 => true, + 3284 => true, + 3287 => true, + 3288 => true, + 3289 => true, + 3290 => true, + 3291 => true, + 3292 => true, + 3293 => true, + 3295 => true, + 3300 => true, + 3301 => true, + 3312 => true, + 3315 => true, + 3316 => true, + 3317 => true, + 3318 => true, + 3319 => true, + 3320 => true, + 3321 => true, + 3322 => true, + 3323 => true, + 3324 => true, + 3325 => true, + 3326 => true, + 3327 => true, + 3341 => true, + 3345 => true, + 3397 => true, + 3401 => true, + 3408 => true, + 3409 => true, + 3410 => true, + 3411 => true, + 3428 => true, + 3429 => true, + 3456 => true, + 3460 => true, + 3479 => true, + 3480 => true, + 3481 => true, + 3506 => true, + 3516 => true, + 3518 => true, + 3519 => true, + 3527 => true, + 3528 => true, + 3529 => true, + 3531 => true, + 3532 => true, + 3533 => true, + 3534 => true, + 3541 => true, + 3543 => true, + 3552 => true, + 3553 => true, + 3554 => true, + 3555 => true, + 3556 => true, + 3557 => true, + 3568 => true, + 3569 => true, + 3573 => true, + 3574 => true, + 3575 => true, + 3576 => true, + 3577 => true, + 3578 => true, + 3579 => true, + 3580 => true, + 3581 => true, + 3582 => true, + 3583 => true, + 3584 => true, + 3643 => true, + 3644 => true, + 3645 => true, + 3646 => true, + 3715 => true, + 3717 => true, + 3723 => true, + 3748 => true, + 3750 => true, + 3774 => true, + 3775 => true, + 3781 => true, + 3783 => true, + 3790 => true, + 3791 => true, + 3802 => true, + 3803 => true, + 3912 => true, + 3949 => true, + 3950 => true, + 3951 => true, + 3952 => true, + 3992 => true, + 4029 => true, + 4045 => true, + 4294 => true, + 4296 => true, + 4297 => true, + 4298 => true, + 4299 => true, + 4300 => true, + 4302 => true, + 4303 => true, + 4447 => true, + 4448 => true, + 4681 => true, + 4686 => true, + 4687 => true, + 4695 => true, + 4697 => true, + 4702 => true, + 4703 => true, + 4745 => true, + 4750 => true, + 4751 => true, + 4785 => true, + 4790 => true, + 4791 => true, + 4799 => true, + 4801 => true, + 4806 => true, + 4807 => true, + 4823 => true, + 4881 => true, + 4886 => true, + 4887 => true, + 4955 => true, + 4956 => true, + 4989 => true, + 4990 => true, + 4991 => true, + 5018 => true, + 5019 => true, + 5020 => true, + 5021 => true, + 5022 => true, + 5023 => true, + 5110 => true, + 5111 => true, + 5118 => true, + 5119 => true, + 5760 => true, + 5789 => true, + 5790 => true, + 5791 => true, + 5881 => true, + 5882 => true, + 5883 => true, + 5884 => true, + 5885 => true, + 5886 => true, + 5887 => true, + 5901 => true, + 5909 => true, + 5910 => true, + 5911 => true, + 5912 => true, + 5913 => true, + 5914 => true, + 5915 => true, + 5916 => true, + 5917 => true, + 5918 => true, + 5919 => true, + 5943 => true, + 5944 => true, + 5945 => true, + 5946 => true, + 5947 => true, + 5948 => true, + 5949 => true, + 5950 => true, + 5951 => true, + 5972 => true, + 5973 => true, + 5974 => true, + 5975 => true, + 5976 => true, + 5977 => true, + 5978 => true, + 5979 => true, + 5980 => true, + 5981 => true, + 5982 => true, + 5983 => true, + 5997 => true, + 6001 => true, + 6004 => true, + 6005 => true, + 6006 => true, + 6007 => true, + 6008 => true, + 6009 => true, + 6010 => true, + 6011 => true, + 6012 => true, + 6013 => true, + 6014 => true, + 6015 => true, + 6068 => true, + 6069 => true, + 6110 => true, + 6111 => true, + 6122 => true, + 6123 => true, + 6124 => true, + 6125 => true, + 6126 => true, + 6127 => true, + 6138 => true, + 6139 => true, + 6140 => true, + 6141 => true, + 6142 => true, + 6143 => true, + 6150 => true, + 6158 => true, + 6159 => true, + 6170 => true, + 6171 => true, + 6172 => true, + 6173 => true, + 6174 => true, + 6175 => true, + 6265 => true, + 6266 => true, + 6267 => true, + 6268 => true, + 6269 => true, + 6270 => true, + 6271 => true, + 6315 => true, + 6316 => true, + 6317 => true, + 6318 => true, + 6319 => true, + 6390 => true, + 6391 => true, + 6392 => true, + 6393 => true, + 6394 => true, + 6395 => true, + 6396 => true, + 6397 => true, + 6398 => true, + 6399 => true, + 6431 => true, + 6444 => true, + 6445 => true, + 6446 => true, + 6447 => true, + 6460 => true, + 6461 => true, + 6462 => true, + 6463 => true, + 6465 => true, + 6466 => true, + 6467 => true, + 6510 => true, + 6511 => true, + 6517 => true, + 6518 => true, + 6519 => true, + 6520 => true, + 6521 => true, + 6522 => true, + 6523 => true, + 6524 => true, + 6525 => true, + 6526 => true, + 6527 => true, + 6572 => true, + 6573 => true, + 6574 => true, + 6575 => true, + 6602 => true, + 6603 => true, + 6604 => true, + 6605 => true, + 6606 => true, + 6607 => true, + 6619 => true, + 6620 => true, + 6621 => true, + 6684 => true, + 6685 => true, + 6751 => true, + 6781 => true, + 6782 => true, + 6794 => true, + 6795 => true, + 6796 => true, + 6797 => true, + 6798 => true, + 6799 => true, + 6810 => true, + 6811 => true, + 6812 => true, + 6813 => true, + 6814 => true, + 6815 => true, + 6830 => true, + 6831 => true, + 6988 => true, + 6989 => true, + 6990 => true, + 6991 => true, + 7037 => true, + 7038 => true, + 7039 => true, + 7156 => true, + 7157 => true, + 7158 => true, + 7159 => true, + 7160 => true, + 7161 => true, + 7162 => true, + 7163 => true, + 7224 => true, + 7225 => true, + 7226 => true, + 7242 => true, + 7243 => true, + 7244 => true, + 7305 => true, + 7306 => true, + 7307 => true, + 7308 => true, + 7309 => true, + 7310 => true, + 7311 => true, + 7355 => true, + 7356 => true, + 7368 => true, + 7369 => true, + 7370 => true, + 7371 => true, + 7372 => true, + 7373 => true, + 7374 => true, + 7375 => true, + 7419 => true, + 7420 => true, + 7421 => true, + 7422 => true, + 7423 => true, + 7674 => true, + 7958 => true, + 7959 => true, + 7966 => true, + 7967 => true, + 8006 => true, + 8007 => true, + 8014 => true, + 8015 => true, + 8024 => true, + 8026 => true, + 8028 => true, + 8030 => true, + 8062 => true, + 8063 => true, + 8117 => true, + 8133 => true, + 8148 => true, + 8149 => true, + 8156 => true, + 8176 => true, + 8177 => true, + 8181 => true, + 8191 => true, + 8206 => true, + 8207 => true, + 8228 => true, + 8229 => true, + 8230 => true, + 8232 => true, + 8233 => true, + 8234 => true, + 8235 => true, + 8236 => true, + 8237 => true, + 8238 => true, + 8289 => true, + 8290 => true, + 8291 => true, + 8293 => true, + 8294 => true, + 8295 => true, + 8296 => true, + 8297 => true, + 8298 => true, + 8299 => true, + 8300 => true, + 8301 => true, + 8302 => true, + 8303 => true, + 8306 => true, + 8307 => true, + 8335 => true, + 8349 => true, + 8350 => true, + 8351 => true, + 8384 => true, + 8385 => true, + 8386 => true, + 8387 => true, + 8388 => true, + 8389 => true, + 8390 => true, + 8391 => true, + 8392 => true, + 8393 => true, + 8394 => true, + 8395 => true, + 8396 => true, + 8397 => true, + 8398 => true, + 8399 => true, + 8433 => true, + 8434 => true, + 8435 => true, + 8436 => true, + 8437 => true, + 8438 => true, + 8439 => true, + 8440 => true, + 8441 => true, + 8442 => true, + 8443 => true, + 8444 => true, + 8445 => true, + 8446 => true, + 8447 => true, + 8498 => true, + 8579 => true, + 8588 => true, + 8589 => true, + 8590 => true, + 8591 => true, + 9255 => true, + 9256 => true, + 9257 => true, + 9258 => true, + 9259 => true, + 9260 => true, + 9261 => true, + 9262 => true, + 9263 => true, + 9264 => true, + 9265 => true, + 9266 => true, + 9267 => true, + 9268 => true, + 9269 => true, + 9270 => true, + 9271 => true, + 9272 => true, + 9273 => true, + 9274 => true, + 9275 => true, + 9276 => true, + 9277 => true, + 9278 => true, + 9279 => true, + 9291 => true, + 9292 => true, + 9293 => true, + 9294 => true, + 9295 => true, + 9296 => true, + 9297 => true, + 9298 => true, + 9299 => true, + 9300 => true, + 9301 => true, + 9302 => true, + 9303 => true, + 9304 => true, + 9305 => true, + 9306 => true, + 9307 => true, + 9308 => true, + 9309 => true, + 9310 => true, + 9311 => true, + 9352 => true, + 9353 => true, + 9354 => true, + 9355 => true, + 9356 => true, + 9357 => true, + 9358 => true, + 9359 => true, + 9360 => true, + 9361 => true, + 9362 => true, + 9363 => true, + 9364 => true, + 9365 => true, + 9366 => true, + 9367 => true, + 9368 => true, + 9369 => true, + 9370 => true, + 9371 => true, + 11124 => true, + 11125 => true, + 11158 => true, + 11311 => true, + 11359 => true, + 11508 => true, + 11509 => true, + 11510 => true, + 11511 => true, + 11512 => true, + 11558 => true, + 11560 => true, + 11561 => true, + 11562 => true, + 11563 => true, + 11564 => true, + 11566 => true, + 11567 => true, + 11624 => true, + 11625 => true, + 11626 => true, + 11627 => true, + 11628 => true, + 11629 => true, + 11630 => true, + 11633 => true, + 11634 => true, + 11635 => true, + 11636 => true, + 11637 => true, + 11638 => true, + 11639 => true, + 11640 => true, + 11641 => true, + 11642 => true, + 11643 => true, + 11644 => true, + 11645 => true, + 11646 => true, + 11671 => true, + 11672 => true, + 11673 => true, + 11674 => true, + 11675 => true, + 11676 => true, + 11677 => true, + 11678 => true, + 11679 => true, + 11687 => true, + 11695 => true, + 11703 => true, + 11711 => true, + 11719 => true, + 11727 => true, + 11735 => true, + 11743 => true, + 11930 => true, + 12020 => true, + 12021 => true, + 12022 => true, + 12023 => true, + 12024 => true, + 12025 => true, + 12026 => true, + 12027 => true, + 12028 => true, + 12029 => true, + 12030 => true, + 12031 => true, + 12246 => true, + 12247 => true, + 12248 => true, + 12249 => true, + 12250 => true, + 12251 => true, + 12252 => true, + 12253 => true, + 12254 => true, + 12255 => true, + 12256 => true, + 12257 => true, + 12258 => true, + 12259 => true, + 12260 => true, + 12261 => true, + 12262 => true, + 12263 => true, + 12264 => true, + 12265 => true, + 12266 => true, + 12267 => true, + 12268 => true, + 12269 => true, + 12270 => true, + 12271 => true, + 12272 => true, + 12273 => true, + 12274 => true, + 12275 => true, + 12276 => true, + 12277 => true, + 12278 => true, + 12279 => true, + 12280 => true, + 12281 => true, + 12282 => true, + 12283 => true, + 12284 => true, + 12285 => true, + 12286 => true, + 12287 => true, + 12352 => true, + 12439 => true, + 12440 => true, + 12544 => true, + 12545 => true, + 12546 => true, + 12547 => true, + 12548 => true, + 12592 => true, + 12644 => true, + 12687 => true, + 12772 => true, + 12773 => true, + 12774 => true, + 12775 => true, + 12776 => true, + 12777 => true, + 12778 => true, + 12779 => true, + 12780 => true, + 12781 => true, + 12782 => true, + 12783 => true, + 12831 => true, + 13250 => true, + 13255 => true, + 13272 => true, + 40957 => true, + 40958 => true, + 40959 => true, + 42125 => true, + 42126 => true, + 42127 => true, + 42183 => true, + 42184 => true, + 42185 => true, + 42186 => true, + 42187 => true, + 42188 => true, + 42189 => true, + 42190 => true, + 42191 => true, + 42540 => true, + 42541 => true, + 42542 => true, + 42543 => true, + 42544 => true, + 42545 => true, + 42546 => true, + 42547 => true, + 42548 => true, + 42549 => true, + 42550 => true, + 42551 => true, + 42552 => true, + 42553 => true, + 42554 => true, + 42555 => true, + 42556 => true, + 42557 => true, + 42558 => true, + 42559 => true, + 42744 => true, + 42745 => true, + 42746 => true, + 42747 => true, + 42748 => true, + 42749 => true, + 42750 => true, + 42751 => true, + 42944 => true, + 42945 => true, + 43053 => true, + 43054 => true, + 43055 => true, + 43066 => true, + 43067 => true, + 43068 => true, + 43069 => true, + 43070 => true, + 43071 => true, + 43128 => true, + 43129 => true, + 43130 => true, + 43131 => true, + 43132 => true, + 43133 => true, + 43134 => true, + 43135 => true, + 43206 => true, + 43207 => true, + 43208 => true, + 43209 => true, + 43210 => true, + 43211 => true, + 43212 => true, + 43213 => true, + 43226 => true, + 43227 => true, + 43228 => true, + 43229 => true, + 43230 => true, + 43231 => true, + 43348 => true, + 43349 => true, + 43350 => true, + 43351 => true, + 43352 => true, + 43353 => true, + 43354 => true, + 43355 => true, + 43356 => true, + 43357 => true, + 43358 => true, + 43389 => true, + 43390 => true, + 43391 => true, + 43470 => true, + 43482 => true, + 43483 => true, + 43484 => true, + 43485 => true, + 43519 => true, + 43575 => true, + 43576 => true, + 43577 => true, + 43578 => true, + 43579 => true, + 43580 => true, + 43581 => true, + 43582 => true, + 43583 => true, + 43598 => true, + 43599 => true, + 43610 => true, + 43611 => true, + 43715 => true, + 43716 => true, + 43717 => true, + 43718 => true, + 43719 => true, + 43720 => true, + 43721 => true, + 43722 => true, + 43723 => true, + 43724 => true, + 43725 => true, + 43726 => true, + 43727 => true, + 43728 => true, + 43729 => true, + 43730 => true, + 43731 => true, + 43732 => true, + 43733 => true, + 43734 => true, + 43735 => true, + 43736 => true, + 43737 => true, + 43738 => true, + 43767 => true, + 43768 => true, + 43769 => true, + 43770 => true, + 43771 => true, + 43772 => true, + 43773 => true, + 43774 => true, + 43775 => true, + 43776 => true, + 43783 => true, + 43784 => true, + 43791 => true, + 43792 => true, + 43799 => true, + 43800 => true, + 43801 => true, + 43802 => true, + 43803 => true, + 43804 => true, + 43805 => true, + 43806 => true, + 43807 => true, + 43815 => true, + 43823 => true, + 43884 => true, + 43885 => true, + 43886 => true, + 43887 => true, + 44014 => true, + 44015 => true, + 44026 => true, + 44027 => true, + 44028 => true, + 44029 => true, + 44030 => true, + 44031 => true, + 55204 => true, + 55205 => true, + 55206 => true, + 55207 => true, + 55208 => true, + 55209 => true, + 55210 => true, + 55211 => true, + 55212 => true, + 55213 => true, + 55214 => true, + 55215 => true, + 55239 => true, + 55240 => true, + 55241 => true, + 55242 => true, + 55292 => true, + 55293 => true, + 55294 => true, + 55295 => true, + 64110 => true, + 64111 => true, + 64263 => true, + 64264 => true, + 64265 => true, + 64266 => true, + 64267 => true, + 64268 => true, + 64269 => true, + 64270 => true, + 64271 => true, + 64272 => true, + 64273 => true, + 64274 => true, + 64280 => true, + 64281 => true, + 64282 => true, + 64283 => true, + 64284 => true, + 64311 => true, + 64317 => true, + 64319 => true, + 64322 => true, + 64325 => true, + 64450 => true, + 64451 => true, + 64452 => true, + 64453 => true, + 64454 => true, + 64455 => true, + 64456 => true, + 64457 => true, + 64458 => true, + 64459 => true, + 64460 => true, + 64461 => true, + 64462 => true, + 64463 => true, + 64464 => true, + 64465 => true, + 64466 => true, + 64832 => true, + 64833 => true, + 64834 => true, + 64835 => true, + 64836 => true, + 64837 => true, + 64838 => true, + 64839 => true, + 64840 => true, + 64841 => true, + 64842 => true, + 64843 => true, + 64844 => true, + 64845 => true, + 64846 => true, + 64847 => true, + 64912 => true, + 64913 => true, + 64968 => true, + 64969 => true, + 64970 => true, + 64971 => true, + 64972 => true, + 64973 => true, + 64974 => true, + 64975 => true, + 65022 => true, + 65023 => true, + 65042 => true, + 65049 => true, + 65050 => true, + 65051 => true, + 65052 => true, + 65053 => true, + 65054 => true, + 65055 => true, + 65072 => true, + 65106 => true, + 65107 => true, + 65127 => true, + 65132 => true, + 65133 => true, + 65134 => true, + 65135 => true, + 65141 => true, + 65277 => true, + 65278 => true, + 65280 => true, + 65440 => true, + 65471 => true, + 65472 => true, + 65473 => true, + 65480 => true, + 65481 => true, + 65488 => true, + 65489 => true, + 65496 => true, + 65497 => true, + 65501 => true, + 65502 => true, + 65503 => true, + 65511 => true, + 65519 => true, + 65520 => true, + 65521 => true, + 65522 => true, + 65523 => true, + 65524 => true, + 65525 => true, + 65526 => true, + 65527 => true, + 65528 => true, + 65529 => true, + 65530 => true, + 65531 => true, + 65532 => true, + 65533 => true, + 65534 => true, + 65535 => true, + 65548 => true, + 65575 => true, + 65595 => true, + 65598 => true, + 65614 => true, + 65615 => true, + 65787 => true, + 65788 => true, + 65789 => true, + 65790 => true, + 65791 => true, + 65795 => true, + 65796 => true, + 65797 => true, + 65798 => true, + 65844 => true, + 65845 => true, + 65846 => true, + 65935 => true, + 65949 => true, + 65950 => true, + 65951 => true, + 66205 => true, + 66206 => true, + 66207 => true, + 66257 => true, + 66258 => true, + 66259 => true, + 66260 => true, + 66261 => true, + 66262 => true, + 66263 => true, + 66264 => true, + 66265 => true, + 66266 => true, + 66267 => true, + 66268 => true, + 66269 => true, + 66270 => true, + 66271 => true, + 66300 => true, + 66301 => true, + 66302 => true, + 66303 => true, + 66340 => true, + 66341 => true, + 66342 => true, + 66343 => true, + 66344 => true, + 66345 => true, + 66346 => true, + 66347 => true, + 66348 => true, + 66379 => true, + 66380 => true, + 66381 => true, + 66382 => true, + 66383 => true, + 66427 => true, + 66428 => true, + 66429 => true, + 66430 => true, + 66431 => true, + 66462 => true, + 66500 => true, + 66501 => true, + 66502 => true, + 66503 => true, + 66718 => true, + 66719 => true, + 66730 => true, + 66731 => true, + 66732 => true, + 66733 => true, + 66734 => true, + 66735 => true, + 66772 => true, + 66773 => true, + 66774 => true, + 66775 => true, + 66812 => true, + 66813 => true, + 66814 => true, + 66815 => true, + 66856 => true, + 66857 => true, + 66858 => true, + 66859 => true, + 66860 => true, + 66861 => true, + 66862 => true, + 66863 => true, + 66916 => true, + 66917 => true, + 66918 => true, + 66919 => true, + 66920 => true, + 66921 => true, + 66922 => true, + 66923 => true, + 66924 => true, + 66925 => true, + 66926 => true, + 67383 => true, + 67384 => true, + 67385 => true, + 67386 => true, + 67387 => true, + 67388 => true, + 67389 => true, + 67390 => true, + 67391 => true, + 67414 => true, + 67415 => true, + 67416 => true, + 67417 => true, + 67418 => true, + 67419 => true, + 67420 => true, + 67421 => true, + 67422 => true, + 67423 => true, + 67590 => true, + 67591 => true, + 67593 => true, + 67638 => true, + 67641 => true, + 67642 => true, + 67643 => true, + 67645 => true, + 67646 => true, + 67670 => true, + 67743 => true, + 67744 => true, + 67745 => true, + 67746 => true, + 67747 => true, + 67748 => true, + 67749 => true, + 67750 => true, + 67827 => true, + 67830 => true, + 67831 => true, + 67832 => true, + 67833 => true, + 67834 => true, + 67868 => true, + 67869 => true, + 67870 => true, + 67898 => true, + 67899 => true, + 67900 => true, + 67901 => true, + 67902 => true, + 68024 => true, + 68025 => true, + 68026 => true, + 68027 => true, + 68048 => true, + 68049 => true, + 68100 => true, + 68103 => true, + 68104 => true, + 68105 => true, + 68106 => true, + 68107 => true, + 68116 => true, + 68120 => true, + 68150 => true, + 68151 => true, + 68155 => true, + 68156 => true, + 68157 => true, + 68158 => true, + 68169 => true, + 68170 => true, + 68171 => true, + 68172 => true, + 68173 => true, + 68174 => true, + 68175 => true, + 68185 => true, + 68186 => true, + 68187 => true, + 68188 => true, + 68189 => true, + 68190 => true, + 68191 => true, + 68327 => true, + 68328 => true, + 68329 => true, + 68330 => true, + 68343 => true, + 68344 => true, + 68345 => true, + 68346 => true, + 68347 => true, + 68348 => true, + 68349 => true, + 68350 => true, + 68351 => true, + 68406 => true, + 68407 => true, + 68408 => true, + 68438 => true, + 68439 => true, + 68467 => true, + 68468 => true, + 68469 => true, + 68470 => true, + 68471 => true, + 68498 => true, + 68499 => true, + 68500 => true, + 68501 => true, + 68502 => true, + 68503 => true, + 68504 => true, + 68509 => true, + 68510 => true, + 68511 => true, + 68512 => true, + 68513 => true, + 68514 => true, + 68515 => true, + 68516 => true, + 68517 => true, + 68518 => true, + 68519 => true, + 68520 => true, + 68787 => true, + 68788 => true, + 68789 => true, + 68790 => true, + 68791 => true, + 68792 => true, + 68793 => true, + 68794 => true, + 68795 => true, + 68796 => true, + 68797 => true, + 68798 => true, + 68799 => true, + 68851 => true, + 68852 => true, + 68853 => true, + 68854 => true, + 68855 => true, + 68856 => true, + 68857 => true, + 68904 => true, + 68905 => true, + 68906 => true, + 68907 => true, + 68908 => true, + 68909 => true, + 68910 => true, + 68911 => true, + 69247 => true, + 69290 => true, + 69294 => true, + 69295 => true, + 69416 => true, + 69417 => true, + 69418 => true, + 69419 => true, + 69420 => true, + 69421 => true, + 69422 => true, + 69423 => true, + 69580 => true, + 69581 => true, + 69582 => true, + 69583 => true, + 69584 => true, + 69585 => true, + 69586 => true, + 69587 => true, + 69588 => true, + 69589 => true, + 69590 => true, + 69591 => true, + 69592 => true, + 69593 => true, + 69594 => true, + 69595 => true, + 69596 => true, + 69597 => true, + 69598 => true, + 69599 => true, + 69623 => true, + 69624 => true, + 69625 => true, + 69626 => true, + 69627 => true, + 69628 => true, + 69629 => true, + 69630 => true, + 69631 => true, + 69710 => true, + 69711 => true, + 69712 => true, + 69713 => true, + 69744 => true, + 69745 => true, + 69746 => true, + 69747 => true, + 69748 => true, + 69749 => true, + 69750 => true, + 69751 => true, + 69752 => true, + 69753 => true, + 69754 => true, + 69755 => true, + 69756 => true, + 69757 => true, + 69758 => true, + 69821 => true, + 69826 => true, + 69827 => true, + 69828 => true, + 69829 => true, + 69830 => true, + 69831 => true, + 69832 => true, + 69833 => true, + 69834 => true, + 69835 => true, + 69836 => true, + 69837 => true, + 69838 => true, + 69839 => true, + 69865 => true, + 69866 => true, + 69867 => true, + 69868 => true, + 69869 => true, + 69870 => true, + 69871 => true, + 69882 => true, + 69883 => true, + 69884 => true, + 69885 => true, + 69886 => true, + 69887 => true, + 69941 => true, + 69960 => true, + 69961 => true, + 69962 => true, + 69963 => true, + 69964 => true, + 69965 => true, + 69966 => true, + 69967 => true, + 70007 => true, + 70008 => true, + 70009 => true, + 70010 => true, + 70011 => true, + 70012 => true, + 70013 => true, + 70014 => true, + 70015 => true, + 70112 => true, + 70133 => true, + 70134 => true, + 70135 => true, + 70136 => true, + 70137 => true, + 70138 => true, + 70139 => true, + 70140 => true, + 70141 => true, + 70142 => true, + 70143 => true, + 70162 => true, + 70279 => true, + 70281 => true, + 70286 => true, + 70302 => true, + 70314 => true, + 70315 => true, + 70316 => true, + 70317 => true, + 70318 => true, + 70319 => true, + 70379 => true, + 70380 => true, + 70381 => true, + 70382 => true, + 70383 => true, + 70394 => true, + 70395 => true, + 70396 => true, + 70397 => true, + 70398 => true, + 70399 => true, + 70404 => true, + 70413 => true, + 70414 => true, + 70417 => true, + 70418 => true, + 70441 => true, + 70449 => true, + 70452 => true, + 70458 => true, + 70469 => true, + 70470 => true, + 70473 => true, + 70474 => true, + 70478 => true, + 70479 => true, + 70481 => true, + 70482 => true, + 70483 => true, + 70484 => true, + 70485 => true, + 70486 => true, + 70488 => true, + 70489 => true, + 70490 => true, + 70491 => true, + 70492 => true, + 70500 => true, + 70501 => true, + 70509 => true, + 70510 => true, + 70511 => true, + 70748 => true, + 70754 => true, + 70755 => true, + 70756 => true, + 70757 => true, + 70758 => true, + 70759 => true, + 70760 => true, + 70761 => true, + 70762 => true, + 70763 => true, + 70764 => true, + 70765 => true, + 70766 => true, + 70767 => true, + 70768 => true, + 70769 => true, + 70770 => true, + 70771 => true, + 70772 => true, + 70773 => true, + 70774 => true, + 70775 => true, + 70776 => true, + 70777 => true, + 70778 => true, + 70779 => true, + 70780 => true, + 70781 => true, + 70782 => true, + 70783 => true, + 70856 => true, + 70857 => true, + 70858 => true, + 70859 => true, + 70860 => true, + 70861 => true, + 70862 => true, + 70863 => true, + 71094 => true, + 71095 => true, + 71237 => true, + 71238 => true, + 71239 => true, + 71240 => true, + 71241 => true, + 71242 => true, + 71243 => true, + 71244 => true, + 71245 => true, + 71246 => true, + 71247 => true, + 71258 => true, + 71259 => true, + 71260 => true, + 71261 => true, + 71262 => true, + 71263 => true, + 71277 => true, + 71278 => true, + 71279 => true, + 71280 => true, + 71281 => true, + 71282 => true, + 71283 => true, + 71284 => true, + 71285 => true, + 71286 => true, + 71287 => true, + 71288 => true, + 71289 => true, + 71290 => true, + 71291 => true, + 71292 => true, + 71293 => true, + 71294 => true, + 71295 => true, + 71353 => true, + 71354 => true, + 71355 => true, + 71356 => true, + 71357 => true, + 71358 => true, + 71359 => true, + 71451 => true, + 71452 => true, + 71468 => true, + 71469 => true, + 71470 => true, + 71471 => true, + 71923 => true, + 71924 => true, + 71925 => true, + 71926 => true, + 71927 => true, + 71928 => true, + 71929 => true, + 71930 => true, + 71931 => true, + 71932 => true, + 71933 => true, + 71934 => true, + 71943 => true, + 71944 => true, + 71946 => true, + 71947 => true, + 71956 => true, + 71959 => true, + 71990 => true, + 71993 => true, + 71994 => true, + 72007 => true, + 72008 => true, + 72009 => true, + 72010 => true, + 72011 => true, + 72012 => true, + 72013 => true, + 72014 => true, + 72015 => true, + 72104 => true, + 72105 => true, + 72152 => true, + 72153 => true, + 72165 => true, + 72166 => true, + 72167 => true, + 72168 => true, + 72169 => true, + 72170 => true, + 72171 => true, + 72172 => true, + 72173 => true, + 72174 => true, + 72175 => true, + 72176 => true, + 72177 => true, + 72178 => true, + 72179 => true, + 72180 => true, + 72181 => true, + 72182 => true, + 72183 => true, + 72184 => true, + 72185 => true, + 72186 => true, + 72187 => true, + 72188 => true, + 72189 => true, + 72190 => true, + 72191 => true, + 72264 => true, + 72265 => true, + 72266 => true, + 72267 => true, + 72268 => true, + 72269 => true, + 72270 => true, + 72271 => true, + 72355 => true, + 72356 => true, + 72357 => true, + 72358 => true, + 72359 => true, + 72360 => true, + 72361 => true, + 72362 => true, + 72363 => true, + 72364 => true, + 72365 => true, + 72366 => true, + 72367 => true, + 72368 => true, + 72369 => true, + 72370 => true, + 72371 => true, + 72372 => true, + 72373 => true, + 72374 => true, + 72375 => true, + 72376 => true, + 72377 => true, + 72378 => true, + 72379 => true, + 72380 => true, + 72381 => true, + 72382 => true, + 72383 => true, + 72713 => true, + 72759 => true, + 72774 => true, + 72775 => true, + 72776 => true, + 72777 => true, + 72778 => true, + 72779 => true, + 72780 => true, + 72781 => true, + 72782 => true, + 72783 => true, + 72813 => true, + 72814 => true, + 72815 => true, + 72848 => true, + 72849 => true, + 72872 => true, + 72967 => true, + 72970 => true, + 73015 => true, + 73016 => true, + 73017 => true, + 73019 => true, + 73022 => true, + 73032 => true, + 73033 => true, + 73034 => true, + 73035 => true, + 73036 => true, + 73037 => true, + 73038 => true, + 73039 => true, + 73050 => true, + 73051 => true, + 73052 => true, + 73053 => true, + 73054 => true, + 73055 => true, + 73062 => true, + 73065 => true, + 73103 => true, + 73106 => true, + 73113 => true, + 73114 => true, + 73115 => true, + 73116 => true, + 73117 => true, + 73118 => true, + 73119 => true, + 73649 => true, + 73650 => true, + 73651 => true, + 73652 => true, + 73653 => true, + 73654 => true, + 73655 => true, + 73656 => true, + 73657 => true, + 73658 => true, + 73659 => true, + 73660 => true, + 73661 => true, + 73662 => true, + 73663 => true, + 73714 => true, + 73715 => true, + 73716 => true, + 73717 => true, + 73718 => true, + 73719 => true, + 73720 => true, + 73721 => true, + 73722 => true, + 73723 => true, + 73724 => true, + 73725 => true, + 73726 => true, + 74863 => true, + 74869 => true, + 74870 => true, + 74871 => true, + 74872 => true, + 74873 => true, + 74874 => true, + 74875 => true, + 74876 => true, + 74877 => true, + 74878 => true, + 74879 => true, + 78895 => true, + 78896 => true, + 78897 => true, + 78898 => true, + 78899 => true, + 78900 => true, + 78901 => true, + 78902 => true, + 78903 => true, + 78904 => true, + 92729 => true, + 92730 => true, + 92731 => true, + 92732 => true, + 92733 => true, + 92734 => true, + 92735 => true, + 92767 => true, + 92778 => true, + 92779 => true, + 92780 => true, + 92781 => true, + 92910 => true, + 92911 => true, + 92918 => true, + 92919 => true, + 92920 => true, + 92921 => true, + 92922 => true, + 92923 => true, + 92924 => true, + 92925 => true, + 92926 => true, + 92927 => true, + 92998 => true, + 92999 => true, + 93000 => true, + 93001 => true, + 93002 => true, + 93003 => true, + 93004 => true, + 93005 => true, + 93006 => true, + 93007 => true, + 93018 => true, + 93026 => true, + 93048 => true, + 93049 => true, + 93050 => true, + 93051 => true, + 93052 => true, + 94027 => true, + 94028 => true, + 94029 => true, + 94030 => true, + 94088 => true, + 94089 => true, + 94090 => true, + 94091 => true, + 94092 => true, + 94093 => true, + 94094 => true, + 94181 => true, + 94182 => true, + 94183 => true, + 94184 => true, + 94185 => true, + 94186 => true, + 94187 => true, + 94188 => true, + 94189 => true, + 94190 => true, + 94191 => true, + 94194 => true, + 94195 => true, + 94196 => true, + 94197 => true, + 94198 => true, + 94199 => true, + 94200 => true, + 94201 => true, + 94202 => true, + 94203 => true, + 94204 => true, + 94205 => true, + 94206 => true, + 94207 => true, + 100344 => true, + 100345 => true, + 100346 => true, + 100347 => true, + 100348 => true, + 100349 => true, + 100350 => true, + 100351 => true, + 110931 => true, + 110932 => true, + 110933 => true, + 110934 => true, + 110935 => true, + 110936 => true, + 110937 => true, + 110938 => true, + 110939 => true, + 110940 => true, + 110941 => true, + 110942 => true, + 110943 => true, + 110944 => true, + 110945 => true, + 110946 => true, + 110947 => true, + 110952 => true, + 110953 => true, + 110954 => true, + 110955 => true, + 110956 => true, + 110957 => true, + 110958 => true, + 110959 => true, + 113771 => true, + 113772 => true, + 113773 => true, + 113774 => true, + 113775 => true, + 113789 => true, + 113790 => true, + 113791 => true, + 113801 => true, + 113802 => true, + 113803 => true, + 113804 => true, + 113805 => true, + 113806 => true, + 113807 => true, + 113818 => true, + 113819 => true, + 119030 => true, + 119031 => true, + 119032 => true, + 119033 => true, + 119034 => true, + 119035 => true, + 119036 => true, + 119037 => true, + 119038 => true, + 119039 => true, + 119079 => true, + 119080 => true, + 119155 => true, + 119156 => true, + 119157 => true, + 119158 => true, + 119159 => true, + 119160 => true, + 119161 => true, + 119162 => true, + 119273 => true, + 119274 => true, + 119275 => true, + 119276 => true, + 119277 => true, + 119278 => true, + 119279 => true, + 119280 => true, + 119281 => true, + 119282 => true, + 119283 => true, + 119284 => true, + 119285 => true, + 119286 => true, + 119287 => true, + 119288 => true, + 119289 => true, + 119290 => true, + 119291 => true, + 119292 => true, + 119293 => true, + 119294 => true, + 119295 => true, + 119540 => true, + 119541 => true, + 119542 => true, + 119543 => true, + 119544 => true, + 119545 => true, + 119546 => true, + 119547 => true, + 119548 => true, + 119549 => true, + 119550 => true, + 119551 => true, + 119639 => true, + 119640 => true, + 119641 => true, + 119642 => true, + 119643 => true, + 119644 => true, + 119645 => true, + 119646 => true, + 119647 => true, + 119893 => true, + 119965 => true, + 119968 => true, + 119969 => true, + 119971 => true, + 119972 => true, + 119975 => true, + 119976 => true, + 119981 => true, + 119994 => true, + 119996 => true, + 120004 => true, + 120070 => true, + 120075 => true, + 120076 => true, + 120085 => true, + 120093 => true, + 120122 => true, + 120127 => true, + 120133 => true, + 120135 => true, + 120136 => true, + 120137 => true, + 120145 => true, + 120486 => true, + 120487 => true, + 120780 => true, + 120781 => true, + 121484 => true, + 121485 => true, + 121486 => true, + 121487 => true, + 121488 => true, + 121489 => true, + 121490 => true, + 121491 => true, + 121492 => true, + 121493 => true, + 121494 => true, + 121495 => true, + 121496 => true, + 121497 => true, + 121498 => true, + 121504 => true, + 122887 => true, + 122905 => true, + 122906 => true, + 122914 => true, + 122917 => true, + 123181 => true, + 123182 => true, + 123183 => true, + 123198 => true, + 123199 => true, + 123210 => true, + 123211 => true, + 123212 => true, + 123213 => true, + 123642 => true, + 123643 => true, + 123644 => true, + 123645 => true, + 123646 => true, + 125125 => true, + 125126 => true, + 125260 => true, + 125261 => true, + 125262 => true, + 125263 => true, + 125274 => true, + 125275 => true, + 125276 => true, + 125277 => true, + 126468 => true, + 126496 => true, + 126499 => true, + 126501 => true, + 126502 => true, + 126504 => true, + 126515 => true, + 126520 => true, + 126522 => true, + 126524 => true, + 126525 => true, + 126526 => true, + 126527 => true, + 126528 => true, + 126529 => true, + 126531 => true, + 126532 => true, + 126533 => true, + 126534 => true, + 126536 => true, + 126538 => true, + 126540 => true, + 126544 => true, + 126547 => true, + 126549 => true, + 126550 => true, + 126552 => true, + 126554 => true, + 126556 => true, + 126558 => true, + 126560 => true, + 126563 => true, + 126565 => true, + 126566 => true, + 126571 => true, + 126579 => true, + 126584 => true, + 126589 => true, + 126591 => true, + 126602 => true, + 126620 => true, + 126621 => true, + 126622 => true, + 126623 => true, + 126624 => true, + 126628 => true, + 126634 => true, + 127020 => true, + 127021 => true, + 127022 => true, + 127023 => true, + 127124 => true, + 127125 => true, + 127126 => true, + 127127 => true, + 127128 => true, + 127129 => true, + 127130 => true, + 127131 => true, + 127132 => true, + 127133 => true, + 127134 => true, + 127135 => true, + 127151 => true, + 127152 => true, + 127168 => true, + 127184 => true, + 127222 => true, + 127223 => true, + 127224 => true, + 127225 => true, + 127226 => true, + 127227 => true, + 127228 => true, + 127229 => true, + 127230 => true, + 127231 => true, + 127232 => true, + 127491 => true, + 127492 => true, + 127493 => true, + 127494 => true, + 127495 => true, + 127496 => true, + 127497 => true, + 127498 => true, + 127499 => true, + 127500 => true, + 127501 => true, + 127502 => true, + 127503 => true, + 127548 => true, + 127549 => true, + 127550 => true, + 127551 => true, + 127561 => true, + 127562 => true, + 127563 => true, + 127564 => true, + 127565 => true, + 127566 => true, + 127567 => true, + 127570 => true, + 127571 => true, + 127572 => true, + 127573 => true, + 127574 => true, + 127575 => true, + 127576 => true, + 127577 => true, + 127578 => true, + 127579 => true, + 127580 => true, + 127581 => true, + 127582 => true, + 127583 => true, + 128728 => true, + 128729 => true, + 128730 => true, + 128731 => true, + 128732 => true, + 128733 => true, + 128734 => true, + 128735 => true, + 128749 => true, + 128750 => true, + 128751 => true, + 128765 => true, + 128766 => true, + 128767 => true, + 128884 => true, + 128885 => true, + 128886 => true, + 128887 => true, + 128888 => true, + 128889 => true, + 128890 => true, + 128891 => true, + 128892 => true, + 128893 => true, + 128894 => true, + 128895 => true, + 128985 => true, + 128986 => true, + 128987 => true, + 128988 => true, + 128989 => true, + 128990 => true, + 128991 => true, + 129004 => true, + 129005 => true, + 129006 => true, + 129007 => true, + 129008 => true, + 129009 => true, + 129010 => true, + 129011 => true, + 129012 => true, + 129013 => true, + 129014 => true, + 129015 => true, + 129016 => true, + 129017 => true, + 129018 => true, + 129019 => true, + 129020 => true, + 129021 => true, + 129022 => true, + 129023 => true, + 129036 => true, + 129037 => true, + 129038 => true, + 129039 => true, + 129096 => true, + 129097 => true, + 129098 => true, + 129099 => true, + 129100 => true, + 129101 => true, + 129102 => true, + 129103 => true, + 129114 => true, + 129115 => true, + 129116 => true, + 129117 => true, + 129118 => true, + 129119 => true, + 129160 => true, + 129161 => true, + 129162 => true, + 129163 => true, + 129164 => true, + 129165 => true, + 129166 => true, + 129167 => true, + 129198 => true, + 129199 => true, + 129401 => true, + 129484 => true, + 129620 => true, + 129621 => true, + 129622 => true, + 129623 => true, + 129624 => true, + 129625 => true, + 129626 => true, + 129627 => true, + 129628 => true, + 129629 => true, + 129630 => true, + 129631 => true, + 129646 => true, + 129647 => true, + 129653 => true, + 129654 => true, + 129655 => true, + 129659 => true, + 129660 => true, + 129661 => true, + 129662 => true, + 129663 => true, + 129671 => true, + 129672 => true, + 129673 => true, + 129674 => true, + 129675 => true, + 129676 => true, + 129677 => true, + 129678 => true, + 129679 => true, + 129705 => true, + 129706 => true, + 129707 => true, + 129708 => true, + 129709 => true, + 129710 => true, + 129711 => true, + 129719 => true, + 129720 => true, + 129721 => true, + 129722 => true, + 129723 => true, + 129724 => true, + 129725 => true, + 129726 => true, + 129727 => true, + 129731 => true, + 129732 => true, + 129733 => true, + 129734 => true, + 129735 => true, + 129736 => true, + 129737 => true, + 129738 => true, + 129739 => true, + 129740 => true, + 129741 => true, + 129742 => true, + 129743 => true, + 129939 => true, + 131070 => true, + 131071 => true, + 177973 => true, + 177974 => true, + 177975 => true, + 177976 => true, + 177977 => true, + 177978 => true, + 177979 => true, + 177980 => true, + 177981 => true, + 177982 => true, + 177983 => true, + 178206 => true, + 178207 => true, + 183970 => true, + 183971 => true, + 183972 => true, + 183973 => true, + 183974 => true, + 183975 => true, + 183976 => true, + 183977 => true, + 183978 => true, + 183979 => true, + 183980 => true, + 183981 => true, + 183982 => true, + 183983 => true, + 194664 => true, + 194676 => true, + 194847 => true, + 194911 => true, + 195007 => true, + 196606 => true, + 196607 => true, + 262142 => true, + 262143 => true, + 327678 => true, + 327679 => true, + 393214 => true, + 393215 => true, + 458750 => true, + 458751 => true, + 524286 => true, + 524287 => true, + 589822 => true, + 589823 => true, + 655358 => true, + 655359 => true, + 720894 => true, + 720895 => true, + 786430 => true, + 786431 => true, + 851966 => true, + 851967 => true, + 917502 => true, + 917503 => true, + 917504 => true, + 917505 => true, + 917506 => true, + 917507 => true, + 917508 => true, + 917509 => true, + 917510 => true, + 917511 => true, + 917512 => true, + 917513 => true, + 917514 => true, + 917515 => true, + 917516 => true, + 917517 => true, + 917518 => true, + 917519 => true, + 917520 => true, + 917521 => true, + 917522 => true, + 917523 => true, + 917524 => true, + 917525 => true, + 917526 => true, + 917527 => true, + 917528 => true, + 917529 => true, + 917530 => true, + 917531 => true, + 917532 => true, + 917533 => true, + 917534 => true, + 917535 => true, + 983038 => true, + 983039 => true, + 1048574 => true, + 1048575 => true, + 1114110 => true, + 1114111 => true, +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php new file mode 100644 index 00000000..54f21cc0 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php @@ -0,0 +1,308 @@ + ' ', + 168 => ' ̈', + 175 => ' ̄', + 180 => ' ́', + 184 => ' ̧', + 728 => ' ̆', + 729 => ' ̇', + 730 => ' ̊', + 731 => ' ̨', + 732 => ' ̃', + 733 => ' ̋', + 890 => ' ι', + 894 => ';', + 900 => ' ́', + 901 => ' ̈́', + 8125 => ' ̓', + 8127 => ' ̓', + 8128 => ' ͂', + 8129 => ' ̈͂', + 8141 => ' ̓̀', + 8142 => ' ̓́', + 8143 => ' ̓͂', + 8157 => ' ̔̀', + 8158 => ' ̔́', + 8159 => ' ̔͂', + 8173 => ' ̈̀', + 8174 => ' ̈́', + 8175 => '`', + 8189 => ' ́', + 8190 => ' ̔', + 8192 => ' ', + 8193 => ' ', + 8194 => ' ', + 8195 => ' ', + 8196 => ' ', + 8197 => ' ', + 8198 => ' ', + 8199 => ' ', + 8200 => ' ', + 8201 => ' ', + 8202 => ' ', + 8215 => ' ̳', + 8239 => ' ', + 8252 => '!!', + 8254 => ' ̅', + 8263 => '??', + 8264 => '?!', + 8265 => '!?', + 8287 => ' ', + 8314 => '+', + 8316 => '=', + 8317 => '(', + 8318 => ')', + 8330 => '+', + 8332 => '=', + 8333 => '(', + 8334 => ')', + 8448 => 'a/c', + 8449 => 'a/s', + 8453 => 'c/o', + 8454 => 'c/u', + 9332 => '(1)', + 9333 => '(2)', + 9334 => '(3)', + 9335 => '(4)', + 9336 => '(5)', + 9337 => '(6)', + 9338 => '(7)', + 9339 => '(8)', + 9340 => '(9)', + 9341 => '(10)', + 9342 => '(11)', + 9343 => '(12)', + 9344 => '(13)', + 9345 => '(14)', + 9346 => '(15)', + 9347 => '(16)', + 9348 => '(17)', + 9349 => '(18)', + 9350 => '(19)', + 9351 => '(20)', + 9372 => '(a)', + 9373 => '(b)', + 9374 => '(c)', + 9375 => '(d)', + 9376 => '(e)', + 9377 => '(f)', + 9378 => '(g)', + 9379 => '(h)', + 9380 => '(i)', + 9381 => '(j)', + 9382 => '(k)', + 9383 => '(l)', + 9384 => '(m)', + 9385 => '(n)', + 9386 => '(o)', + 9387 => '(p)', + 9388 => '(q)', + 9389 => '(r)', + 9390 => '(s)', + 9391 => '(t)', + 9392 => '(u)', + 9393 => '(v)', + 9394 => '(w)', + 9395 => '(x)', + 9396 => '(y)', + 9397 => '(z)', + 10868 => '::=', + 10869 => '==', + 10870 => '===', + 12288 => ' ', + 12443 => ' ゙', + 12444 => ' ゚', + 12800 => '(ᄀ)', + 12801 => '(ᄂ)', + 12802 => '(ᄃ)', + 12803 => '(ᄅ)', + 12804 => '(ᄆ)', + 12805 => '(ᄇ)', + 12806 => '(ᄉ)', + 12807 => '(ᄋ)', + 12808 => '(ᄌ)', + 12809 => '(ᄎ)', + 12810 => '(ᄏ)', + 12811 => '(ᄐ)', + 12812 => '(ᄑ)', + 12813 => '(ᄒ)', + 12814 => '(가)', + 12815 => '(나)', + 12816 => '(다)', + 12817 => '(라)', + 12818 => '(마)', + 12819 => '(바)', + 12820 => '(사)', + 12821 => '(아)', + 12822 => '(자)', + 12823 => '(차)', + 12824 => '(카)', + 12825 => '(타)', + 12826 => '(파)', + 12827 => '(하)', + 12828 => '(주)', + 12829 => '(오전)', + 12830 => '(오후)', + 12832 => '(一)', + 12833 => '(二)', + 12834 => '(三)', + 12835 => '(四)', + 12836 => '(五)', + 12837 => '(六)', + 12838 => '(七)', + 12839 => '(八)', + 12840 => '(九)', + 12841 => '(十)', + 12842 => '(月)', + 12843 => '(火)', + 12844 => '(水)', + 12845 => '(木)', + 12846 => '(金)', + 12847 => '(土)', + 12848 => '(日)', + 12849 => '(株)', + 12850 => '(有)', + 12851 => '(社)', + 12852 => '(名)', + 12853 => '(特)', + 12854 => '(財)', + 12855 => '(祝)', + 12856 => '(労)', + 12857 => '(代)', + 12858 => '(呼)', + 12859 => '(学)', + 12860 => '(監)', + 12861 => '(企)', + 12862 => '(資)', + 12863 => '(協)', + 12864 => '(祭)', + 12865 => '(休)', + 12866 => '(自)', + 12867 => '(至)', + 64297 => '+', + 64606 => ' ٌّ', + 64607 => ' ٍّ', + 64608 => ' َّ', + 64609 => ' ُّ', + 64610 => ' ِّ', + 64611 => ' ّٰ', + 65018 => 'صلى الله عليه وسلم', + 65019 => 'جل جلاله', + 65040 => ',', + 65043 => ':', + 65044 => ';', + 65045 => '!', + 65046 => '?', + 65075 => '_', + 65076 => '_', + 65077 => '(', + 65078 => ')', + 65079 => '{', + 65080 => '}', + 65095 => '[', + 65096 => ']', + 65097 => ' ̅', + 65098 => ' ̅', + 65099 => ' ̅', + 65100 => ' ̅', + 65101 => '_', + 65102 => '_', + 65103 => '_', + 65104 => ',', + 65108 => ';', + 65109 => ':', + 65110 => '?', + 65111 => '!', + 65113 => '(', + 65114 => ')', + 65115 => '{', + 65116 => '}', + 65119 => '#', + 65120 => '&', + 65121 => '*', + 65122 => '+', + 65124 => '<', + 65125 => '>', + 65126 => '=', + 65128 => '\\', + 65129 => '$', + 65130 => '%', + 65131 => '@', + 65136 => ' ً', + 65138 => ' ٌ', + 65140 => ' ٍ', + 65142 => ' َ', + 65144 => ' ُ', + 65146 => ' ِ', + 65148 => ' ّ', + 65150 => ' ْ', + 65281 => '!', + 65282 => '"', + 65283 => '#', + 65284 => '$', + 65285 => '%', + 65286 => '&', + 65287 => '\'', + 65288 => '(', + 65289 => ')', + 65290 => '*', + 65291 => '+', + 65292 => ',', + 65295 => '/', + 65306 => ':', + 65307 => ';', + 65308 => '<', + 65309 => '=', + 65310 => '>', + 65311 => '?', + 65312 => '@', + 65339 => '[', + 65340 => '\\', + 65341 => ']', + 65342 => '^', + 65343 => '_', + 65344 => '`', + 65371 => '{', + 65372 => '|', + 65373 => '}', + 65374 => '~', + 65507 => ' ̄', + 127233 => '0,', + 127234 => '1,', + 127235 => '2,', + 127236 => '3,', + 127237 => '4,', + 127238 => '5,', + 127239 => '6,', + 127240 => '7,', + 127241 => '8,', + 127242 => '9,', + 127248 => '(a)', + 127249 => '(b)', + 127250 => '(c)', + 127251 => '(d)', + 127252 => '(e)', + 127253 => '(f)', + 127254 => '(g)', + 127255 => '(h)', + 127256 => '(i)', + 127257 => '(j)', + 127258 => '(k)', + 127259 => '(l)', + 127260 => '(m)', + 127261 => '(n)', + 127262 => '(o)', + 127263 => '(p)', + 127264 => '(q)', + 127265 => '(r)', + 127266 => '(s)', + 127267 => '(t)', + 127268 => '(u)', + 127269 => '(v)', + 127270 => '(w)', + 127271 => '(x)', + 127272 => '(y)', + 127273 => '(z)', +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php new file mode 100644 index 00000000..223396ec --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php @@ -0,0 +1,71 @@ + true, + 1 => true, + 2 => true, + 3 => true, + 4 => true, + 5 => true, + 6 => true, + 7 => true, + 8 => true, + 9 => true, + 10 => true, + 11 => true, + 12 => true, + 13 => true, + 14 => true, + 15 => true, + 16 => true, + 17 => true, + 18 => true, + 19 => true, + 20 => true, + 21 => true, + 22 => true, + 23 => true, + 24 => true, + 25 => true, + 26 => true, + 27 => true, + 28 => true, + 29 => true, + 30 => true, + 31 => true, + 32 => true, + 33 => true, + 34 => true, + 35 => true, + 36 => true, + 37 => true, + 38 => true, + 39 => true, + 40 => true, + 41 => true, + 42 => true, + 43 => true, + 44 => true, + 47 => true, + 58 => true, + 59 => true, + 60 => true, + 61 => true, + 62 => true, + 63 => true, + 64 => true, + 91 => true, + 92 => true, + 93 => true, + 94 => true, + 95 => true, + 96 => true, + 123 => true, + 124 => true, + 125 => true, + 126 => true, + 127 => true, + 8800 => true, + 8814 => true, + 8815 => true, +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php new file mode 100644 index 00000000..b3778441 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php @@ -0,0 +1,273 @@ + true, + 847 => true, + 6155 => true, + 6156 => true, + 6157 => true, + 8203 => true, + 8288 => true, + 8292 => true, + 65024 => true, + 65025 => true, + 65026 => true, + 65027 => true, + 65028 => true, + 65029 => true, + 65030 => true, + 65031 => true, + 65032 => true, + 65033 => true, + 65034 => true, + 65035 => true, + 65036 => true, + 65037 => true, + 65038 => true, + 65039 => true, + 65279 => true, + 113824 => true, + 113825 => true, + 113826 => true, + 113827 => true, + 917760 => true, + 917761 => true, + 917762 => true, + 917763 => true, + 917764 => true, + 917765 => true, + 917766 => true, + 917767 => true, + 917768 => true, + 917769 => true, + 917770 => true, + 917771 => true, + 917772 => true, + 917773 => true, + 917774 => true, + 917775 => true, + 917776 => true, + 917777 => true, + 917778 => true, + 917779 => true, + 917780 => true, + 917781 => true, + 917782 => true, + 917783 => true, + 917784 => true, + 917785 => true, + 917786 => true, + 917787 => true, + 917788 => true, + 917789 => true, + 917790 => true, + 917791 => true, + 917792 => true, + 917793 => true, + 917794 => true, + 917795 => true, + 917796 => true, + 917797 => true, + 917798 => true, + 917799 => true, + 917800 => true, + 917801 => true, + 917802 => true, + 917803 => true, + 917804 => true, + 917805 => true, + 917806 => true, + 917807 => true, + 917808 => true, + 917809 => true, + 917810 => true, + 917811 => true, + 917812 => true, + 917813 => true, + 917814 => true, + 917815 => true, + 917816 => true, + 917817 => true, + 917818 => true, + 917819 => true, + 917820 => true, + 917821 => true, + 917822 => true, + 917823 => true, + 917824 => true, + 917825 => true, + 917826 => true, + 917827 => true, + 917828 => true, + 917829 => true, + 917830 => true, + 917831 => true, + 917832 => true, + 917833 => true, + 917834 => true, + 917835 => true, + 917836 => true, + 917837 => true, + 917838 => true, + 917839 => true, + 917840 => true, + 917841 => true, + 917842 => true, + 917843 => true, + 917844 => true, + 917845 => true, + 917846 => true, + 917847 => true, + 917848 => true, + 917849 => true, + 917850 => true, + 917851 => true, + 917852 => true, + 917853 => true, + 917854 => true, + 917855 => true, + 917856 => true, + 917857 => true, + 917858 => true, + 917859 => true, + 917860 => true, + 917861 => true, + 917862 => true, + 917863 => true, + 917864 => true, + 917865 => true, + 917866 => true, + 917867 => true, + 917868 => true, + 917869 => true, + 917870 => true, + 917871 => true, + 917872 => true, + 917873 => true, + 917874 => true, + 917875 => true, + 917876 => true, + 917877 => true, + 917878 => true, + 917879 => true, + 917880 => true, + 917881 => true, + 917882 => true, + 917883 => true, + 917884 => true, + 917885 => true, + 917886 => true, + 917887 => true, + 917888 => true, + 917889 => true, + 917890 => true, + 917891 => true, + 917892 => true, + 917893 => true, + 917894 => true, + 917895 => true, + 917896 => true, + 917897 => true, + 917898 => true, + 917899 => true, + 917900 => true, + 917901 => true, + 917902 => true, + 917903 => true, + 917904 => true, + 917905 => true, + 917906 => true, + 917907 => true, + 917908 => true, + 917909 => true, + 917910 => true, + 917911 => true, + 917912 => true, + 917913 => true, + 917914 => true, + 917915 => true, + 917916 => true, + 917917 => true, + 917918 => true, + 917919 => true, + 917920 => true, + 917921 => true, + 917922 => true, + 917923 => true, + 917924 => true, + 917925 => true, + 917926 => true, + 917927 => true, + 917928 => true, + 917929 => true, + 917930 => true, + 917931 => true, + 917932 => true, + 917933 => true, + 917934 => true, + 917935 => true, + 917936 => true, + 917937 => true, + 917938 => true, + 917939 => true, + 917940 => true, + 917941 => true, + 917942 => true, + 917943 => true, + 917944 => true, + 917945 => true, + 917946 => true, + 917947 => true, + 917948 => true, + 917949 => true, + 917950 => true, + 917951 => true, + 917952 => true, + 917953 => true, + 917954 => true, + 917955 => true, + 917956 => true, + 917957 => true, + 917958 => true, + 917959 => true, + 917960 => true, + 917961 => true, + 917962 => true, + 917963 => true, + 917964 => true, + 917965 => true, + 917966 => true, + 917967 => true, + 917968 => true, + 917969 => true, + 917970 => true, + 917971 => true, + 917972 => true, + 917973 => true, + 917974 => true, + 917975 => true, + 917976 => true, + 917977 => true, + 917978 => true, + 917979 => true, + 917980 => true, + 917981 => true, + 917982 => true, + 917983 => true, + 917984 => true, + 917985 => true, + 917986 => true, + 917987 => true, + 917988 => true, + 917989 => true, + 917990 => true, + 917991 => true, + 917992 => true, + 917993 => true, + 917994 => true, + 917995 => true, + 917996 => true, + 917997 => true, + 917998 => true, + 917999 => true, +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php new file mode 100644 index 00000000..9b85fe9d --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php @@ -0,0 +1,5778 @@ + 'a', + 66 => 'b', + 67 => 'c', + 68 => 'd', + 69 => 'e', + 70 => 'f', + 71 => 'g', + 72 => 'h', + 73 => 'i', + 74 => 'j', + 75 => 'k', + 76 => 'l', + 77 => 'm', + 78 => 'n', + 79 => 'o', + 80 => 'p', + 81 => 'q', + 82 => 'r', + 83 => 's', + 84 => 't', + 85 => 'u', + 86 => 'v', + 87 => 'w', + 88 => 'x', + 89 => 'y', + 90 => 'z', + 170 => 'a', + 178 => '2', + 179 => '3', + 181 => 'μ', + 185 => '1', + 186 => 'o', + 188 => '1⁄4', + 189 => '1⁄2', + 190 => '3⁄4', + 192 => 'à', + 193 => 'á', + 194 => 'â', + 195 => 'ã', + 196 => 'ä', + 197 => 'å', + 198 => 'æ', + 199 => 'ç', + 200 => 'è', + 201 => 'é', + 202 => 'ê', + 203 => 'ë', + 204 => 'ì', + 205 => 'í', + 206 => 'î', + 207 => 'ï', + 208 => 'ð', + 209 => 'ñ', + 210 => 'ò', + 211 => 'ó', + 212 => 'ô', + 213 => 'õ', + 214 => 'ö', + 216 => 'ø', + 217 => 'ù', + 218 => 'ú', + 219 => 'û', + 220 => 'ü', + 221 => 'ý', + 222 => 'þ', + 256 => 'ā', + 258 => 'ă', + 260 => 'ą', + 262 => 'ć', + 264 => 'ĉ', + 266 => 'ċ', + 268 => 'č', + 270 => 'ď', + 272 => 'đ', + 274 => 'ē', + 276 => 'ĕ', + 278 => 'ė', + 280 => 'ę', + 282 => 'ě', + 284 => 'ĝ', + 286 => 'ğ', + 288 => 'ġ', + 290 => 'ģ', + 292 => 'ĥ', + 294 => 'ħ', + 296 => 'ĩ', + 298 => 'ī', + 300 => 'ĭ', + 302 => 'į', + 304 => 'i̇', + 306 => 'ij', + 307 => 'ij', + 308 => 'ĵ', + 310 => 'ķ', + 313 => 'ĺ', + 315 => 'ļ', + 317 => 'ľ', + 319 => 'l·', + 320 => 'l·', + 321 => 'ł', + 323 => 'ń', + 325 => 'ņ', + 327 => 'ň', + 329 => 'ʼn', + 330 => 'ŋ', + 332 => 'ō', + 334 => 'ŏ', + 336 => 'ő', + 338 => 'œ', + 340 => 'ŕ', + 342 => 'ŗ', + 344 => 'ř', + 346 => 'ś', + 348 => 'ŝ', + 350 => 'ş', + 352 => 'š', + 354 => 'ţ', + 356 => 'ť', + 358 => 'ŧ', + 360 => 'ũ', + 362 => 'ū', + 364 => 'ŭ', + 366 => 'ů', + 368 => 'ű', + 370 => 'ų', + 372 => 'ŵ', + 374 => 'ŷ', + 376 => 'ÿ', + 377 => 'ź', + 379 => 'ż', + 381 => 'ž', + 383 => 's', + 385 => 'ɓ', + 386 => 'ƃ', + 388 => 'ƅ', + 390 => 'ɔ', + 391 => 'ƈ', + 393 => 'ɖ', + 394 => 'ɗ', + 395 => 'ƌ', + 398 => 'ǝ', + 399 => 'ə', + 400 => 'ɛ', + 401 => 'ƒ', + 403 => 'ɠ', + 404 => 'ɣ', + 406 => 'ɩ', + 407 => 'ɨ', + 408 => 'ƙ', + 412 => 'ɯ', + 413 => 'ɲ', + 415 => 'ɵ', + 416 => 'ơ', + 418 => 'ƣ', + 420 => 'ƥ', + 422 => 'ʀ', + 423 => 'ƨ', + 425 => 'ʃ', + 428 => 'ƭ', + 430 => 'ʈ', + 431 => 'ư', + 433 => 'ʊ', + 434 => 'ʋ', + 435 => 'ƴ', + 437 => 'ƶ', + 439 => 'ʒ', + 440 => 'ƹ', + 444 => 'ƽ', + 452 => 'dž', + 453 => 'dž', + 454 => 'dž', + 455 => 'lj', + 456 => 'lj', + 457 => 'lj', + 458 => 'nj', + 459 => 'nj', + 460 => 'nj', + 461 => 'ǎ', + 463 => 'ǐ', + 465 => 'ǒ', + 467 => 'ǔ', + 469 => 'ǖ', + 471 => 'ǘ', + 473 => 'ǚ', + 475 => 'ǜ', + 478 => 'ǟ', + 480 => 'ǡ', + 482 => 'ǣ', + 484 => 'ǥ', + 486 => 'ǧ', + 488 => 'ǩ', + 490 => 'ǫ', + 492 => 'ǭ', + 494 => 'ǯ', + 497 => 'dz', + 498 => 'dz', + 499 => 'dz', + 500 => 'ǵ', + 502 => 'ƕ', + 503 => 'ƿ', + 504 => 'ǹ', + 506 => 'ǻ', + 508 => 'ǽ', + 510 => 'ǿ', + 512 => 'ȁ', + 514 => 'ȃ', + 516 => 'ȅ', + 518 => 'ȇ', + 520 => 'ȉ', + 522 => 'ȋ', + 524 => 'ȍ', + 526 => 'ȏ', + 528 => 'ȑ', + 530 => 'ȓ', + 532 => 'ȕ', + 534 => 'ȗ', + 536 => 'ș', + 538 => 'ț', + 540 => 'ȝ', + 542 => 'ȟ', + 544 => 'ƞ', + 546 => 'ȣ', + 548 => 'ȥ', + 550 => 'ȧ', + 552 => 'ȩ', + 554 => 'ȫ', + 556 => 'ȭ', + 558 => 'ȯ', + 560 => 'ȱ', + 562 => 'ȳ', + 570 => 'ⱥ', + 571 => 'ȼ', + 573 => 'ƚ', + 574 => 'ⱦ', + 577 => 'ɂ', + 579 => 'ƀ', + 580 => 'ʉ', + 581 => 'ʌ', + 582 => 'ɇ', + 584 => 'ɉ', + 586 => 'ɋ', + 588 => 'ɍ', + 590 => 'ɏ', + 688 => 'h', + 689 => 'ɦ', + 690 => 'j', + 691 => 'r', + 692 => 'ɹ', + 693 => 'ɻ', + 694 => 'ʁ', + 695 => 'w', + 696 => 'y', + 736 => 'ɣ', + 737 => 'l', + 738 => 's', + 739 => 'x', + 740 => 'ʕ', + 832 => '̀', + 833 => '́', + 835 => '̓', + 836 => '̈́', + 837 => 'ι', + 880 => 'ͱ', + 882 => 'ͳ', + 884 => 'ʹ', + 886 => 'ͷ', + 895 => 'ϳ', + 902 => 'ά', + 903 => '·', + 904 => 'έ', + 905 => 'ή', + 906 => 'ί', + 908 => 'ό', + 910 => 'ύ', + 911 => 'ώ', + 913 => 'α', + 914 => 'β', + 915 => 'γ', + 916 => 'δ', + 917 => 'ε', + 918 => 'ζ', + 919 => 'η', + 920 => 'θ', + 921 => 'ι', + 922 => 'κ', + 923 => 'λ', + 924 => 'μ', + 925 => 'ν', + 926 => 'ξ', + 927 => 'ο', + 928 => 'π', + 929 => 'ρ', + 931 => 'σ', + 932 => 'τ', + 933 => 'υ', + 934 => 'φ', + 935 => 'χ', + 936 => 'ψ', + 937 => 'ω', + 938 => 'ϊ', + 939 => 'ϋ', + 975 => 'ϗ', + 976 => 'β', + 977 => 'θ', + 978 => 'υ', + 979 => 'ύ', + 980 => 'ϋ', + 981 => 'φ', + 982 => 'π', + 984 => 'ϙ', + 986 => 'ϛ', + 988 => 'ϝ', + 990 => 'ϟ', + 992 => 'ϡ', + 994 => 'ϣ', + 996 => 'ϥ', + 998 => 'ϧ', + 1000 => 'ϩ', + 1002 => 'ϫ', + 1004 => 'ϭ', + 1006 => 'ϯ', + 1008 => 'κ', + 1009 => 'ρ', + 1010 => 'σ', + 1012 => 'θ', + 1013 => 'ε', + 1015 => 'ϸ', + 1017 => 'σ', + 1018 => 'ϻ', + 1021 => 'ͻ', + 1022 => 'ͼ', + 1023 => 'ͽ', + 1024 => 'ѐ', + 1025 => 'ё', + 1026 => 'ђ', + 1027 => 'ѓ', + 1028 => 'є', + 1029 => 'ѕ', + 1030 => 'і', + 1031 => 'ї', + 1032 => 'ј', + 1033 => 'љ', + 1034 => 'њ', + 1035 => 'ћ', + 1036 => 'ќ', + 1037 => 'ѝ', + 1038 => 'ў', + 1039 => 'џ', + 1040 => 'а', + 1041 => 'б', + 1042 => 'в', + 1043 => 'г', + 1044 => 'д', + 1045 => 'е', + 1046 => 'ж', + 1047 => 'з', + 1048 => 'и', + 1049 => 'й', + 1050 => 'к', + 1051 => 'л', + 1052 => 'м', + 1053 => 'н', + 1054 => 'о', + 1055 => 'п', + 1056 => 'р', + 1057 => 'с', + 1058 => 'т', + 1059 => 'у', + 1060 => 'ф', + 1061 => 'х', + 1062 => 'ц', + 1063 => 'ч', + 1064 => 'ш', + 1065 => 'щ', + 1066 => 'ъ', + 1067 => 'ы', + 1068 => 'ь', + 1069 => 'э', + 1070 => 'ю', + 1071 => 'я', + 1120 => 'ѡ', + 1122 => 'ѣ', + 1124 => 'ѥ', + 1126 => 'ѧ', + 1128 => 'ѩ', + 1130 => 'ѫ', + 1132 => 'ѭ', + 1134 => 'ѯ', + 1136 => 'ѱ', + 1138 => 'ѳ', + 1140 => 'ѵ', + 1142 => 'ѷ', + 1144 => 'ѹ', + 1146 => 'ѻ', + 1148 => 'ѽ', + 1150 => 'ѿ', + 1152 => 'ҁ', + 1162 => 'ҋ', + 1164 => 'ҍ', + 1166 => 'ҏ', + 1168 => 'ґ', + 1170 => 'ғ', + 1172 => 'ҕ', + 1174 => 'җ', + 1176 => 'ҙ', + 1178 => 'қ', + 1180 => 'ҝ', + 1182 => 'ҟ', + 1184 => 'ҡ', + 1186 => 'ң', + 1188 => 'ҥ', + 1190 => 'ҧ', + 1192 => 'ҩ', + 1194 => 'ҫ', + 1196 => 'ҭ', + 1198 => 'ү', + 1200 => 'ұ', + 1202 => 'ҳ', + 1204 => 'ҵ', + 1206 => 'ҷ', + 1208 => 'ҹ', + 1210 => 'һ', + 1212 => 'ҽ', + 1214 => 'ҿ', + 1217 => 'ӂ', + 1219 => 'ӄ', + 1221 => 'ӆ', + 1223 => 'ӈ', + 1225 => 'ӊ', + 1227 => 'ӌ', + 1229 => 'ӎ', + 1232 => 'ӑ', + 1234 => 'ӓ', + 1236 => 'ӕ', + 1238 => 'ӗ', + 1240 => 'ә', + 1242 => 'ӛ', + 1244 => 'ӝ', + 1246 => 'ӟ', + 1248 => 'ӡ', + 1250 => 'ӣ', + 1252 => 'ӥ', + 1254 => 'ӧ', + 1256 => 'ө', + 1258 => 'ӫ', + 1260 => 'ӭ', + 1262 => 'ӯ', + 1264 => 'ӱ', + 1266 => 'ӳ', + 1268 => 'ӵ', + 1270 => 'ӷ', + 1272 => 'ӹ', + 1274 => 'ӻ', + 1276 => 'ӽ', + 1278 => 'ӿ', + 1280 => 'ԁ', + 1282 => 'ԃ', + 1284 => 'ԅ', + 1286 => 'ԇ', + 1288 => 'ԉ', + 1290 => 'ԋ', + 1292 => 'ԍ', + 1294 => 'ԏ', + 1296 => 'ԑ', + 1298 => 'ԓ', + 1300 => 'ԕ', + 1302 => 'ԗ', + 1304 => 'ԙ', + 1306 => 'ԛ', + 1308 => 'ԝ', + 1310 => 'ԟ', + 1312 => 'ԡ', + 1314 => 'ԣ', + 1316 => 'ԥ', + 1318 => 'ԧ', + 1320 => 'ԩ', + 1322 => 'ԫ', + 1324 => 'ԭ', + 1326 => 'ԯ', + 1329 => 'ա', + 1330 => 'բ', + 1331 => 'գ', + 1332 => 'դ', + 1333 => 'ե', + 1334 => 'զ', + 1335 => 'է', + 1336 => 'ը', + 1337 => 'թ', + 1338 => 'ժ', + 1339 => 'ի', + 1340 => 'լ', + 1341 => 'խ', + 1342 => 'ծ', + 1343 => 'կ', + 1344 => 'հ', + 1345 => 'ձ', + 1346 => 'ղ', + 1347 => 'ճ', + 1348 => 'մ', + 1349 => 'յ', + 1350 => 'ն', + 1351 => 'շ', + 1352 => 'ո', + 1353 => 'չ', + 1354 => 'պ', + 1355 => 'ջ', + 1356 => 'ռ', + 1357 => 'ս', + 1358 => 'վ', + 1359 => 'տ', + 1360 => 'ր', + 1361 => 'ց', + 1362 => 'ւ', + 1363 => 'փ', + 1364 => 'ք', + 1365 => 'օ', + 1366 => 'ֆ', + 1415 => 'եւ', + 1653 => 'اٴ', + 1654 => 'وٴ', + 1655 => 'ۇٴ', + 1656 => 'يٴ', + 2392 => 'क़', + 2393 => 'ख़', + 2394 => 'ग़', + 2395 => 'ज़', + 2396 => 'ड़', + 2397 => 'ढ़', + 2398 => 'फ़', + 2399 => 'य़', + 2524 => 'ড়', + 2525 => 'ঢ়', + 2527 => 'য়', + 2611 => 'ਲ਼', + 2614 => 'ਸ਼', + 2649 => 'ਖ਼', + 2650 => 'ਗ਼', + 2651 => 'ਜ਼', + 2654 => 'ਫ਼', + 2908 => 'ଡ଼', + 2909 => 'ଢ଼', + 3635 => 'ํา', + 3763 => 'ໍາ', + 3804 => 'ຫນ', + 3805 => 'ຫມ', + 3852 => '་', + 3907 => 'གྷ', + 3917 => 'ཌྷ', + 3922 => 'དྷ', + 3927 => 'བྷ', + 3932 => 'ཛྷ', + 3945 => 'ཀྵ', + 3955 => 'ཱི', + 3957 => 'ཱུ', + 3958 => 'ྲྀ', + 3959 => 'ྲཱྀ', + 3960 => 'ླྀ', + 3961 => 'ླཱྀ', + 3969 => 'ཱྀ', + 3987 => 'ྒྷ', + 3997 => 'ྜྷ', + 4002 => 'ྡྷ', + 4007 => 'ྦྷ', + 4012 => 'ྫྷ', + 4025 => 'ྐྵ', + 4295 => 'ⴧ', + 4301 => 'ⴭ', + 4348 => 'ნ', + 5112 => 'Ᏸ', + 5113 => 'Ᏹ', + 5114 => 'Ᏺ', + 5115 => 'Ᏻ', + 5116 => 'Ᏼ', + 5117 => 'Ᏽ', + 7296 => 'в', + 7297 => 'д', + 7298 => 'о', + 7299 => 'с', + 7300 => 'т', + 7301 => 'т', + 7302 => 'ъ', + 7303 => 'ѣ', + 7304 => 'ꙋ', + 7312 => 'ა', + 7313 => 'ბ', + 7314 => 'გ', + 7315 => 'დ', + 7316 => 'ე', + 7317 => 'ვ', + 7318 => 'ზ', + 7319 => 'თ', + 7320 => 'ი', + 7321 => 'კ', + 7322 => 'ლ', + 7323 => 'მ', + 7324 => 'ნ', + 7325 => 'ო', + 7326 => 'პ', + 7327 => 'ჟ', + 7328 => 'რ', + 7329 => 'ს', + 7330 => 'ტ', + 7331 => 'უ', + 7332 => 'ფ', + 7333 => 'ქ', + 7334 => 'ღ', + 7335 => 'ყ', + 7336 => 'შ', + 7337 => 'ჩ', + 7338 => 'ც', + 7339 => 'ძ', + 7340 => 'წ', + 7341 => 'ჭ', + 7342 => 'ხ', + 7343 => 'ჯ', + 7344 => 'ჰ', + 7345 => 'ჱ', + 7346 => 'ჲ', + 7347 => 'ჳ', + 7348 => 'ჴ', + 7349 => 'ჵ', + 7350 => 'ჶ', + 7351 => 'ჷ', + 7352 => 'ჸ', + 7353 => 'ჹ', + 7354 => 'ჺ', + 7357 => 'ჽ', + 7358 => 'ჾ', + 7359 => 'ჿ', + 7468 => 'a', + 7469 => 'æ', + 7470 => 'b', + 7472 => 'd', + 7473 => 'e', + 7474 => 'ǝ', + 7475 => 'g', + 7476 => 'h', + 7477 => 'i', + 7478 => 'j', + 7479 => 'k', + 7480 => 'l', + 7481 => 'm', + 7482 => 'n', + 7484 => 'o', + 7485 => 'ȣ', + 7486 => 'p', + 7487 => 'r', + 7488 => 't', + 7489 => 'u', + 7490 => 'w', + 7491 => 'a', + 7492 => 'ɐ', + 7493 => 'ɑ', + 7494 => 'ᴂ', + 7495 => 'b', + 7496 => 'd', + 7497 => 'e', + 7498 => 'ə', + 7499 => 'ɛ', + 7500 => 'ɜ', + 7501 => 'g', + 7503 => 'k', + 7504 => 'm', + 7505 => 'ŋ', + 7506 => 'o', + 7507 => 'ɔ', + 7508 => 'ᴖ', + 7509 => 'ᴗ', + 7510 => 'p', + 7511 => 't', + 7512 => 'u', + 7513 => 'ᴝ', + 7514 => 'ɯ', + 7515 => 'v', + 7516 => 'ᴥ', + 7517 => 'β', + 7518 => 'γ', + 7519 => 'δ', + 7520 => 'φ', + 7521 => 'χ', + 7522 => 'i', + 7523 => 'r', + 7524 => 'u', + 7525 => 'v', + 7526 => 'β', + 7527 => 'γ', + 7528 => 'ρ', + 7529 => 'φ', + 7530 => 'χ', + 7544 => 'н', + 7579 => 'ɒ', + 7580 => 'c', + 7581 => 'ɕ', + 7582 => 'ð', + 7583 => 'ɜ', + 7584 => 'f', + 7585 => 'ɟ', + 7586 => 'ɡ', + 7587 => 'ɥ', + 7588 => 'ɨ', + 7589 => 'ɩ', + 7590 => 'ɪ', + 7591 => 'ᵻ', + 7592 => 'ʝ', + 7593 => 'ɭ', + 7594 => 'ᶅ', + 7595 => 'ʟ', + 7596 => 'ɱ', + 7597 => 'ɰ', + 7598 => 'ɲ', + 7599 => 'ɳ', + 7600 => 'ɴ', + 7601 => 'ɵ', + 7602 => 'ɸ', + 7603 => 'ʂ', + 7604 => 'ʃ', + 7605 => 'ƫ', + 7606 => 'ʉ', + 7607 => 'ʊ', + 7608 => 'ᴜ', + 7609 => 'ʋ', + 7610 => 'ʌ', + 7611 => 'z', + 7612 => 'ʐ', + 7613 => 'ʑ', + 7614 => 'ʒ', + 7615 => 'θ', + 7680 => 'ḁ', + 7682 => 'ḃ', + 7684 => 'ḅ', + 7686 => 'ḇ', + 7688 => 'ḉ', + 7690 => 'ḋ', + 7692 => 'ḍ', + 7694 => 'ḏ', + 7696 => 'ḑ', + 7698 => 'ḓ', + 7700 => 'ḕ', + 7702 => 'ḗ', + 7704 => 'ḙ', + 7706 => 'ḛ', + 7708 => 'ḝ', + 7710 => 'ḟ', + 7712 => 'ḡ', + 7714 => 'ḣ', + 7716 => 'ḥ', + 7718 => 'ḧ', + 7720 => 'ḩ', + 7722 => 'ḫ', + 7724 => 'ḭ', + 7726 => 'ḯ', + 7728 => 'ḱ', + 7730 => 'ḳ', + 7732 => 'ḵ', + 7734 => 'ḷ', + 7736 => 'ḹ', + 7738 => 'ḻ', + 7740 => 'ḽ', + 7742 => 'ḿ', + 7744 => 'ṁ', + 7746 => 'ṃ', + 7748 => 'ṅ', + 7750 => 'ṇ', + 7752 => 'ṉ', + 7754 => 'ṋ', + 7756 => 'ṍ', + 7758 => 'ṏ', + 7760 => 'ṑ', + 7762 => 'ṓ', + 7764 => 'ṕ', + 7766 => 'ṗ', + 7768 => 'ṙ', + 7770 => 'ṛ', + 7772 => 'ṝ', + 7774 => 'ṟ', + 7776 => 'ṡ', + 7778 => 'ṣ', + 7780 => 'ṥ', + 7782 => 'ṧ', + 7784 => 'ṩ', + 7786 => 'ṫ', + 7788 => 'ṭ', + 7790 => 'ṯ', + 7792 => 'ṱ', + 7794 => 'ṳ', + 7796 => 'ṵ', + 7798 => 'ṷ', + 7800 => 'ṹ', + 7802 => 'ṻ', + 7804 => 'ṽ', + 7806 => 'ṿ', + 7808 => 'ẁ', + 7810 => 'ẃ', + 7812 => 'ẅ', + 7814 => 'ẇ', + 7816 => 'ẉ', + 7818 => 'ẋ', + 7820 => 'ẍ', + 7822 => 'ẏ', + 7824 => 'ẑ', + 7826 => 'ẓ', + 7828 => 'ẕ', + 7834 => 'aʾ', + 7835 => 'ṡ', + 7838 => 'ss', + 7840 => 'ạ', + 7842 => 'ả', + 7844 => 'ấ', + 7846 => 'ầ', + 7848 => 'ẩ', + 7850 => 'ẫ', + 7852 => 'ậ', + 7854 => 'ắ', + 7856 => 'ằ', + 7858 => 'ẳ', + 7860 => 'ẵ', + 7862 => 'ặ', + 7864 => 'ẹ', + 7866 => 'ẻ', + 7868 => 'ẽ', + 7870 => 'ế', + 7872 => 'ề', + 7874 => 'ể', + 7876 => 'ễ', + 7878 => 'ệ', + 7880 => 'ỉ', + 7882 => 'ị', + 7884 => 'ọ', + 7886 => 'ỏ', + 7888 => 'ố', + 7890 => 'ồ', + 7892 => 'ổ', + 7894 => 'ỗ', + 7896 => 'ộ', + 7898 => 'ớ', + 7900 => 'ờ', + 7902 => 'ở', + 7904 => 'ỡ', + 7906 => 'ợ', + 7908 => 'ụ', + 7910 => 'ủ', + 7912 => 'ứ', + 7914 => 'ừ', + 7916 => 'ử', + 7918 => 'ữ', + 7920 => 'ự', + 7922 => 'ỳ', + 7924 => 'ỵ', + 7926 => 'ỷ', + 7928 => 'ỹ', + 7930 => 'ỻ', + 7932 => 'ỽ', + 7934 => 'ỿ', + 7944 => 'ἀ', + 7945 => 'ἁ', + 7946 => 'ἂ', + 7947 => 'ἃ', + 7948 => 'ἄ', + 7949 => 'ἅ', + 7950 => 'ἆ', + 7951 => 'ἇ', + 7960 => 'ἐ', + 7961 => 'ἑ', + 7962 => 'ἒ', + 7963 => 'ἓ', + 7964 => 'ἔ', + 7965 => 'ἕ', + 7976 => 'ἠ', + 7977 => 'ἡ', + 7978 => 'ἢ', + 7979 => 'ἣ', + 7980 => 'ἤ', + 7981 => 'ἥ', + 7982 => 'ἦ', + 7983 => 'ἧ', + 7992 => 'ἰ', + 7993 => 'ἱ', + 7994 => 'ἲ', + 7995 => 'ἳ', + 7996 => 'ἴ', + 7997 => 'ἵ', + 7998 => 'ἶ', + 7999 => 'ἷ', + 8008 => 'ὀ', + 8009 => 'ὁ', + 8010 => 'ὂ', + 8011 => 'ὃ', + 8012 => 'ὄ', + 8013 => 'ὅ', + 8025 => 'ὑ', + 8027 => 'ὓ', + 8029 => 'ὕ', + 8031 => 'ὗ', + 8040 => 'ὠ', + 8041 => 'ὡ', + 8042 => 'ὢ', + 8043 => 'ὣ', + 8044 => 'ὤ', + 8045 => 'ὥ', + 8046 => 'ὦ', + 8047 => 'ὧ', + 8049 => 'ά', + 8051 => 'έ', + 8053 => 'ή', + 8055 => 'ί', + 8057 => 'ό', + 8059 => 'ύ', + 8061 => 'ώ', + 8064 => 'ἀι', + 8065 => 'ἁι', + 8066 => 'ἂι', + 8067 => 'ἃι', + 8068 => 'ἄι', + 8069 => 'ἅι', + 8070 => 'ἆι', + 8071 => 'ἇι', + 8072 => 'ἀι', + 8073 => 'ἁι', + 8074 => 'ἂι', + 8075 => 'ἃι', + 8076 => 'ἄι', + 8077 => 'ἅι', + 8078 => 'ἆι', + 8079 => 'ἇι', + 8080 => 'ἠι', + 8081 => 'ἡι', + 8082 => 'ἢι', + 8083 => 'ἣι', + 8084 => 'ἤι', + 8085 => 'ἥι', + 8086 => 'ἦι', + 8087 => 'ἧι', + 8088 => 'ἠι', + 8089 => 'ἡι', + 8090 => 'ἢι', + 8091 => 'ἣι', + 8092 => 'ἤι', + 8093 => 'ἥι', + 8094 => 'ἦι', + 8095 => 'ἧι', + 8096 => 'ὠι', + 8097 => 'ὡι', + 8098 => 'ὢι', + 8099 => 'ὣι', + 8100 => 'ὤι', + 8101 => 'ὥι', + 8102 => 'ὦι', + 8103 => 'ὧι', + 8104 => 'ὠι', + 8105 => 'ὡι', + 8106 => 'ὢι', + 8107 => 'ὣι', + 8108 => 'ὤι', + 8109 => 'ὥι', + 8110 => 'ὦι', + 8111 => 'ὧι', + 8114 => 'ὰι', + 8115 => 'αι', + 8116 => 'άι', + 8119 => 'ᾶι', + 8120 => 'ᾰ', + 8121 => 'ᾱ', + 8122 => 'ὰ', + 8123 => 'ά', + 8124 => 'αι', + 8126 => 'ι', + 8130 => 'ὴι', + 8131 => 'ηι', + 8132 => 'ήι', + 8135 => 'ῆι', + 8136 => 'ὲ', + 8137 => 'έ', + 8138 => 'ὴ', + 8139 => 'ή', + 8140 => 'ηι', + 8147 => 'ΐ', + 8152 => 'ῐ', + 8153 => 'ῑ', + 8154 => 'ὶ', + 8155 => 'ί', + 8163 => 'ΰ', + 8168 => 'ῠ', + 8169 => 'ῡ', + 8170 => 'ὺ', + 8171 => 'ύ', + 8172 => 'ῥ', + 8178 => 'ὼι', + 8179 => 'ωι', + 8180 => 'ώι', + 8183 => 'ῶι', + 8184 => 'ὸ', + 8185 => 'ό', + 8186 => 'ὼ', + 8187 => 'ώ', + 8188 => 'ωι', + 8209 => '‐', + 8243 => '′′', + 8244 => '′′′', + 8246 => '‵‵', + 8247 => '‵‵‵', + 8279 => '′′′′', + 8304 => '0', + 8305 => 'i', + 8308 => '4', + 8309 => '5', + 8310 => '6', + 8311 => '7', + 8312 => '8', + 8313 => '9', + 8315 => '−', + 8319 => 'n', + 8320 => '0', + 8321 => '1', + 8322 => '2', + 8323 => '3', + 8324 => '4', + 8325 => '5', + 8326 => '6', + 8327 => '7', + 8328 => '8', + 8329 => '9', + 8331 => '−', + 8336 => 'a', + 8337 => 'e', + 8338 => 'o', + 8339 => 'x', + 8340 => 'ə', + 8341 => 'h', + 8342 => 'k', + 8343 => 'l', + 8344 => 'm', + 8345 => 'n', + 8346 => 'p', + 8347 => 's', + 8348 => 't', + 8360 => 'rs', + 8450 => 'c', + 8451 => '°c', + 8455 => 'ɛ', + 8457 => '°f', + 8458 => 'g', + 8459 => 'h', + 8460 => 'h', + 8461 => 'h', + 8462 => 'h', + 8463 => 'ħ', + 8464 => 'i', + 8465 => 'i', + 8466 => 'l', + 8467 => 'l', + 8469 => 'n', + 8470 => 'no', + 8473 => 'p', + 8474 => 'q', + 8475 => 'r', + 8476 => 'r', + 8477 => 'r', + 8480 => 'sm', + 8481 => 'tel', + 8482 => 'tm', + 8484 => 'z', + 8486 => 'ω', + 8488 => 'z', + 8490 => 'k', + 8491 => 'å', + 8492 => 'b', + 8493 => 'c', + 8495 => 'e', + 8496 => 'e', + 8497 => 'f', + 8499 => 'm', + 8500 => 'o', + 8501 => 'א', + 8502 => 'ב', + 8503 => 'ג', + 8504 => 'ד', + 8505 => 'i', + 8507 => 'fax', + 8508 => 'π', + 8509 => 'γ', + 8510 => 'γ', + 8511 => 'π', + 8512 => '∑', + 8517 => 'd', + 8518 => 'd', + 8519 => 'e', + 8520 => 'i', + 8521 => 'j', + 8528 => '1⁄7', + 8529 => '1⁄9', + 8530 => '1⁄10', + 8531 => '1⁄3', + 8532 => '2⁄3', + 8533 => '1⁄5', + 8534 => '2⁄5', + 8535 => '3⁄5', + 8536 => '4⁄5', + 8537 => '1⁄6', + 8538 => '5⁄6', + 8539 => '1⁄8', + 8540 => '3⁄8', + 8541 => '5⁄8', + 8542 => '7⁄8', + 8543 => '1⁄', + 8544 => 'i', + 8545 => 'ii', + 8546 => 'iii', + 8547 => 'iv', + 8548 => 'v', + 8549 => 'vi', + 8550 => 'vii', + 8551 => 'viii', + 8552 => 'ix', + 8553 => 'x', + 8554 => 'xi', + 8555 => 'xii', + 8556 => 'l', + 8557 => 'c', + 8558 => 'd', + 8559 => 'm', + 8560 => 'i', + 8561 => 'ii', + 8562 => 'iii', + 8563 => 'iv', + 8564 => 'v', + 8565 => 'vi', + 8566 => 'vii', + 8567 => 'viii', + 8568 => 'ix', + 8569 => 'x', + 8570 => 'xi', + 8571 => 'xii', + 8572 => 'l', + 8573 => 'c', + 8574 => 'd', + 8575 => 'm', + 8585 => '0⁄3', + 8748 => '∫∫', + 8749 => '∫∫∫', + 8751 => '∮∮', + 8752 => '∮∮∮', + 9001 => '〈', + 9002 => '〉', + 9312 => '1', + 9313 => '2', + 9314 => '3', + 9315 => '4', + 9316 => '5', + 9317 => '6', + 9318 => '7', + 9319 => '8', + 9320 => '9', + 9321 => '10', + 9322 => '11', + 9323 => '12', + 9324 => '13', + 9325 => '14', + 9326 => '15', + 9327 => '16', + 9328 => '17', + 9329 => '18', + 9330 => '19', + 9331 => '20', + 9398 => 'a', + 9399 => 'b', + 9400 => 'c', + 9401 => 'd', + 9402 => 'e', + 9403 => 'f', + 9404 => 'g', + 9405 => 'h', + 9406 => 'i', + 9407 => 'j', + 9408 => 'k', + 9409 => 'l', + 9410 => 'm', + 9411 => 'n', + 9412 => 'o', + 9413 => 'p', + 9414 => 'q', + 9415 => 'r', + 9416 => 's', + 9417 => 't', + 9418 => 'u', + 9419 => 'v', + 9420 => 'w', + 9421 => 'x', + 9422 => 'y', + 9423 => 'z', + 9424 => 'a', + 9425 => 'b', + 9426 => 'c', + 9427 => 'd', + 9428 => 'e', + 9429 => 'f', + 9430 => 'g', + 9431 => 'h', + 9432 => 'i', + 9433 => 'j', + 9434 => 'k', + 9435 => 'l', + 9436 => 'm', + 9437 => 'n', + 9438 => 'o', + 9439 => 'p', + 9440 => 'q', + 9441 => 'r', + 9442 => 's', + 9443 => 't', + 9444 => 'u', + 9445 => 'v', + 9446 => 'w', + 9447 => 'x', + 9448 => 'y', + 9449 => 'z', + 9450 => '0', + 10764 => '∫∫∫∫', + 10972 => '⫝̸', + 11264 => 'ⰰ', + 11265 => 'ⰱ', + 11266 => 'ⰲ', + 11267 => 'ⰳ', + 11268 => 'ⰴ', + 11269 => 'ⰵ', + 11270 => 'ⰶ', + 11271 => 'ⰷ', + 11272 => 'ⰸ', + 11273 => 'ⰹ', + 11274 => 'ⰺ', + 11275 => 'ⰻ', + 11276 => 'ⰼ', + 11277 => 'ⰽ', + 11278 => 'ⰾ', + 11279 => 'ⰿ', + 11280 => 'ⱀ', + 11281 => 'ⱁ', + 11282 => 'ⱂ', + 11283 => 'ⱃ', + 11284 => 'ⱄ', + 11285 => 'ⱅ', + 11286 => 'ⱆ', + 11287 => 'ⱇ', + 11288 => 'ⱈ', + 11289 => 'ⱉ', + 11290 => 'ⱊ', + 11291 => 'ⱋ', + 11292 => 'ⱌ', + 11293 => 'ⱍ', + 11294 => 'ⱎ', + 11295 => 'ⱏ', + 11296 => 'ⱐ', + 11297 => 'ⱑ', + 11298 => 'ⱒ', + 11299 => 'ⱓ', + 11300 => 'ⱔ', + 11301 => 'ⱕ', + 11302 => 'ⱖ', + 11303 => 'ⱗ', + 11304 => 'ⱘ', + 11305 => 'ⱙ', + 11306 => 'ⱚ', + 11307 => 'ⱛ', + 11308 => 'ⱜ', + 11309 => 'ⱝ', + 11310 => 'ⱞ', + 11360 => 'ⱡ', + 11362 => 'ɫ', + 11363 => 'ᵽ', + 11364 => 'ɽ', + 11367 => 'ⱨ', + 11369 => 'ⱪ', + 11371 => 'ⱬ', + 11373 => 'ɑ', + 11374 => 'ɱ', + 11375 => 'ɐ', + 11376 => 'ɒ', + 11378 => 'ⱳ', + 11381 => 'ⱶ', + 11388 => 'j', + 11389 => 'v', + 11390 => 'ȿ', + 11391 => 'ɀ', + 11392 => 'ⲁ', + 11394 => 'ⲃ', + 11396 => 'ⲅ', + 11398 => 'ⲇ', + 11400 => 'ⲉ', + 11402 => 'ⲋ', + 11404 => 'ⲍ', + 11406 => 'ⲏ', + 11408 => 'ⲑ', + 11410 => 'ⲓ', + 11412 => 'ⲕ', + 11414 => 'ⲗ', + 11416 => 'ⲙ', + 11418 => 'ⲛ', + 11420 => 'ⲝ', + 11422 => 'ⲟ', + 11424 => 'ⲡ', + 11426 => 'ⲣ', + 11428 => 'ⲥ', + 11430 => 'ⲧ', + 11432 => 'ⲩ', + 11434 => 'ⲫ', + 11436 => 'ⲭ', + 11438 => 'ⲯ', + 11440 => 'ⲱ', + 11442 => 'ⲳ', + 11444 => 'ⲵ', + 11446 => 'ⲷ', + 11448 => 'ⲹ', + 11450 => 'ⲻ', + 11452 => 'ⲽ', + 11454 => 'ⲿ', + 11456 => 'ⳁ', + 11458 => 'ⳃ', + 11460 => 'ⳅ', + 11462 => 'ⳇ', + 11464 => 'ⳉ', + 11466 => 'ⳋ', + 11468 => 'ⳍ', + 11470 => 'ⳏ', + 11472 => 'ⳑ', + 11474 => 'ⳓ', + 11476 => 'ⳕ', + 11478 => 'ⳗ', + 11480 => 'ⳙ', + 11482 => 'ⳛ', + 11484 => 'ⳝ', + 11486 => 'ⳟ', + 11488 => 'ⳡ', + 11490 => 'ⳣ', + 11499 => 'ⳬ', + 11501 => 'ⳮ', + 11506 => 'ⳳ', + 11631 => 'ⵡ', + 11935 => '母', + 12019 => '龟', + 12032 => '一', + 12033 => '丨', + 12034 => '丶', + 12035 => '丿', + 12036 => '乙', + 12037 => '亅', + 12038 => '二', + 12039 => '亠', + 12040 => '人', + 12041 => '儿', + 12042 => '入', + 12043 => '八', + 12044 => '冂', + 12045 => '冖', + 12046 => '冫', + 12047 => '几', + 12048 => '凵', + 12049 => '刀', + 12050 => '力', + 12051 => '勹', + 12052 => '匕', + 12053 => '匚', + 12054 => '匸', + 12055 => '十', + 12056 => '卜', + 12057 => '卩', + 12058 => '厂', + 12059 => '厶', + 12060 => '又', + 12061 => '口', + 12062 => '囗', + 12063 => '土', + 12064 => '士', + 12065 => '夂', + 12066 => '夊', + 12067 => '夕', + 12068 => '大', + 12069 => '女', + 12070 => '子', + 12071 => '宀', + 12072 => '寸', + 12073 => '小', + 12074 => '尢', + 12075 => '尸', + 12076 => '屮', + 12077 => '山', + 12078 => '巛', + 12079 => '工', + 12080 => '己', + 12081 => '巾', + 12082 => '干', + 12083 => '幺', + 12084 => '广', + 12085 => '廴', + 12086 => '廾', + 12087 => '弋', + 12088 => '弓', + 12089 => '彐', + 12090 => '彡', + 12091 => '彳', + 12092 => '心', + 12093 => '戈', + 12094 => '戶', + 12095 => '手', + 12096 => '支', + 12097 => '攴', + 12098 => '文', + 12099 => '斗', + 12100 => '斤', + 12101 => '方', + 12102 => '无', + 12103 => '日', + 12104 => '曰', + 12105 => '月', + 12106 => '木', + 12107 => '欠', + 12108 => '止', + 12109 => '歹', + 12110 => '殳', + 12111 => '毋', + 12112 => '比', + 12113 => '毛', + 12114 => '氏', + 12115 => '气', + 12116 => '水', + 12117 => '火', + 12118 => '爪', + 12119 => '父', + 12120 => '爻', + 12121 => '爿', + 12122 => '片', + 12123 => '牙', + 12124 => '牛', + 12125 => '犬', + 12126 => '玄', + 12127 => '玉', + 12128 => '瓜', + 12129 => '瓦', + 12130 => '甘', + 12131 => '生', + 12132 => '用', + 12133 => '田', + 12134 => '疋', + 12135 => '疒', + 12136 => '癶', + 12137 => '白', + 12138 => '皮', + 12139 => '皿', + 12140 => '目', + 12141 => '矛', + 12142 => '矢', + 12143 => '石', + 12144 => '示', + 12145 => '禸', + 12146 => '禾', + 12147 => '穴', + 12148 => '立', + 12149 => '竹', + 12150 => '米', + 12151 => '糸', + 12152 => '缶', + 12153 => '网', + 12154 => '羊', + 12155 => '羽', + 12156 => '老', + 12157 => '而', + 12158 => '耒', + 12159 => '耳', + 12160 => '聿', + 12161 => '肉', + 12162 => '臣', + 12163 => '自', + 12164 => '至', + 12165 => '臼', + 12166 => '舌', + 12167 => '舛', + 12168 => '舟', + 12169 => '艮', + 12170 => '色', + 12171 => '艸', + 12172 => '虍', + 12173 => '虫', + 12174 => '血', + 12175 => '行', + 12176 => '衣', + 12177 => '襾', + 12178 => '見', + 12179 => '角', + 12180 => '言', + 12181 => '谷', + 12182 => '豆', + 12183 => '豕', + 12184 => '豸', + 12185 => '貝', + 12186 => '赤', + 12187 => '走', + 12188 => '足', + 12189 => '身', + 12190 => '車', + 12191 => '辛', + 12192 => '辰', + 12193 => '辵', + 12194 => '邑', + 12195 => '酉', + 12196 => '釆', + 12197 => '里', + 12198 => '金', + 12199 => '長', + 12200 => '門', + 12201 => '阜', + 12202 => '隶', + 12203 => '隹', + 12204 => '雨', + 12205 => '靑', + 12206 => '非', + 12207 => '面', + 12208 => '革', + 12209 => '韋', + 12210 => '韭', + 12211 => '音', + 12212 => '頁', + 12213 => '風', + 12214 => '飛', + 12215 => '食', + 12216 => '首', + 12217 => '香', + 12218 => '馬', + 12219 => '骨', + 12220 => '高', + 12221 => '髟', + 12222 => '鬥', + 12223 => '鬯', + 12224 => '鬲', + 12225 => '鬼', + 12226 => '魚', + 12227 => '鳥', + 12228 => '鹵', + 12229 => '鹿', + 12230 => '麥', + 12231 => '麻', + 12232 => '黃', + 12233 => '黍', + 12234 => '黑', + 12235 => '黹', + 12236 => '黽', + 12237 => '鼎', + 12238 => '鼓', + 12239 => '鼠', + 12240 => '鼻', + 12241 => '齊', + 12242 => '齒', + 12243 => '龍', + 12244 => '龜', + 12245 => '龠', + 12290 => '.', + 12342 => '〒', + 12344 => '十', + 12345 => '卄', + 12346 => '卅', + 12447 => 'より', + 12543 => 'コト', + 12593 => 'ᄀ', + 12594 => 'ᄁ', + 12595 => 'ᆪ', + 12596 => 'ᄂ', + 12597 => 'ᆬ', + 12598 => 'ᆭ', + 12599 => 'ᄃ', + 12600 => 'ᄄ', + 12601 => 'ᄅ', + 12602 => 'ᆰ', + 12603 => 'ᆱ', + 12604 => 'ᆲ', + 12605 => 'ᆳ', + 12606 => 'ᆴ', + 12607 => 'ᆵ', + 12608 => 'ᄚ', + 12609 => 'ᄆ', + 12610 => 'ᄇ', + 12611 => 'ᄈ', + 12612 => 'ᄡ', + 12613 => 'ᄉ', + 12614 => 'ᄊ', + 12615 => 'ᄋ', + 12616 => 'ᄌ', + 12617 => 'ᄍ', + 12618 => 'ᄎ', + 12619 => 'ᄏ', + 12620 => 'ᄐ', + 12621 => 'ᄑ', + 12622 => 'ᄒ', + 12623 => 'ᅡ', + 12624 => 'ᅢ', + 12625 => 'ᅣ', + 12626 => 'ᅤ', + 12627 => 'ᅥ', + 12628 => 'ᅦ', + 12629 => 'ᅧ', + 12630 => 'ᅨ', + 12631 => 'ᅩ', + 12632 => 'ᅪ', + 12633 => 'ᅫ', + 12634 => 'ᅬ', + 12635 => 'ᅭ', + 12636 => 'ᅮ', + 12637 => 'ᅯ', + 12638 => 'ᅰ', + 12639 => 'ᅱ', + 12640 => 'ᅲ', + 12641 => 'ᅳ', + 12642 => 'ᅴ', + 12643 => 'ᅵ', + 12645 => 'ᄔ', + 12646 => 'ᄕ', + 12647 => 'ᇇ', + 12648 => 'ᇈ', + 12649 => 'ᇌ', + 12650 => 'ᇎ', + 12651 => 'ᇓ', + 12652 => 'ᇗ', + 12653 => 'ᇙ', + 12654 => 'ᄜ', + 12655 => 'ᇝ', + 12656 => 'ᇟ', + 12657 => 'ᄝ', + 12658 => 'ᄞ', + 12659 => 'ᄠ', + 12660 => 'ᄢ', + 12661 => 'ᄣ', + 12662 => 'ᄧ', + 12663 => 'ᄩ', + 12664 => 'ᄫ', + 12665 => 'ᄬ', + 12666 => 'ᄭ', + 12667 => 'ᄮ', + 12668 => 'ᄯ', + 12669 => 'ᄲ', + 12670 => 'ᄶ', + 12671 => 'ᅀ', + 12672 => 'ᅇ', + 12673 => 'ᅌ', + 12674 => 'ᇱ', + 12675 => 'ᇲ', + 12676 => 'ᅗ', + 12677 => 'ᅘ', + 12678 => 'ᅙ', + 12679 => 'ᆄ', + 12680 => 'ᆅ', + 12681 => 'ᆈ', + 12682 => 'ᆑ', + 12683 => 'ᆒ', + 12684 => 'ᆔ', + 12685 => 'ᆞ', + 12686 => 'ᆡ', + 12690 => '一', + 12691 => '二', + 12692 => '三', + 12693 => '四', + 12694 => '上', + 12695 => '中', + 12696 => '下', + 12697 => '甲', + 12698 => '乙', + 12699 => '丙', + 12700 => '丁', + 12701 => '天', + 12702 => '地', + 12703 => '人', + 12868 => '問', + 12869 => '幼', + 12870 => '文', + 12871 => '箏', + 12880 => 'pte', + 12881 => '21', + 12882 => '22', + 12883 => '23', + 12884 => '24', + 12885 => '25', + 12886 => '26', + 12887 => '27', + 12888 => '28', + 12889 => '29', + 12890 => '30', + 12891 => '31', + 12892 => '32', + 12893 => '33', + 12894 => '34', + 12895 => '35', + 12896 => 'ᄀ', + 12897 => 'ᄂ', + 12898 => 'ᄃ', + 12899 => 'ᄅ', + 12900 => 'ᄆ', + 12901 => 'ᄇ', + 12902 => 'ᄉ', + 12903 => 'ᄋ', + 12904 => 'ᄌ', + 12905 => 'ᄎ', + 12906 => 'ᄏ', + 12907 => 'ᄐ', + 12908 => 'ᄑ', + 12909 => 'ᄒ', + 12910 => '가', + 12911 => '나', + 12912 => '다', + 12913 => '라', + 12914 => '마', + 12915 => '바', + 12916 => '사', + 12917 => '아', + 12918 => '자', + 12919 => '차', + 12920 => '카', + 12921 => '타', + 12922 => '파', + 12923 => '하', + 12924 => '참고', + 12925 => '주의', + 12926 => '우', + 12928 => '一', + 12929 => '二', + 12930 => '三', + 12931 => '四', + 12932 => '五', + 12933 => '六', + 12934 => '七', + 12935 => '八', + 12936 => '九', + 12937 => '十', + 12938 => '月', + 12939 => '火', + 12940 => '水', + 12941 => '木', + 12942 => '金', + 12943 => '土', + 12944 => '日', + 12945 => '株', + 12946 => '有', + 12947 => '社', + 12948 => '名', + 12949 => '特', + 12950 => '財', + 12951 => '祝', + 12952 => '労', + 12953 => '秘', + 12954 => '男', + 12955 => '女', + 12956 => '適', + 12957 => '優', + 12958 => '印', + 12959 => '注', + 12960 => '項', + 12961 => '休', + 12962 => '写', + 12963 => '正', + 12964 => '上', + 12965 => '中', + 12966 => '下', + 12967 => '左', + 12968 => '右', + 12969 => '医', + 12970 => '宗', + 12971 => '学', + 12972 => '監', + 12973 => '企', + 12974 => '資', + 12975 => '協', + 12976 => '夜', + 12977 => '36', + 12978 => '37', + 12979 => '38', + 12980 => '39', + 12981 => '40', + 12982 => '41', + 12983 => '42', + 12984 => '43', + 12985 => '44', + 12986 => '45', + 12987 => '46', + 12988 => '47', + 12989 => '48', + 12990 => '49', + 12991 => '50', + 12992 => '1月', + 12993 => '2月', + 12994 => '3月', + 12995 => '4月', + 12996 => '5月', + 12997 => '6月', + 12998 => '7月', + 12999 => '8月', + 13000 => '9月', + 13001 => '10月', + 13002 => '11月', + 13003 => '12月', + 13004 => 'hg', + 13005 => 'erg', + 13006 => 'ev', + 13007 => 'ltd', + 13008 => 'ア', + 13009 => 'イ', + 13010 => 'ウ', + 13011 => 'エ', + 13012 => 'オ', + 13013 => 'カ', + 13014 => 'キ', + 13015 => 'ク', + 13016 => 'ケ', + 13017 => 'コ', + 13018 => 'サ', + 13019 => 'シ', + 13020 => 'ス', + 13021 => 'セ', + 13022 => 'ソ', + 13023 => 'タ', + 13024 => 'チ', + 13025 => 'ツ', + 13026 => 'テ', + 13027 => 'ト', + 13028 => 'ナ', + 13029 => 'ニ', + 13030 => 'ヌ', + 13031 => 'ネ', + 13032 => 'ノ', + 13033 => 'ハ', + 13034 => 'ヒ', + 13035 => 'フ', + 13036 => 'ヘ', + 13037 => 'ホ', + 13038 => 'マ', + 13039 => 'ミ', + 13040 => 'ム', + 13041 => 'メ', + 13042 => 'モ', + 13043 => 'ヤ', + 13044 => 'ユ', + 13045 => 'ヨ', + 13046 => 'ラ', + 13047 => 'リ', + 13048 => 'ル', + 13049 => 'レ', + 13050 => 'ロ', + 13051 => 'ワ', + 13052 => 'ヰ', + 13053 => 'ヱ', + 13054 => 'ヲ', + 13055 => '令和', + 13056 => 'アパート', + 13057 => 'アルファ', + 13058 => 'アンペア', + 13059 => 'アール', + 13060 => 'イニング', + 13061 => 'インチ', + 13062 => 'ウォン', + 13063 => 'エスクード', + 13064 => 'エーカー', + 13065 => 'オンス', + 13066 => 'オーム', + 13067 => 'カイリ', + 13068 => 'カラット', + 13069 => 'カロリー', + 13070 => 'ガロン', + 13071 => 'ガンマ', + 13072 => 'ギガ', + 13073 => 'ギニー', + 13074 => 'キュリー', + 13075 => 'ギルダー', + 13076 => 'キロ', + 13077 => 'キログラム', + 13078 => 'キロメートル', + 13079 => 'キロワット', + 13080 => 'グラム', + 13081 => 'グラムトン', + 13082 => 'クルゼイロ', + 13083 => 'クローネ', + 13084 => 'ケース', + 13085 => 'コルナ', + 13086 => 'コーポ', + 13087 => 'サイクル', + 13088 => 'サンチーム', + 13089 => 'シリング', + 13090 => 'センチ', + 13091 => 'セント', + 13092 => 'ダース', + 13093 => 'デシ', + 13094 => 'ドル', + 13095 => 'トン', + 13096 => 'ナノ', + 13097 => 'ノット', + 13098 => 'ハイツ', + 13099 => 'パーセント', + 13100 => 'パーツ', + 13101 => 'バーレル', + 13102 => 'ピアストル', + 13103 => 'ピクル', + 13104 => 'ピコ', + 13105 => 'ビル', + 13106 => 'ファラッド', + 13107 => 'フィート', + 13108 => 'ブッシェル', + 13109 => 'フラン', + 13110 => 'ヘクタール', + 13111 => 'ペソ', + 13112 => 'ペニヒ', + 13113 => 'ヘルツ', + 13114 => 'ペンス', + 13115 => 'ページ', + 13116 => 'ベータ', + 13117 => 'ポイント', + 13118 => 'ボルト', + 13119 => 'ホン', + 13120 => 'ポンド', + 13121 => 'ホール', + 13122 => 'ホーン', + 13123 => 'マイクロ', + 13124 => 'マイル', + 13125 => 'マッハ', + 13126 => 'マルク', + 13127 => 'マンション', + 13128 => 'ミクロン', + 13129 => 'ミリ', + 13130 => 'ミリバール', + 13131 => 'メガ', + 13132 => 'メガトン', + 13133 => 'メートル', + 13134 => 'ヤード', + 13135 => 'ヤール', + 13136 => 'ユアン', + 13137 => 'リットル', + 13138 => 'リラ', + 13139 => 'ルピー', + 13140 => 'ルーブル', + 13141 => 'レム', + 13142 => 'レントゲン', + 13143 => 'ワット', + 13144 => '0点', + 13145 => '1点', + 13146 => '2点', + 13147 => '3点', + 13148 => '4点', + 13149 => '5点', + 13150 => '6点', + 13151 => '7点', + 13152 => '8点', + 13153 => '9点', + 13154 => '10点', + 13155 => '11点', + 13156 => '12点', + 13157 => '13点', + 13158 => '14点', + 13159 => '15点', + 13160 => '16点', + 13161 => '17点', + 13162 => '18点', + 13163 => '19点', + 13164 => '20点', + 13165 => '21点', + 13166 => '22点', + 13167 => '23点', + 13168 => '24点', + 13169 => 'hpa', + 13170 => 'da', + 13171 => 'au', + 13172 => 'bar', + 13173 => 'ov', + 13174 => 'pc', + 13175 => 'dm', + 13176 => 'dm2', + 13177 => 'dm3', + 13178 => 'iu', + 13179 => '平成', + 13180 => '昭和', + 13181 => '大正', + 13182 => '明治', + 13183 => '株式会社', + 13184 => 'pa', + 13185 => 'na', + 13186 => 'μa', + 13187 => 'ma', + 13188 => 'ka', + 13189 => 'kb', + 13190 => 'mb', + 13191 => 'gb', + 13192 => 'cal', + 13193 => 'kcal', + 13194 => 'pf', + 13195 => 'nf', + 13196 => 'μf', + 13197 => 'μg', + 13198 => 'mg', + 13199 => 'kg', + 13200 => 'hz', + 13201 => 'khz', + 13202 => 'mhz', + 13203 => 'ghz', + 13204 => 'thz', + 13205 => 'μl', + 13206 => 'ml', + 13207 => 'dl', + 13208 => 'kl', + 13209 => 'fm', + 13210 => 'nm', + 13211 => 'μm', + 13212 => 'mm', + 13213 => 'cm', + 13214 => 'km', + 13215 => 'mm2', + 13216 => 'cm2', + 13217 => 'm2', + 13218 => 'km2', + 13219 => 'mm3', + 13220 => 'cm3', + 13221 => 'm3', + 13222 => 'km3', + 13223 => 'm∕s', + 13224 => 'm∕s2', + 13225 => 'pa', + 13226 => 'kpa', + 13227 => 'mpa', + 13228 => 'gpa', + 13229 => 'rad', + 13230 => 'rad∕s', + 13231 => 'rad∕s2', + 13232 => 'ps', + 13233 => 'ns', + 13234 => 'μs', + 13235 => 'ms', + 13236 => 'pv', + 13237 => 'nv', + 13238 => 'μv', + 13239 => 'mv', + 13240 => 'kv', + 13241 => 'mv', + 13242 => 'pw', + 13243 => 'nw', + 13244 => 'μw', + 13245 => 'mw', + 13246 => 'kw', + 13247 => 'mw', + 13248 => 'kω', + 13249 => 'mω', + 13251 => 'bq', + 13252 => 'cc', + 13253 => 'cd', + 13254 => 'c∕kg', + 13256 => 'db', + 13257 => 'gy', + 13258 => 'ha', + 13259 => 'hp', + 13260 => 'in', + 13261 => 'kk', + 13262 => 'km', + 13263 => 'kt', + 13264 => 'lm', + 13265 => 'ln', + 13266 => 'log', + 13267 => 'lx', + 13268 => 'mb', + 13269 => 'mil', + 13270 => 'mol', + 13271 => 'ph', + 13273 => 'ppm', + 13274 => 'pr', + 13275 => 'sr', + 13276 => 'sv', + 13277 => 'wb', + 13278 => 'v∕m', + 13279 => 'a∕m', + 13280 => '1日', + 13281 => '2日', + 13282 => '3日', + 13283 => '4日', + 13284 => '5日', + 13285 => '6日', + 13286 => '7日', + 13287 => '8日', + 13288 => '9日', + 13289 => '10日', + 13290 => '11日', + 13291 => '12日', + 13292 => '13日', + 13293 => '14日', + 13294 => '15日', + 13295 => '16日', + 13296 => '17日', + 13297 => '18日', + 13298 => '19日', + 13299 => '20日', + 13300 => '21日', + 13301 => '22日', + 13302 => '23日', + 13303 => '24日', + 13304 => '25日', + 13305 => '26日', + 13306 => '27日', + 13307 => '28日', + 13308 => '29日', + 13309 => '30日', + 13310 => '31日', + 13311 => 'gal', + 42560 => 'ꙁ', + 42562 => 'ꙃ', + 42564 => 'ꙅ', + 42566 => 'ꙇ', + 42568 => 'ꙉ', + 42570 => 'ꙋ', + 42572 => 'ꙍ', + 42574 => 'ꙏ', + 42576 => 'ꙑ', + 42578 => 'ꙓ', + 42580 => 'ꙕ', + 42582 => 'ꙗ', + 42584 => 'ꙙ', + 42586 => 'ꙛ', + 42588 => 'ꙝ', + 42590 => 'ꙟ', + 42592 => 'ꙡ', + 42594 => 'ꙣ', + 42596 => 'ꙥ', + 42598 => 'ꙧ', + 42600 => 'ꙩ', + 42602 => 'ꙫ', + 42604 => 'ꙭ', + 42624 => 'ꚁ', + 42626 => 'ꚃ', + 42628 => 'ꚅ', + 42630 => 'ꚇ', + 42632 => 'ꚉ', + 42634 => 'ꚋ', + 42636 => 'ꚍ', + 42638 => 'ꚏ', + 42640 => 'ꚑ', + 42642 => 'ꚓ', + 42644 => 'ꚕ', + 42646 => 'ꚗ', + 42648 => 'ꚙ', + 42650 => 'ꚛ', + 42652 => 'ъ', + 42653 => 'ь', + 42786 => 'ꜣ', + 42788 => 'ꜥ', + 42790 => 'ꜧ', + 42792 => 'ꜩ', + 42794 => 'ꜫ', + 42796 => 'ꜭ', + 42798 => 'ꜯ', + 42802 => 'ꜳ', + 42804 => 'ꜵ', + 42806 => 'ꜷ', + 42808 => 'ꜹ', + 42810 => 'ꜻ', + 42812 => 'ꜽ', + 42814 => 'ꜿ', + 42816 => 'ꝁ', + 42818 => 'ꝃ', + 42820 => 'ꝅ', + 42822 => 'ꝇ', + 42824 => 'ꝉ', + 42826 => 'ꝋ', + 42828 => 'ꝍ', + 42830 => 'ꝏ', + 42832 => 'ꝑ', + 42834 => 'ꝓ', + 42836 => 'ꝕ', + 42838 => 'ꝗ', + 42840 => 'ꝙ', + 42842 => 'ꝛ', + 42844 => 'ꝝ', + 42846 => 'ꝟ', + 42848 => 'ꝡ', + 42850 => 'ꝣ', + 42852 => 'ꝥ', + 42854 => 'ꝧ', + 42856 => 'ꝩ', + 42858 => 'ꝫ', + 42860 => 'ꝭ', + 42862 => 'ꝯ', + 42864 => 'ꝯ', + 42873 => 'ꝺ', + 42875 => 'ꝼ', + 42877 => 'ᵹ', + 42878 => 'ꝿ', + 42880 => 'ꞁ', + 42882 => 'ꞃ', + 42884 => 'ꞅ', + 42886 => 'ꞇ', + 42891 => 'ꞌ', + 42893 => 'ɥ', + 42896 => 'ꞑ', + 42898 => 'ꞓ', + 42902 => 'ꞗ', + 42904 => 'ꞙ', + 42906 => 'ꞛ', + 42908 => 'ꞝ', + 42910 => 'ꞟ', + 42912 => 'ꞡ', + 42914 => 'ꞣ', + 42916 => 'ꞥ', + 42918 => 'ꞧ', + 42920 => 'ꞩ', + 42922 => 'ɦ', + 42923 => 'ɜ', + 42924 => 'ɡ', + 42925 => 'ɬ', + 42926 => 'ɪ', + 42928 => 'ʞ', + 42929 => 'ʇ', + 42930 => 'ʝ', + 42931 => 'ꭓ', + 42932 => 'ꞵ', + 42934 => 'ꞷ', + 42936 => 'ꞹ', + 42938 => 'ꞻ', + 42940 => 'ꞽ', + 42942 => 'ꞿ', + 42946 => 'ꟃ', + 42948 => 'ꞔ', + 42949 => 'ʂ', + 42950 => 'ᶎ', + 42951 => 'ꟈ', + 42953 => 'ꟊ', + 42997 => 'ꟶ', + 43000 => 'ħ', + 43001 => 'œ', + 43868 => 'ꜧ', + 43869 => 'ꬷ', + 43870 => 'ɫ', + 43871 => 'ꭒ', + 43881 => 'ʍ', + 43888 => 'Ꭰ', + 43889 => 'Ꭱ', + 43890 => 'Ꭲ', + 43891 => 'Ꭳ', + 43892 => 'Ꭴ', + 43893 => 'Ꭵ', + 43894 => 'Ꭶ', + 43895 => 'Ꭷ', + 43896 => 'Ꭸ', + 43897 => 'Ꭹ', + 43898 => 'Ꭺ', + 43899 => 'Ꭻ', + 43900 => 'Ꭼ', + 43901 => 'Ꭽ', + 43902 => 'Ꭾ', + 43903 => 'Ꭿ', + 43904 => 'Ꮀ', + 43905 => 'Ꮁ', + 43906 => 'Ꮂ', + 43907 => 'Ꮃ', + 43908 => 'Ꮄ', + 43909 => 'Ꮅ', + 43910 => 'Ꮆ', + 43911 => 'Ꮇ', + 43912 => 'Ꮈ', + 43913 => 'Ꮉ', + 43914 => 'Ꮊ', + 43915 => 'Ꮋ', + 43916 => 'Ꮌ', + 43917 => 'Ꮍ', + 43918 => 'Ꮎ', + 43919 => 'Ꮏ', + 43920 => 'Ꮐ', + 43921 => 'Ꮑ', + 43922 => 'Ꮒ', + 43923 => 'Ꮓ', + 43924 => 'Ꮔ', + 43925 => 'Ꮕ', + 43926 => 'Ꮖ', + 43927 => 'Ꮗ', + 43928 => 'Ꮘ', + 43929 => 'Ꮙ', + 43930 => 'Ꮚ', + 43931 => 'Ꮛ', + 43932 => 'Ꮜ', + 43933 => 'Ꮝ', + 43934 => 'Ꮞ', + 43935 => 'Ꮟ', + 43936 => 'Ꮠ', + 43937 => 'Ꮡ', + 43938 => 'Ꮢ', + 43939 => 'Ꮣ', + 43940 => 'Ꮤ', + 43941 => 'Ꮥ', + 43942 => 'Ꮦ', + 43943 => 'Ꮧ', + 43944 => 'Ꮨ', + 43945 => 'Ꮩ', + 43946 => 'Ꮪ', + 43947 => 'Ꮫ', + 43948 => 'Ꮬ', + 43949 => 'Ꮭ', + 43950 => 'Ꮮ', + 43951 => 'Ꮯ', + 43952 => 'Ꮰ', + 43953 => 'Ꮱ', + 43954 => 'Ꮲ', + 43955 => 'Ꮳ', + 43956 => 'Ꮴ', + 43957 => 'Ꮵ', + 43958 => 'Ꮶ', + 43959 => 'Ꮷ', + 43960 => 'Ꮸ', + 43961 => 'Ꮹ', + 43962 => 'Ꮺ', + 43963 => 'Ꮻ', + 43964 => 'Ꮼ', + 43965 => 'Ꮽ', + 43966 => 'Ꮾ', + 43967 => 'Ꮿ', + 63744 => '豈', + 63745 => '更', + 63746 => '車', + 63747 => '賈', + 63748 => '滑', + 63749 => '串', + 63750 => '句', + 63751 => '龜', + 63752 => '龜', + 63753 => '契', + 63754 => '金', + 63755 => '喇', + 63756 => '奈', + 63757 => '懶', + 63758 => '癩', + 63759 => '羅', + 63760 => '蘿', + 63761 => '螺', + 63762 => '裸', + 63763 => '邏', + 63764 => '樂', + 63765 => '洛', + 63766 => '烙', + 63767 => '珞', + 63768 => '落', + 63769 => '酪', + 63770 => '駱', + 63771 => '亂', + 63772 => '卵', + 63773 => '欄', + 63774 => '爛', + 63775 => '蘭', + 63776 => '鸞', + 63777 => '嵐', + 63778 => '濫', + 63779 => '藍', + 63780 => '襤', + 63781 => '拉', + 63782 => '臘', + 63783 => '蠟', + 63784 => '廊', + 63785 => '朗', + 63786 => '浪', + 63787 => '狼', + 63788 => '郎', + 63789 => '來', + 63790 => '冷', + 63791 => '勞', + 63792 => '擄', + 63793 => '櫓', + 63794 => '爐', + 63795 => '盧', + 63796 => '老', + 63797 => '蘆', + 63798 => '虜', + 63799 => '路', + 63800 => '露', + 63801 => '魯', + 63802 => '鷺', + 63803 => '碌', + 63804 => '祿', + 63805 => '綠', + 63806 => '菉', + 63807 => '錄', + 63808 => '鹿', + 63809 => '論', + 63810 => '壟', + 63811 => '弄', + 63812 => '籠', + 63813 => '聾', + 63814 => '牢', + 63815 => '磊', + 63816 => '賂', + 63817 => '雷', + 63818 => '壘', + 63819 => '屢', + 63820 => '樓', + 63821 => '淚', + 63822 => '漏', + 63823 => '累', + 63824 => '縷', + 63825 => '陋', + 63826 => '勒', + 63827 => '肋', + 63828 => '凜', + 63829 => '凌', + 63830 => '稜', + 63831 => '綾', + 63832 => '菱', + 63833 => '陵', + 63834 => '讀', + 63835 => '拏', + 63836 => '樂', + 63837 => '諾', + 63838 => '丹', + 63839 => '寧', + 63840 => '怒', + 63841 => '率', + 63842 => '異', + 63843 => '北', + 63844 => '磻', + 63845 => '便', + 63846 => '復', + 63847 => '不', + 63848 => '泌', + 63849 => '數', + 63850 => '索', + 63851 => '參', + 63852 => '塞', + 63853 => '省', + 63854 => '葉', + 63855 => '說', + 63856 => '殺', + 63857 => '辰', + 63858 => '沈', + 63859 => '拾', + 63860 => '若', + 63861 => '掠', + 63862 => '略', + 63863 => '亮', + 63864 => '兩', + 63865 => '凉', + 63866 => '梁', + 63867 => '糧', + 63868 => '良', + 63869 => '諒', + 63870 => '量', + 63871 => '勵', + 63872 => '呂', + 63873 => '女', + 63874 => '廬', + 63875 => '旅', + 63876 => '濾', + 63877 => '礪', + 63878 => '閭', + 63879 => '驪', + 63880 => '麗', + 63881 => '黎', + 63882 => '力', + 63883 => '曆', + 63884 => '歷', + 63885 => '轢', + 63886 => '年', + 63887 => '憐', + 63888 => '戀', + 63889 => '撚', + 63890 => '漣', + 63891 => '煉', + 63892 => '璉', + 63893 => '秊', + 63894 => '練', + 63895 => '聯', + 63896 => '輦', + 63897 => '蓮', + 63898 => '連', + 63899 => '鍊', + 63900 => '列', + 63901 => '劣', + 63902 => '咽', + 63903 => '烈', + 63904 => '裂', + 63905 => '說', + 63906 => '廉', + 63907 => '念', + 63908 => '捻', + 63909 => '殮', + 63910 => '簾', + 63911 => '獵', + 63912 => '令', + 63913 => '囹', + 63914 => '寧', + 63915 => '嶺', + 63916 => '怜', + 63917 => '玲', + 63918 => '瑩', + 63919 => '羚', + 63920 => '聆', + 63921 => '鈴', + 63922 => '零', + 63923 => '靈', + 63924 => '領', + 63925 => '例', + 63926 => '禮', + 63927 => '醴', + 63928 => '隸', + 63929 => '惡', + 63930 => '了', + 63931 => '僚', + 63932 => '寮', + 63933 => '尿', + 63934 => '料', + 63935 => '樂', + 63936 => '燎', + 63937 => '療', + 63938 => '蓼', + 63939 => '遼', + 63940 => '龍', + 63941 => '暈', + 63942 => '阮', + 63943 => '劉', + 63944 => '杻', + 63945 => '柳', + 63946 => '流', + 63947 => '溜', + 63948 => '琉', + 63949 => '留', + 63950 => '硫', + 63951 => '紐', + 63952 => '類', + 63953 => '六', + 63954 => '戮', + 63955 => '陸', + 63956 => '倫', + 63957 => '崙', + 63958 => '淪', + 63959 => '輪', + 63960 => '律', + 63961 => '慄', + 63962 => '栗', + 63963 => '率', + 63964 => '隆', + 63965 => '利', + 63966 => '吏', + 63967 => '履', + 63968 => '易', + 63969 => '李', + 63970 => '梨', + 63971 => '泥', + 63972 => '理', + 63973 => '痢', + 63974 => '罹', + 63975 => '裏', + 63976 => '裡', + 63977 => '里', + 63978 => '離', + 63979 => '匿', + 63980 => '溺', + 63981 => '吝', + 63982 => '燐', + 63983 => '璘', + 63984 => '藺', + 63985 => '隣', + 63986 => '鱗', + 63987 => '麟', + 63988 => '林', + 63989 => '淋', + 63990 => '臨', + 63991 => '立', + 63992 => '笠', + 63993 => '粒', + 63994 => '狀', + 63995 => '炙', + 63996 => '識', + 63997 => '什', + 63998 => '茶', + 63999 => '刺', + 64000 => '切', + 64001 => '度', + 64002 => '拓', + 64003 => '糖', + 64004 => '宅', + 64005 => '洞', + 64006 => '暴', + 64007 => '輻', + 64008 => '行', + 64009 => '降', + 64010 => '見', + 64011 => '廓', + 64012 => '兀', + 64013 => '嗀', + 64016 => '塚', + 64018 => '晴', + 64021 => '凞', + 64022 => '猪', + 64023 => '益', + 64024 => '礼', + 64025 => '神', + 64026 => '祥', + 64027 => '福', + 64028 => '靖', + 64029 => '精', + 64030 => '羽', + 64032 => '蘒', + 64034 => '諸', + 64037 => '逸', + 64038 => '都', + 64042 => '飯', + 64043 => '飼', + 64044 => '館', + 64045 => '鶴', + 64046 => '郞', + 64047 => '隷', + 64048 => '侮', + 64049 => '僧', + 64050 => '免', + 64051 => '勉', + 64052 => '勤', + 64053 => '卑', + 64054 => '喝', + 64055 => '嘆', + 64056 => '器', + 64057 => '塀', + 64058 => '墨', + 64059 => '層', + 64060 => '屮', + 64061 => '悔', + 64062 => '慨', + 64063 => '憎', + 64064 => '懲', + 64065 => '敏', + 64066 => '既', + 64067 => '暑', + 64068 => '梅', + 64069 => '海', + 64070 => '渚', + 64071 => '漢', + 64072 => '煮', + 64073 => '爫', + 64074 => '琢', + 64075 => '碑', + 64076 => '社', + 64077 => '祉', + 64078 => '祈', + 64079 => '祐', + 64080 => '祖', + 64081 => '祝', + 64082 => '禍', + 64083 => '禎', + 64084 => '穀', + 64085 => '突', + 64086 => '節', + 64087 => '練', + 64088 => '縉', + 64089 => '繁', + 64090 => '署', + 64091 => '者', + 64092 => '臭', + 64093 => '艹', + 64094 => '艹', + 64095 => '著', + 64096 => '褐', + 64097 => '視', + 64098 => '謁', + 64099 => '謹', + 64100 => '賓', + 64101 => '贈', + 64102 => '辶', + 64103 => '逸', + 64104 => '難', + 64105 => '響', + 64106 => '頻', + 64107 => '恵', + 64108 => '𤋮', + 64109 => '舘', + 64112 => '並', + 64113 => '况', + 64114 => '全', + 64115 => '侀', + 64116 => '充', + 64117 => '冀', + 64118 => '勇', + 64119 => '勺', + 64120 => '喝', + 64121 => '啕', + 64122 => '喙', + 64123 => '嗢', + 64124 => '塚', + 64125 => '墳', + 64126 => '奄', + 64127 => '奔', + 64128 => '婢', + 64129 => '嬨', + 64130 => '廒', + 64131 => '廙', + 64132 => '彩', + 64133 => '徭', + 64134 => '惘', + 64135 => '慎', + 64136 => '愈', + 64137 => '憎', + 64138 => '慠', + 64139 => '懲', + 64140 => '戴', + 64141 => '揄', + 64142 => '搜', + 64143 => '摒', + 64144 => '敖', + 64145 => '晴', + 64146 => '朗', + 64147 => '望', + 64148 => '杖', + 64149 => '歹', + 64150 => '殺', + 64151 => '流', + 64152 => '滛', + 64153 => '滋', + 64154 => '漢', + 64155 => '瀞', + 64156 => '煮', + 64157 => '瞧', + 64158 => '爵', + 64159 => '犯', + 64160 => '猪', + 64161 => '瑱', + 64162 => '甆', + 64163 => '画', + 64164 => '瘝', + 64165 => '瘟', + 64166 => '益', + 64167 => '盛', + 64168 => '直', + 64169 => '睊', + 64170 => '着', + 64171 => '磌', + 64172 => '窱', + 64173 => '節', + 64174 => '类', + 64175 => '絛', + 64176 => '練', + 64177 => '缾', + 64178 => '者', + 64179 => '荒', + 64180 => '華', + 64181 => '蝹', + 64182 => '襁', + 64183 => '覆', + 64184 => '視', + 64185 => '調', + 64186 => '諸', + 64187 => '請', + 64188 => '謁', + 64189 => '諾', + 64190 => '諭', + 64191 => '謹', + 64192 => '變', + 64193 => '贈', + 64194 => '輸', + 64195 => '遲', + 64196 => '醙', + 64197 => '鉶', + 64198 => '陼', + 64199 => '難', + 64200 => '靖', + 64201 => '韛', + 64202 => '響', + 64203 => '頋', + 64204 => '頻', + 64205 => '鬒', + 64206 => '龜', + 64207 => '𢡊', + 64208 => '𢡄', + 64209 => '𣏕', + 64210 => '㮝', + 64211 => '䀘', + 64212 => '䀹', + 64213 => '𥉉', + 64214 => '𥳐', + 64215 => '𧻓', + 64216 => '齃', + 64217 => '龎', + 64256 => 'ff', + 64257 => 'fi', + 64258 => 'fl', + 64259 => 'ffi', + 64260 => 'ffl', + 64261 => 'st', + 64262 => 'st', + 64275 => 'մն', + 64276 => 'մե', + 64277 => 'մի', + 64278 => 'վն', + 64279 => 'մխ', + 64285 => 'יִ', + 64287 => 'ײַ', + 64288 => 'ע', + 64289 => 'א', + 64290 => 'ד', + 64291 => 'ה', + 64292 => 'כ', + 64293 => 'ל', + 64294 => 'ם', + 64295 => 'ר', + 64296 => 'ת', + 64298 => 'שׁ', + 64299 => 'שׂ', + 64300 => 'שּׁ', + 64301 => 'שּׂ', + 64302 => 'אַ', + 64303 => 'אָ', + 64304 => 'אּ', + 64305 => 'בּ', + 64306 => 'גּ', + 64307 => 'דּ', + 64308 => 'הּ', + 64309 => 'וּ', + 64310 => 'זּ', + 64312 => 'טּ', + 64313 => 'יּ', + 64314 => 'ךּ', + 64315 => 'כּ', + 64316 => 'לּ', + 64318 => 'מּ', + 64320 => 'נּ', + 64321 => 'סּ', + 64323 => 'ףּ', + 64324 => 'פּ', + 64326 => 'צּ', + 64327 => 'קּ', + 64328 => 'רּ', + 64329 => 'שּ', + 64330 => 'תּ', + 64331 => 'וֹ', + 64332 => 'בֿ', + 64333 => 'כֿ', + 64334 => 'פֿ', + 64335 => 'אל', + 64336 => 'ٱ', + 64337 => 'ٱ', + 64338 => 'ٻ', + 64339 => 'ٻ', + 64340 => 'ٻ', + 64341 => 'ٻ', + 64342 => 'پ', + 64343 => 'پ', + 64344 => 'پ', + 64345 => 'پ', + 64346 => 'ڀ', + 64347 => 'ڀ', + 64348 => 'ڀ', + 64349 => 'ڀ', + 64350 => 'ٺ', + 64351 => 'ٺ', + 64352 => 'ٺ', + 64353 => 'ٺ', + 64354 => 'ٿ', + 64355 => 'ٿ', + 64356 => 'ٿ', + 64357 => 'ٿ', + 64358 => 'ٹ', + 64359 => 'ٹ', + 64360 => 'ٹ', + 64361 => 'ٹ', + 64362 => 'ڤ', + 64363 => 'ڤ', + 64364 => 'ڤ', + 64365 => 'ڤ', + 64366 => 'ڦ', + 64367 => 'ڦ', + 64368 => 'ڦ', + 64369 => 'ڦ', + 64370 => 'ڄ', + 64371 => 'ڄ', + 64372 => 'ڄ', + 64373 => 'ڄ', + 64374 => 'ڃ', + 64375 => 'ڃ', + 64376 => 'ڃ', + 64377 => 'ڃ', + 64378 => 'چ', + 64379 => 'چ', + 64380 => 'چ', + 64381 => 'چ', + 64382 => 'ڇ', + 64383 => 'ڇ', + 64384 => 'ڇ', + 64385 => 'ڇ', + 64386 => 'ڍ', + 64387 => 'ڍ', + 64388 => 'ڌ', + 64389 => 'ڌ', + 64390 => 'ڎ', + 64391 => 'ڎ', + 64392 => 'ڈ', + 64393 => 'ڈ', + 64394 => 'ژ', + 64395 => 'ژ', + 64396 => 'ڑ', + 64397 => 'ڑ', + 64398 => 'ک', + 64399 => 'ک', + 64400 => 'ک', + 64401 => 'ک', + 64402 => 'گ', + 64403 => 'گ', + 64404 => 'گ', + 64405 => 'گ', + 64406 => 'ڳ', + 64407 => 'ڳ', + 64408 => 'ڳ', + 64409 => 'ڳ', + 64410 => 'ڱ', + 64411 => 'ڱ', + 64412 => 'ڱ', + 64413 => 'ڱ', + 64414 => 'ں', + 64415 => 'ں', + 64416 => 'ڻ', + 64417 => 'ڻ', + 64418 => 'ڻ', + 64419 => 'ڻ', + 64420 => 'ۀ', + 64421 => 'ۀ', + 64422 => 'ہ', + 64423 => 'ہ', + 64424 => 'ہ', + 64425 => 'ہ', + 64426 => 'ھ', + 64427 => 'ھ', + 64428 => 'ھ', + 64429 => 'ھ', + 64430 => 'ے', + 64431 => 'ے', + 64432 => 'ۓ', + 64433 => 'ۓ', + 64467 => 'ڭ', + 64468 => 'ڭ', + 64469 => 'ڭ', + 64470 => 'ڭ', + 64471 => 'ۇ', + 64472 => 'ۇ', + 64473 => 'ۆ', + 64474 => 'ۆ', + 64475 => 'ۈ', + 64476 => 'ۈ', + 64477 => 'ۇٴ', + 64478 => 'ۋ', + 64479 => 'ۋ', + 64480 => 'ۅ', + 64481 => 'ۅ', + 64482 => 'ۉ', + 64483 => 'ۉ', + 64484 => 'ې', + 64485 => 'ې', + 64486 => 'ې', + 64487 => 'ې', + 64488 => 'ى', + 64489 => 'ى', + 64490 => 'ئا', + 64491 => 'ئا', + 64492 => 'ئە', + 64493 => 'ئە', + 64494 => 'ئو', + 64495 => 'ئو', + 64496 => 'ئۇ', + 64497 => 'ئۇ', + 64498 => 'ئۆ', + 64499 => 'ئۆ', + 64500 => 'ئۈ', + 64501 => 'ئۈ', + 64502 => 'ئې', + 64503 => 'ئې', + 64504 => 'ئې', + 64505 => 'ئى', + 64506 => 'ئى', + 64507 => 'ئى', + 64508 => 'ی', + 64509 => 'ی', + 64510 => 'ی', + 64511 => 'ی', + 64512 => 'ئج', + 64513 => 'ئح', + 64514 => 'ئم', + 64515 => 'ئى', + 64516 => 'ئي', + 64517 => 'بج', + 64518 => 'بح', + 64519 => 'بخ', + 64520 => 'بم', + 64521 => 'بى', + 64522 => 'بي', + 64523 => 'تج', + 64524 => 'تح', + 64525 => 'تخ', + 64526 => 'تم', + 64527 => 'تى', + 64528 => 'تي', + 64529 => 'ثج', + 64530 => 'ثم', + 64531 => 'ثى', + 64532 => 'ثي', + 64533 => 'جح', + 64534 => 'جم', + 64535 => 'حج', + 64536 => 'حم', + 64537 => 'خج', + 64538 => 'خح', + 64539 => 'خم', + 64540 => 'سج', + 64541 => 'سح', + 64542 => 'سخ', + 64543 => 'سم', + 64544 => 'صح', + 64545 => 'صم', + 64546 => 'ضج', + 64547 => 'ضح', + 64548 => 'ضخ', + 64549 => 'ضم', + 64550 => 'طح', + 64551 => 'طم', + 64552 => 'ظم', + 64553 => 'عج', + 64554 => 'عم', + 64555 => 'غج', + 64556 => 'غم', + 64557 => 'فج', + 64558 => 'فح', + 64559 => 'فخ', + 64560 => 'فم', + 64561 => 'فى', + 64562 => 'في', + 64563 => 'قح', + 64564 => 'قم', + 64565 => 'قى', + 64566 => 'قي', + 64567 => 'كا', + 64568 => 'كج', + 64569 => 'كح', + 64570 => 'كخ', + 64571 => 'كل', + 64572 => 'كم', + 64573 => 'كى', + 64574 => 'كي', + 64575 => 'لج', + 64576 => 'لح', + 64577 => 'لخ', + 64578 => 'لم', + 64579 => 'لى', + 64580 => 'لي', + 64581 => 'مج', + 64582 => 'مح', + 64583 => 'مخ', + 64584 => 'مم', + 64585 => 'مى', + 64586 => 'مي', + 64587 => 'نج', + 64588 => 'نح', + 64589 => 'نخ', + 64590 => 'نم', + 64591 => 'نى', + 64592 => 'ني', + 64593 => 'هج', + 64594 => 'هم', + 64595 => 'هى', + 64596 => 'هي', + 64597 => 'يج', + 64598 => 'يح', + 64599 => 'يخ', + 64600 => 'يم', + 64601 => 'يى', + 64602 => 'يي', + 64603 => 'ذٰ', + 64604 => 'رٰ', + 64605 => 'ىٰ', + 64612 => 'ئر', + 64613 => 'ئز', + 64614 => 'ئم', + 64615 => 'ئن', + 64616 => 'ئى', + 64617 => 'ئي', + 64618 => 'بر', + 64619 => 'بز', + 64620 => 'بم', + 64621 => 'بن', + 64622 => 'بى', + 64623 => 'بي', + 64624 => 'تر', + 64625 => 'تز', + 64626 => 'تم', + 64627 => 'تن', + 64628 => 'تى', + 64629 => 'تي', + 64630 => 'ثر', + 64631 => 'ثز', + 64632 => 'ثم', + 64633 => 'ثن', + 64634 => 'ثى', + 64635 => 'ثي', + 64636 => 'فى', + 64637 => 'في', + 64638 => 'قى', + 64639 => 'قي', + 64640 => 'كا', + 64641 => 'كل', + 64642 => 'كم', + 64643 => 'كى', + 64644 => 'كي', + 64645 => 'لم', + 64646 => 'لى', + 64647 => 'لي', + 64648 => 'ما', + 64649 => 'مم', + 64650 => 'نر', + 64651 => 'نز', + 64652 => 'نم', + 64653 => 'نن', + 64654 => 'نى', + 64655 => 'ني', + 64656 => 'ىٰ', + 64657 => 'ير', + 64658 => 'يز', + 64659 => 'يم', + 64660 => 'ين', + 64661 => 'يى', + 64662 => 'يي', + 64663 => 'ئج', + 64664 => 'ئح', + 64665 => 'ئخ', + 64666 => 'ئم', + 64667 => 'ئه', + 64668 => 'بج', + 64669 => 'بح', + 64670 => 'بخ', + 64671 => 'بم', + 64672 => 'به', + 64673 => 'تج', + 64674 => 'تح', + 64675 => 'تخ', + 64676 => 'تم', + 64677 => 'ته', + 64678 => 'ثم', + 64679 => 'جح', + 64680 => 'جم', + 64681 => 'حج', + 64682 => 'حم', + 64683 => 'خج', + 64684 => 'خم', + 64685 => 'سج', + 64686 => 'سح', + 64687 => 'سخ', + 64688 => 'سم', + 64689 => 'صح', + 64690 => 'صخ', + 64691 => 'صم', + 64692 => 'ضج', + 64693 => 'ضح', + 64694 => 'ضخ', + 64695 => 'ضم', + 64696 => 'طح', + 64697 => 'ظم', + 64698 => 'عج', + 64699 => 'عم', + 64700 => 'غج', + 64701 => 'غم', + 64702 => 'فج', + 64703 => 'فح', + 64704 => 'فخ', + 64705 => 'فم', + 64706 => 'قح', + 64707 => 'قم', + 64708 => 'كج', + 64709 => 'كح', + 64710 => 'كخ', + 64711 => 'كل', + 64712 => 'كم', + 64713 => 'لج', + 64714 => 'لح', + 64715 => 'لخ', + 64716 => 'لم', + 64717 => 'له', + 64718 => 'مج', + 64719 => 'مح', + 64720 => 'مخ', + 64721 => 'مم', + 64722 => 'نج', + 64723 => 'نح', + 64724 => 'نخ', + 64725 => 'نم', + 64726 => 'نه', + 64727 => 'هج', + 64728 => 'هم', + 64729 => 'هٰ', + 64730 => 'يج', + 64731 => 'يح', + 64732 => 'يخ', + 64733 => 'يم', + 64734 => 'يه', + 64735 => 'ئم', + 64736 => 'ئه', + 64737 => 'بم', + 64738 => 'به', + 64739 => 'تم', + 64740 => 'ته', + 64741 => 'ثم', + 64742 => 'ثه', + 64743 => 'سم', + 64744 => 'سه', + 64745 => 'شم', + 64746 => 'شه', + 64747 => 'كل', + 64748 => 'كم', + 64749 => 'لم', + 64750 => 'نم', + 64751 => 'نه', + 64752 => 'يم', + 64753 => 'يه', + 64754 => 'ـَّ', + 64755 => 'ـُّ', + 64756 => 'ـِّ', + 64757 => 'طى', + 64758 => 'طي', + 64759 => 'عى', + 64760 => 'عي', + 64761 => 'غى', + 64762 => 'غي', + 64763 => 'سى', + 64764 => 'سي', + 64765 => 'شى', + 64766 => 'شي', + 64767 => 'حى', + 64768 => 'حي', + 64769 => 'جى', + 64770 => 'جي', + 64771 => 'خى', + 64772 => 'خي', + 64773 => 'صى', + 64774 => 'صي', + 64775 => 'ضى', + 64776 => 'ضي', + 64777 => 'شج', + 64778 => 'شح', + 64779 => 'شخ', + 64780 => 'شم', + 64781 => 'شر', + 64782 => 'سر', + 64783 => 'صر', + 64784 => 'ضر', + 64785 => 'طى', + 64786 => 'طي', + 64787 => 'عى', + 64788 => 'عي', + 64789 => 'غى', + 64790 => 'غي', + 64791 => 'سى', + 64792 => 'سي', + 64793 => 'شى', + 64794 => 'شي', + 64795 => 'حى', + 64796 => 'حي', + 64797 => 'جى', + 64798 => 'جي', + 64799 => 'خى', + 64800 => 'خي', + 64801 => 'صى', + 64802 => 'صي', + 64803 => 'ضى', + 64804 => 'ضي', + 64805 => 'شج', + 64806 => 'شح', + 64807 => 'شخ', + 64808 => 'شم', + 64809 => 'شر', + 64810 => 'سر', + 64811 => 'صر', + 64812 => 'ضر', + 64813 => 'شج', + 64814 => 'شح', + 64815 => 'شخ', + 64816 => 'شم', + 64817 => 'سه', + 64818 => 'شه', + 64819 => 'طم', + 64820 => 'سج', + 64821 => 'سح', + 64822 => 'سخ', + 64823 => 'شج', + 64824 => 'شح', + 64825 => 'شخ', + 64826 => 'طم', + 64827 => 'ظم', + 64828 => 'اً', + 64829 => 'اً', + 64848 => 'تجم', + 64849 => 'تحج', + 64850 => 'تحج', + 64851 => 'تحم', + 64852 => 'تخم', + 64853 => 'تمج', + 64854 => 'تمح', + 64855 => 'تمخ', + 64856 => 'جمح', + 64857 => 'جمح', + 64858 => 'حمي', + 64859 => 'حمى', + 64860 => 'سحج', + 64861 => 'سجح', + 64862 => 'سجى', + 64863 => 'سمح', + 64864 => 'سمح', + 64865 => 'سمج', + 64866 => 'سمم', + 64867 => 'سمم', + 64868 => 'صحح', + 64869 => 'صحح', + 64870 => 'صمم', + 64871 => 'شحم', + 64872 => 'شحم', + 64873 => 'شجي', + 64874 => 'شمخ', + 64875 => 'شمخ', + 64876 => 'شمم', + 64877 => 'شمم', + 64878 => 'ضحى', + 64879 => 'ضخم', + 64880 => 'ضخم', + 64881 => 'طمح', + 64882 => 'طمح', + 64883 => 'طمم', + 64884 => 'طمي', + 64885 => 'عجم', + 64886 => 'عمم', + 64887 => 'عمم', + 64888 => 'عمى', + 64889 => 'غمم', + 64890 => 'غمي', + 64891 => 'غمى', + 64892 => 'فخم', + 64893 => 'فخم', + 64894 => 'قمح', + 64895 => 'قمم', + 64896 => 'لحم', + 64897 => 'لحي', + 64898 => 'لحى', + 64899 => 'لجج', + 64900 => 'لجج', + 64901 => 'لخم', + 64902 => 'لخم', + 64903 => 'لمح', + 64904 => 'لمح', + 64905 => 'محج', + 64906 => 'محم', + 64907 => 'محي', + 64908 => 'مجح', + 64909 => 'مجم', + 64910 => 'مخج', + 64911 => 'مخم', + 64914 => 'مجخ', + 64915 => 'همج', + 64916 => 'همم', + 64917 => 'نحم', + 64918 => 'نحى', + 64919 => 'نجم', + 64920 => 'نجم', + 64921 => 'نجى', + 64922 => 'نمي', + 64923 => 'نمى', + 64924 => 'يمم', + 64925 => 'يمم', + 64926 => 'بخي', + 64927 => 'تجي', + 64928 => 'تجى', + 64929 => 'تخي', + 64930 => 'تخى', + 64931 => 'تمي', + 64932 => 'تمى', + 64933 => 'جمي', + 64934 => 'جحى', + 64935 => 'جمى', + 64936 => 'سخى', + 64937 => 'صحي', + 64938 => 'شحي', + 64939 => 'ضحي', + 64940 => 'لجي', + 64941 => 'لمي', + 64942 => 'يحي', + 64943 => 'يجي', + 64944 => 'يمي', + 64945 => 'ممي', + 64946 => 'قمي', + 64947 => 'نحي', + 64948 => 'قمح', + 64949 => 'لحم', + 64950 => 'عمي', + 64951 => 'كمي', + 64952 => 'نجح', + 64953 => 'مخي', + 64954 => 'لجم', + 64955 => 'كمم', + 64956 => 'لجم', + 64957 => 'نجح', + 64958 => 'جحي', + 64959 => 'حجي', + 64960 => 'مجي', + 64961 => 'فمي', + 64962 => 'بحي', + 64963 => 'كمم', + 64964 => 'عجم', + 64965 => 'صمم', + 64966 => 'سخي', + 64967 => 'نجي', + 65008 => 'صلے', + 65009 => 'قلے', + 65010 => 'الله', + 65011 => 'اكبر', + 65012 => 'محمد', + 65013 => 'صلعم', + 65014 => 'رسول', + 65015 => 'عليه', + 65016 => 'وسلم', + 65017 => 'صلى', + 65020 => 'ریال', + 65041 => '、', + 65047 => '〖', + 65048 => '〗', + 65073 => '—', + 65074 => '–', + 65081 => '〔', + 65082 => '〕', + 65083 => '【', + 65084 => '】', + 65085 => '《', + 65086 => '》', + 65087 => '〈', + 65088 => '〉', + 65089 => '「', + 65090 => '」', + 65091 => '『', + 65092 => '』', + 65105 => '、', + 65112 => '—', + 65117 => '〔', + 65118 => '〕', + 65123 => '-', + 65137 => 'ـً', + 65143 => 'ـَ', + 65145 => 'ـُ', + 65147 => 'ـِ', + 65149 => 'ـّ', + 65151 => 'ـْ', + 65152 => 'ء', + 65153 => 'آ', + 65154 => 'آ', + 65155 => 'أ', + 65156 => 'أ', + 65157 => 'ؤ', + 65158 => 'ؤ', + 65159 => 'إ', + 65160 => 'إ', + 65161 => 'ئ', + 65162 => 'ئ', + 65163 => 'ئ', + 65164 => 'ئ', + 65165 => 'ا', + 65166 => 'ا', + 65167 => 'ب', + 65168 => 'ب', + 65169 => 'ب', + 65170 => 'ب', + 65171 => 'ة', + 65172 => 'ة', + 65173 => 'ت', + 65174 => 'ت', + 65175 => 'ت', + 65176 => 'ت', + 65177 => 'ث', + 65178 => 'ث', + 65179 => 'ث', + 65180 => 'ث', + 65181 => 'ج', + 65182 => 'ج', + 65183 => 'ج', + 65184 => 'ج', + 65185 => 'ح', + 65186 => 'ح', + 65187 => 'ح', + 65188 => 'ح', + 65189 => 'خ', + 65190 => 'خ', + 65191 => 'خ', + 65192 => 'خ', + 65193 => 'د', + 65194 => 'د', + 65195 => 'ذ', + 65196 => 'ذ', + 65197 => 'ر', + 65198 => 'ر', + 65199 => 'ز', + 65200 => 'ز', + 65201 => 'س', + 65202 => 'س', + 65203 => 'س', + 65204 => 'س', + 65205 => 'ش', + 65206 => 'ش', + 65207 => 'ش', + 65208 => 'ش', + 65209 => 'ص', + 65210 => 'ص', + 65211 => 'ص', + 65212 => 'ص', + 65213 => 'ض', + 65214 => 'ض', + 65215 => 'ض', + 65216 => 'ض', + 65217 => 'ط', + 65218 => 'ط', + 65219 => 'ط', + 65220 => 'ط', + 65221 => 'ظ', + 65222 => 'ظ', + 65223 => 'ظ', + 65224 => 'ظ', + 65225 => 'ع', + 65226 => 'ع', + 65227 => 'ع', + 65228 => 'ع', + 65229 => 'غ', + 65230 => 'غ', + 65231 => 'غ', + 65232 => 'غ', + 65233 => 'ف', + 65234 => 'ف', + 65235 => 'ف', + 65236 => 'ف', + 65237 => 'ق', + 65238 => 'ق', + 65239 => 'ق', + 65240 => 'ق', + 65241 => 'ك', + 65242 => 'ك', + 65243 => 'ك', + 65244 => 'ك', + 65245 => 'ل', + 65246 => 'ل', + 65247 => 'ل', + 65248 => 'ل', + 65249 => 'م', + 65250 => 'م', + 65251 => 'م', + 65252 => 'م', + 65253 => 'ن', + 65254 => 'ن', + 65255 => 'ن', + 65256 => 'ن', + 65257 => 'ه', + 65258 => 'ه', + 65259 => 'ه', + 65260 => 'ه', + 65261 => 'و', + 65262 => 'و', + 65263 => 'ى', + 65264 => 'ى', + 65265 => 'ي', + 65266 => 'ي', + 65267 => 'ي', + 65268 => 'ي', + 65269 => 'لآ', + 65270 => 'لآ', + 65271 => 'لأ', + 65272 => 'لأ', + 65273 => 'لإ', + 65274 => 'لإ', + 65275 => 'لا', + 65276 => 'لا', + 65293 => '-', + 65294 => '.', + 65296 => '0', + 65297 => '1', + 65298 => '2', + 65299 => '3', + 65300 => '4', + 65301 => '5', + 65302 => '6', + 65303 => '7', + 65304 => '8', + 65305 => '9', + 65313 => 'a', + 65314 => 'b', + 65315 => 'c', + 65316 => 'd', + 65317 => 'e', + 65318 => 'f', + 65319 => 'g', + 65320 => 'h', + 65321 => 'i', + 65322 => 'j', + 65323 => 'k', + 65324 => 'l', + 65325 => 'm', + 65326 => 'n', + 65327 => 'o', + 65328 => 'p', + 65329 => 'q', + 65330 => 'r', + 65331 => 's', + 65332 => 't', + 65333 => 'u', + 65334 => 'v', + 65335 => 'w', + 65336 => 'x', + 65337 => 'y', + 65338 => 'z', + 65345 => 'a', + 65346 => 'b', + 65347 => 'c', + 65348 => 'd', + 65349 => 'e', + 65350 => 'f', + 65351 => 'g', + 65352 => 'h', + 65353 => 'i', + 65354 => 'j', + 65355 => 'k', + 65356 => 'l', + 65357 => 'm', + 65358 => 'n', + 65359 => 'o', + 65360 => 'p', + 65361 => 'q', + 65362 => 'r', + 65363 => 's', + 65364 => 't', + 65365 => 'u', + 65366 => 'v', + 65367 => 'w', + 65368 => 'x', + 65369 => 'y', + 65370 => 'z', + 65375 => '⦅', + 65376 => '⦆', + 65377 => '.', + 65378 => '「', + 65379 => '」', + 65380 => '、', + 65381 => '・', + 65382 => 'ヲ', + 65383 => 'ァ', + 65384 => 'ィ', + 65385 => 'ゥ', + 65386 => 'ェ', + 65387 => 'ォ', + 65388 => 'ャ', + 65389 => 'ュ', + 65390 => 'ョ', + 65391 => 'ッ', + 65392 => 'ー', + 65393 => 'ア', + 65394 => 'イ', + 65395 => 'ウ', + 65396 => 'エ', + 65397 => 'オ', + 65398 => 'カ', + 65399 => 'キ', + 65400 => 'ク', + 65401 => 'ケ', + 65402 => 'コ', + 65403 => 'サ', + 65404 => 'シ', + 65405 => 'ス', + 65406 => 'セ', + 65407 => 'ソ', + 65408 => 'タ', + 65409 => 'チ', + 65410 => 'ツ', + 65411 => 'テ', + 65412 => 'ト', + 65413 => 'ナ', + 65414 => 'ニ', + 65415 => 'ヌ', + 65416 => 'ネ', + 65417 => 'ノ', + 65418 => 'ハ', + 65419 => 'ヒ', + 65420 => 'フ', + 65421 => 'ヘ', + 65422 => 'ホ', + 65423 => 'マ', + 65424 => 'ミ', + 65425 => 'ム', + 65426 => 'メ', + 65427 => 'モ', + 65428 => 'ヤ', + 65429 => 'ユ', + 65430 => 'ヨ', + 65431 => 'ラ', + 65432 => 'リ', + 65433 => 'ル', + 65434 => 'レ', + 65435 => 'ロ', + 65436 => 'ワ', + 65437 => 'ン', + 65438 => '゙', + 65439 => '゚', + 65441 => 'ᄀ', + 65442 => 'ᄁ', + 65443 => 'ᆪ', + 65444 => 'ᄂ', + 65445 => 'ᆬ', + 65446 => 'ᆭ', + 65447 => 'ᄃ', + 65448 => 'ᄄ', + 65449 => 'ᄅ', + 65450 => 'ᆰ', + 65451 => 'ᆱ', + 65452 => 'ᆲ', + 65453 => 'ᆳ', + 65454 => 'ᆴ', + 65455 => 'ᆵ', + 65456 => 'ᄚ', + 65457 => 'ᄆ', + 65458 => 'ᄇ', + 65459 => 'ᄈ', + 65460 => 'ᄡ', + 65461 => 'ᄉ', + 65462 => 'ᄊ', + 65463 => 'ᄋ', + 65464 => 'ᄌ', + 65465 => 'ᄍ', + 65466 => 'ᄎ', + 65467 => 'ᄏ', + 65468 => 'ᄐ', + 65469 => 'ᄑ', + 65470 => 'ᄒ', + 65474 => 'ᅡ', + 65475 => 'ᅢ', + 65476 => 'ᅣ', + 65477 => 'ᅤ', + 65478 => 'ᅥ', + 65479 => 'ᅦ', + 65482 => 'ᅧ', + 65483 => 'ᅨ', + 65484 => 'ᅩ', + 65485 => 'ᅪ', + 65486 => 'ᅫ', + 65487 => 'ᅬ', + 65490 => 'ᅭ', + 65491 => 'ᅮ', + 65492 => 'ᅯ', + 65493 => 'ᅰ', + 65494 => 'ᅱ', + 65495 => 'ᅲ', + 65498 => 'ᅳ', + 65499 => 'ᅴ', + 65500 => 'ᅵ', + 65504 => '¢', + 65505 => '£', + 65506 => '¬', + 65508 => '¦', + 65509 => '¥', + 65510 => '₩', + 65512 => '│', + 65513 => '←', + 65514 => '↑', + 65515 => '→', + 65516 => '↓', + 65517 => '■', + 65518 => '○', + 66560 => '𐐨', + 66561 => '𐐩', + 66562 => '𐐪', + 66563 => '𐐫', + 66564 => '𐐬', + 66565 => '𐐭', + 66566 => '𐐮', + 66567 => '𐐯', + 66568 => '𐐰', + 66569 => '𐐱', + 66570 => '𐐲', + 66571 => '𐐳', + 66572 => '𐐴', + 66573 => '𐐵', + 66574 => '𐐶', + 66575 => '𐐷', + 66576 => '𐐸', + 66577 => '𐐹', + 66578 => '𐐺', + 66579 => '𐐻', + 66580 => '𐐼', + 66581 => '𐐽', + 66582 => '𐐾', + 66583 => '𐐿', + 66584 => '𐑀', + 66585 => '𐑁', + 66586 => '𐑂', + 66587 => '𐑃', + 66588 => '𐑄', + 66589 => '𐑅', + 66590 => '𐑆', + 66591 => '𐑇', + 66592 => '𐑈', + 66593 => '𐑉', + 66594 => '𐑊', + 66595 => '𐑋', + 66596 => '𐑌', + 66597 => '𐑍', + 66598 => '𐑎', + 66599 => '𐑏', + 66736 => '𐓘', + 66737 => '𐓙', + 66738 => '𐓚', + 66739 => '𐓛', + 66740 => '𐓜', + 66741 => '𐓝', + 66742 => '𐓞', + 66743 => '𐓟', + 66744 => '𐓠', + 66745 => '𐓡', + 66746 => '𐓢', + 66747 => '𐓣', + 66748 => '𐓤', + 66749 => '𐓥', + 66750 => '𐓦', + 66751 => '𐓧', + 66752 => '𐓨', + 66753 => '𐓩', + 66754 => '𐓪', + 66755 => '𐓫', + 66756 => '𐓬', + 66757 => '𐓭', + 66758 => '𐓮', + 66759 => '𐓯', + 66760 => '𐓰', + 66761 => '𐓱', + 66762 => '𐓲', + 66763 => '𐓳', + 66764 => '𐓴', + 66765 => '𐓵', + 66766 => '𐓶', + 66767 => '𐓷', + 66768 => '𐓸', + 66769 => '𐓹', + 66770 => '𐓺', + 66771 => '𐓻', + 68736 => '𐳀', + 68737 => '𐳁', + 68738 => '𐳂', + 68739 => '𐳃', + 68740 => '𐳄', + 68741 => '𐳅', + 68742 => '𐳆', + 68743 => '𐳇', + 68744 => '𐳈', + 68745 => '𐳉', + 68746 => '𐳊', + 68747 => '𐳋', + 68748 => '𐳌', + 68749 => '𐳍', + 68750 => '𐳎', + 68751 => '𐳏', + 68752 => '𐳐', + 68753 => '𐳑', + 68754 => '𐳒', + 68755 => '𐳓', + 68756 => '𐳔', + 68757 => '𐳕', + 68758 => '𐳖', + 68759 => '𐳗', + 68760 => '𐳘', + 68761 => '𐳙', + 68762 => '𐳚', + 68763 => '𐳛', + 68764 => '𐳜', + 68765 => '𐳝', + 68766 => '𐳞', + 68767 => '𐳟', + 68768 => '𐳠', + 68769 => '𐳡', + 68770 => '𐳢', + 68771 => '𐳣', + 68772 => '𐳤', + 68773 => '𐳥', + 68774 => '𐳦', + 68775 => '𐳧', + 68776 => '𐳨', + 68777 => '𐳩', + 68778 => '𐳪', + 68779 => '𐳫', + 68780 => '𐳬', + 68781 => '𐳭', + 68782 => '𐳮', + 68783 => '𐳯', + 68784 => '𐳰', + 68785 => '𐳱', + 68786 => '𐳲', + 71840 => '𑣀', + 71841 => '𑣁', + 71842 => '𑣂', + 71843 => '𑣃', + 71844 => '𑣄', + 71845 => '𑣅', + 71846 => '𑣆', + 71847 => '𑣇', + 71848 => '𑣈', + 71849 => '𑣉', + 71850 => '𑣊', + 71851 => '𑣋', + 71852 => '𑣌', + 71853 => '𑣍', + 71854 => '𑣎', + 71855 => '𑣏', + 71856 => '𑣐', + 71857 => '𑣑', + 71858 => '𑣒', + 71859 => '𑣓', + 71860 => '𑣔', + 71861 => '𑣕', + 71862 => '𑣖', + 71863 => '𑣗', + 71864 => '𑣘', + 71865 => '𑣙', + 71866 => '𑣚', + 71867 => '𑣛', + 71868 => '𑣜', + 71869 => '𑣝', + 71870 => '𑣞', + 71871 => '𑣟', + 93760 => '𖹠', + 93761 => '𖹡', + 93762 => '𖹢', + 93763 => '𖹣', + 93764 => '𖹤', + 93765 => '𖹥', + 93766 => '𖹦', + 93767 => '𖹧', + 93768 => '𖹨', + 93769 => '𖹩', + 93770 => '𖹪', + 93771 => '𖹫', + 93772 => '𖹬', + 93773 => '𖹭', + 93774 => '𖹮', + 93775 => '𖹯', + 93776 => '𖹰', + 93777 => '𖹱', + 93778 => '𖹲', + 93779 => '𖹳', + 93780 => '𖹴', + 93781 => '𖹵', + 93782 => '𖹶', + 93783 => '𖹷', + 93784 => '𖹸', + 93785 => '𖹹', + 93786 => '𖹺', + 93787 => '𖹻', + 93788 => '𖹼', + 93789 => '𖹽', + 93790 => '𖹾', + 93791 => '𖹿', + 119134 => '𝅗𝅥', + 119135 => '𝅘𝅥', + 119136 => '𝅘𝅥𝅮', + 119137 => '𝅘𝅥𝅯', + 119138 => '𝅘𝅥𝅰', + 119139 => '𝅘𝅥𝅱', + 119140 => '𝅘𝅥𝅲', + 119227 => '𝆹𝅥', + 119228 => '𝆺𝅥', + 119229 => '𝆹𝅥𝅮', + 119230 => '𝆺𝅥𝅮', + 119231 => '𝆹𝅥𝅯', + 119232 => '𝆺𝅥𝅯', + 119808 => 'a', + 119809 => 'b', + 119810 => 'c', + 119811 => 'd', + 119812 => 'e', + 119813 => 'f', + 119814 => 'g', + 119815 => 'h', + 119816 => 'i', + 119817 => 'j', + 119818 => 'k', + 119819 => 'l', + 119820 => 'm', + 119821 => 'n', + 119822 => 'o', + 119823 => 'p', + 119824 => 'q', + 119825 => 'r', + 119826 => 's', + 119827 => 't', + 119828 => 'u', + 119829 => 'v', + 119830 => 'w', + 119831 => 'x', + 119832 => 'y', + 119833 => 'z', + 119834 => 'a', + 119835 => 'b', + 119836 => 'c', + 119837 => 'd', + 119838 => 'e', + 119839 => 'f', + 119840 => 'g', + 119841 => 'h', + 119842 => 'i', + 119843 => 'j', + 119844 => 'k', + 119845 => 'l', + 119846 => 'm', + 119847 => 'n', + 119848 => 'o', + 119849 => 'p', + 119850 => 'q', + 119851 => 'r', + 119852 => 's', + 119853 => 't', + 119854 => 'u', + 119855 => 'v', + 119856 => 'w', + 119857 => 'x', + 119858 => 'y', + 119859 => 'z', + 119860 => 'a', + 119861 => 'b', + 119862 => 'c', + 119863 => 'd', + 119864 => 'e', + 119865 => 'f', + 119866 => 'g', + 119867 => 'h', + 119868 => 'i', + 119869 => 'j', + 119870 => 'k', + 119871 => 'l', + 119872 => 'm', + 119873 => 'n', + 119874 => 'o', + 119875 => 'p', + 119876 => 'q', + 119877 => 'r', + 119878 => 's', + 119879 => 't', + 119880 => 'u', + 119881 => 'v', + 119882 => 'w', + 119883 => 'x', + 119884 => 'y', + 119885 => 'z', + 119886 => 'a', + 119887 => 'b', + 119888 => 'c', + 119889 => 'd', + 119890 => 'e', + 119891 => 'f', + 119892 => 'g', + 119894 => 'i', + 119895 => 'j', + 119896 => 'k', + 119897 => 'l', + 119898 => 'm', + 119899 => 'n', + 119900 => 'o', + 119901 => 'p', + 119902 => 'q', + 119903 => 'r', + 119904 => 's', + 119905 => 't', + 119906 => 'u', + 119907 => 'v', + 119908 => 'w', + 119909 => 'x', + 119910 => 'y', + 119911 => 'z', + 119912 => 'a', + 119913 => 'b', + 119914 => 'c', + 119915 => 'd', + 119916 => 'e', + 119917 => 'f', + 119918 => 'g', + 119919 => 'h', + 119920 => 'i', + 119921 => 'j', + 119922 => 'k', + 119923 => 'l', + 119924 => 'm', + 119925 => 'n', + 119926 => 'o', + 119927 => 'p', + 119928 => 'q', + 119929 => 'r', + 119930 => 's', + 119931 => 't', + 119932 => 'u', + 119933 => 'v', + 119934 => 'w', + 119935 => 'x', + 119936 => 'y', + 119937 => 'z', + 119938 => 'a', + 119939 => 'b', + 119940 => 'c', + 119941 => 'd', + 119942 => 'e', + 119943 => 'f', + 119944 => 'g', + 119945 => 'h', + 119946 => 'i', + 119947 => 'j', + 119948 => 'k', + 119949 => 'l', + 119950 => 'm', + 119951 => 'n', + 119952 => 'o', + 119953 => 'p', + 119954 => 'q', + 119955 => 'r', + 119956 => 's', + 119957 => 't', + 119958 => 'u', + 119959 => 'v', + 119960 => 'w', + 119961 => 'x', + 119962 => 'y', + 119963 => 'z', + 119964 => 'a', + 119966 => 'c', + 119967 => 'd', + 119970 => 'g', + 119973 => 'j', + 119974 => 'k', + 119977 => 'n', + 119978 => 'o', + 119979 => 'p', + 119980 => 'q', + 119982 => 's', + 119983 => 't', + 119984 => 'u', + 119985 => 'v', + 119986 => 'w', + 119987 => 'x', + 119988 => 'y', + 119989 => 'z', + 119990 => 'a', + 119991 => 'b', + 119992 => 'c', + 119993 => 'd', + 119995 => 'f', + 119997 => 'h', + 119998 => 'i', + 119999 => 'j', + 120000 => 'k', + 120001 => 'l', + 120002 => 'm', + 120003 => 'n', + 120005 => 'p', + 120006 => 'q', + 120007 => 'r', + 120008 => 's', + 120009 => 't', + 120010 => 'u', + 120011 => 'v', + 120012 => 'w', + 120013 => 'x', + 120014 => 'y', + 120015 => 'z', + 120016 => 'a', + 120017 => 'b', + 120018 => 'c', + 120019 => 'd', + 120020 => 'e', + 120021 => 'f', + 120022 => 'g', + 120023 => 'h', + 120024 => 'i', + 120025 => 'j', + 120026 => 'k', + 120027 => 'l', + 120028 => 'm', + 120029 => 'n', + 120030 => 'o', + 120031 => 'p', + 120032 => 'q', + 120033 => 'r', + 120034 => 's', + 120035 => 't', + 120036 => 'u', + 120037 => 'v', + 120038 => 'w', + 120039 => 'x', + 120040 => 'y', + 120041 => 'z', + 120042 => 'a', + 120043 => 'b', + 120044 => 'c', + 120045 => 'd', + 120046 => 'e', + 120047 => 'f', + 120048 => 'g', + 120049 => 'h', + 120050 => 'i', + 120051 => 'j', + 120052 => 'k', + 120053 => 'l', + 120054 => 'm', + 120055 => 'n', + 120056 => 'o', + 120057 => 'p', + 120058 => 'q', + 120059 => 'r', + 120060 => 's', + 120061 => 't', + 120062 => 'u', + 120063 => 'v', + 120064 => 'w', + 120065 => 'x', + 120066 => 'y', + 120067 => 'z', + 120068 => 'a', + 120069 => 'b', + 120071 => 'd', + 120072 => 'e', + 120073 => 'f', + 120074 => 'g', + 120077 => 'j', + 120078 => 'k', + 120079 => 'l', + 120080 => 'm', + 120081 => 'n', + 120082 => 'o', + 120083 => 'p', + 120084 => 'q', + 120086 => 's', + 120087 => 't', + 120088 => 'u', + 120089 => 'v', + 120090 => 'w', + 120091 => 'x', + 120092 => 'y', + 120094 => 'a', + 120095 => 'b', + 120096 => 'c', + 120097 => 'd', + 120098 => 'e', + 120099 => 'f', + 120100 => 'g', + 120101 => 'h', + 120102 => 'i', + 120103 => 'j', + 120104 => 'k', + 120105 => 'l', + 120106 => 'm', + 120107 => 'n', + 120108 => 'o', + 120109 => 'p', + 120110 => 'q', + 120111 => 'r', + 120112 => 's', + 120113 => 't', + 120114 => 'u', + 120115 => 'v', + 120116 => 'w', + 120117 => 'x', + 120118 => 'y', + 120119 => 'z', + 120120 => 'a', + 120121 => 'b', + 120123 => 'd', + 120124 => 'e', + 120125 => 'f', + 120126 => 'g', + 120128 => 'i', + 120129 => 'j', + 120130 => 'k', + 120131 => 'l', + 120132 => 'm', + 120134 => 'o', + 120138 => 's', + 120139 => 't', + 120140 => 'u', + 120141 => 'v', + 120142 => 'w', + 120143 => 'x', + 120144 => 'y', + 120146 => 'a', + 120147 => 'b', + 120148 => 'c', + 120149 => 'd', + 120150 => 'e', + 120151 => 'f', + 120152 => 'g', + 120153 => 'h', + 120154 => 'i', + 120155 => 'j', + 120156 => 'k', + 120157 => 'l', + 120158 => 'm', + 120159 => 'n', + 120160 => 'o', + 120161 => 'p', + 120162 => 'q', + 120163 => 'r', + 120164 => 's', + 120165 => 't', + 120166 => 'u', + 120167 => 'v', + 120168 => 'w', + 120169 => 'x', + 120170 => 'y', + 120171 => 'z', + 120172 => 'a', + 120173 => 'b', + 120174 => 'c', + 120175 => 'd', + 120176 => 'e', + 120177 => 'f', + 120178 => 'g', + 120179 => 'h', + 120180 => 'i', + 120181 => 'j', + 120182 => 'k', + 120183 => 'l', + 120184 => 'm', + 120185 => 'n', + 120186 => 'o', + 120187 => 'p', + 120188 => 'q', + 120189 => 'r', + 120190 => 's', + 120191 => 't', + 120192 => 'u', + 120193 => 'v', + 120194 => 'w', + 120195 => 'x', + 120196 => 'y', + 120197 => 'z', + 120198 => 'a', + 120199 => 'b', + 120200 => 'c', + 120201 => 'd', + 120202 => 'e', + 120203 => 'f', + 120204 => 'g', + 120205 => 'h', + 120206 => 'i', + 120207 => 'j', + 120208 => 'k', + 120209 => 'l', + 120210 => 'm', + 120211 => 'n', + 120212 => 'o', + 120213 => 'p', + 120214 => 'q', + 120215 => 'r', + 120216 => 's', + 120217 => 't', + 120218 => 'u', + 120219 => 'v', + 120220 => 'w', + 120221 => 'x', + 120222 => 'y', + 120223 => 'z', + 120224 => 'a', + 120225 => 'b', + 120226 => 'c', + 120227 => 'd', + 120228 => 'e', + 120229 => 'f', + 120230 => 'g', + 120231 => 'h', + 120232 => 'i', + 120233 => 'j', + 120234 => 'k', + 120235 => 'l', + 120236 => 'm', + 120237 => 'n', + 120238 => 'o', + 120239 => 'p', + 120240 => 'q', + 120241 => 'r', + 120242 => 's', + 120243 => 't', + 120244 => 'u', + 120245 => 'v', + 120246 => 'w', + 120247 => 'x', + 120248 => 'y', + 120249 => 'z', + 120250 => 'a', + 120251 => 'b', + 120252 => 'c', + 120253 => 'd', + 120254 => 'e', + 120255 => 'f', + 120256 => 'g', + 120257 => 'h', + 120258 => 'i', + 120259 => 'j', + 120260 => 'k', + 120261 => 'l', + 120262 => 'm', + 120263 => 'n', + 120264 => 'o', + 120265 => 'p', + 120266 => 'q', + 120267 => 'r', + 120268 => 's', + 120269 => 't', + 120270 => 'u', + 120271 => 'v', + 120272 => 'w', + 120273 => 'x', + 120274 => 'y', + 120275 => 'z', + 120276 => 'a', + 120277 => 'b', + 120278 => 'c', + 120279 => 'd', + 120280 => 'e', + 120281 => 'f', + 120282 => 'g', + 120283 => 'h', + 120284 => 'i', + 120285 => 'j', + 120286 => 'k', + 120287 => 'l', + 120288 => 'm', + 120289 => 'n', + 120290 => 'o', + 120291 => 'p', + 120292 => 'q', + 120293 => 'r', + 120294 => 's', + 120295 => 't', + 120296 => 'u', + 120297 => 'v', + 120298 => 'w', + 120299 => 'x', + 120300 => 'y', + 120301 => 'z', + 120302 => 'a', + 120303 => 'b', + 120304 => 'c', + 120305 => 'd', + 120306 => 'e', + 120307 => 'f', + 120308 => 'g', + 120309 => 'h', + 120310 => 'i', + 120311 => 'j', + 120312 => 'k', + 120313 => 'l', + 120314 => 'm', + 120315 => 'n', + 120316 => 'o', + 120317 => 'p', + 120318 => 'q', + 120319 => 'r', + 120320 => 's', + 120321 => 't', + 120322 => 'u', + 120323 => 'v', + 120324 => 'w', + 120325 => 'x', + 120326 => 'y', + 120327 => 'z', + 120328 => 'a', + 120329 => 'b', + 120330 => 'c', + 120331 => 'd', + 120332 => 'e', + 120333 => 'f', + 120334 => 'g', + 120335 => 'h', + 120336 => 'i', + 120337 => 'j', + 120338 => 'k', + 120339 => 'l', + 120340 => 'm', + 120341 => 'n', + 120342 => 'o', + 120343 => 'p', + 120344 => 'q', + 120345 => 'r', + 120346 => 's', + 120347 => 't', + 120348 => 'u', + 120349 => 'v', + 120350 => 'w', + 120351 => 'x', + 120352 => 'y', + 120353 => 'z', + 120354 => 'a', + 120355 => 'b', + 120356 => 'c', + 120357 => 'd', + 120358 => 'e', + 120359 => 'f', + 120360 => 'g', + 120361 => 'h', + 120362 => 'i', + 120363 => 'j', + 120364 => 'k', + 120365 => 'l', + 120366 => 'm', + 120367 => 'n', + 120368 => 'o', + 120369 => 'p', + 120370 => 'q', + 120371 => 'r', + 120372 => 's', + 120373 => 't', + 120374 => 'u', + 120375 => 'v', + 120376 => 'w', + 120377 => 'x', + 120378 => 'y', + 120379 => 'z', + 120380 => 'a', + 120381 => 'b', + 120382 => 'c', + 120383 => 'd', + 120384 => 'e', + 120385 => 'f', + 120386 => 'g', + 120387 => 'h', + 120388 => 'i', + 120389 => 'j', + 120390 => 'k', + 120391 => 'l', + 120392 => 'm', + 120393 => 'n', + 120394 => 'o', + 120395 => 'p', + 120396 => 'q', + 120397 => 'r', + 120398 => 's', + 120399 => 't', + 120400 => 'u', + 120401 => 'v', + 120402 => 'w', + 120403 => 'x', + 120404 => 'y', + 120405 => 'z', + 120406 => 'a', + 120407 => 'b', + 120408 => 'c', + 120409 => 'd', + 120410 => 'e', + 120411 => 'f', + 120412 => 'g', + 120413 => 'h', + 120414 => 'i', + 120415 => 'j', + 120416 => 'k', + 120417 => 'l', + 120418 => 'm', + 120419 => 'n', + 120420 => 'o', + 120421 => 'p', + 120422 => 'q', + 120423 => 'r', + 120424 => 's', + 120425 => 't', + 120426 => 'u', + 120427 => 'v', + 120428 => 'w', + 120429 => 'x', + 120430 => 'y', + 120431 => 'z', + 120432 => 'a', + 120433 => 'b', + 120434 => 'c', + 120435 => 'd', + 120436 => 'e', + 120437 => 'f', + 120438 => 'g', + 120439 => 'h', + 120440 => 'i', + 120441 => 'j', + 120442 => 'k', + 120443 => 'l', + 120444 => 'm', + 120445 => 'n', + 120446 => 'o', + 120447 => 'p', + 120448 => 'q', + 120449 => 'r', + 120450 => 's', + 120451 => 't', + 120452 => 'u', + 120453 => 'v', + 120454 => 'w', + 120455 => 'x', + 120456 => 'y', + 120457 => 'z', + 120458 => 'a', + 120459 => 'b', + 120460 => 'c', + 120461 => 'd', + 120462 => 'e', + 120463 => 'f', + 120464 => 'g', + 120465 => 'h', + 120466 => 'i', + 120467 => 'j', + 120468 => 'k', + 120469 => 'l', + 120470 => 'm', + 120471 => 'n', + 120472 => 'o', + 120473 => 'p', + 120474 => 'q', + 120475 => 'r', + 120476 => 's', + 120477 => 't', + 120478 => 'u', + 120479 => 'v', + 120480 => 'w', + 120481 => 'x', + 120482 => 'y', + 120483 => 'z', + 120484 => 'ı', + 120485 => 'ȷ', + 120488 => 'α', + 120489 => 'β', + 120490 => 'γ', + 120491 => 'δ', + 120492 => 'ε', + 120493 => 'ζ', + 120494 => 'η', + 120495 => 'θ', + 120496 => 'ι', + 120497 => 'κ', + 120498 => 'λ', + 120499 => 'μ', + 120500 => 'ν', + 120501 => 'ξ', + 120502 => 'ο', + 120503 => 'π', + 120504 => 'ρ', + 120505 => 'θ', + 120506 => 'σ', + 120507 => 'τ', + 120508 => 'υ', + 120509 => 'φ', + 120510 => 'χ', + 120511 => 'ψ', + 120512 => 'ω', + 120513 => '∇', + 120514 => 'α', + 120515 => 'β', + 120516 => 'γ', + 120517 => 'δ', + 120518 => 'ε', + 120519 => 'ζ', + 120520 => 'η', + 120521 => 'θ', + 120522 => 'ι', + 120523 => 'κ', + 120524 => 'λ', + 120525 => 'μ', + 120526 => 'ν', + 120527 => 'ξ', + 120528 => 'ο', + 120529 => 'π', + 120530 => 'ρ', + 120531 => 'σ', + 120532 => 'σ', + 120533 => 'τ', + 120534 => 'υ', + 120535 => 'φ', + 120536 => 'χ', + 120537 => 'ψ', + 120538 => 'ω', + 120539 => '∂', + 120540 => 'ε', + 120541 => 'θ', + 120542 => 'κ', + 120543 => 'φ', + 120544 => 'ρ', + 120545 => 'π', + 120546 => 'α', + 120547 => 'β', + 120548 => 'γ', + 120549 => 'δ', + 120550 => 'ε', + 120551 => 'ζ', + 120552 => 'η', + 120553 => 'θ', + 120554 => 'ι', + 120555 => 'κ', + 120556 => 'λ', + 120557 => 'μ', + 120558 => 'ν', + 120559 => 'ξ', + 120560 => 'ο', + 120561 => 'π', + 120562 => 'ρ', + 120563 => 'θ', + 120564 => 'σ', + 120565 => 'τ', + 120566 => 'υ', + 120567 => 'φ', + 120568 => 'χ', + 120569 => 'ψ', + 120570 => 'ω', + 120571 => '∇', + 120572 => 'α', + 120573 => 'β', + 120574 => 'γ', + 120575 => 'δ', + 120576 => 'ε', + 120577 => 'ζ', + 120578 => 'η', + 120579 => 'θ', + 120580 => 'ι', + 120581 => 'κ', + 120582 => 'λ', + 120583 => 'μ', + 120584 => 'ν', + 120585 => 'ξ', + 120586 => 'ο', + 120587 => 'π', + 120588 => 'ρ', + 120589 => 'σ', + 120590 => 'σ', + 120591 => 'τ', + 120592 => 'υ', + 120593 => 'φ', + 120594 => 'χ', + 120595 => 'ψ', + 120596 => 'ω', + 120597 => '∂', + 120598 => 'ε', + 120599 => 'θ', + 120600 => 'κ', + 120601 => 'φ', + 120602 => 'ρ', + 120603 => 'π', + 120604 => 'α', + 120605 => 'β', + 120606 => 'γ', + 120607 => 'δ', + 120608 => 'ε', + 120609 => 'ζ', + 120610 => 'η', + 120611 => 'θ', + 120612 => 'ι', + 120613 => 'κ', + 120614 => 'λ', + 120615 => 'μ', + 120616 => 'ν', + 120617 => 'ξ', + 120618 => 'ο', + 120619 => 'π', + 120620 => 'ρ', + 120621 => 'θ', + 120622 => 'σ', + 120623 => 'τ', + 120624 => 'υ', + 120625 => 'φ', + 120626 => 'χ', + 120627 => 'ψ', + 120628 => 'ω', + 120629 => '∇', + 120630 => 'α', + 120631 => 'β', + 120632 => 'γ', + 120633 => 'δ', + 120634 => 'ε', + 120635 => 'ζ', + 120636 => 'η', + 120637 => 'θ', + 120638 => 'ι', + 120639 => 'κ', + 120640 => 'λ', + 120641 => 'μ', + 120642 => 'ν', + 120643 => 'ξ', + 120644 => 'ο', + 120645 => 'π', + 120646 => 'ρ', + 120647 => 'σ', + 120648 => 'σ', + 120649 => 'τ', + 120650 => 'υ', + 120651 => 'φ', + 120652 => 'χ', + 120653 => 'ψ', + 120654 => 'ω', + 120655 => '∂', + 120656 => 'ε', + 120657 => 'θ', + 120658 => 'κ', + 120659 => 'φ', + 120660 => 'ρ', + 120661 => 'π', + 120662 => 'α', + 120663 => 'β', + 120664 => 'γ', + 120665 => 'δ', + 120666 => 'ε', + 120667 => 'ζ', + 120668 => 'η', + 120669 => 'θ', + 120670 => 'ι', + 120671 => 'κ', + 120672 => 'λ', + 120673 => 'μ', + 120674 => 'ν', + 120675 => 'ξ', + 120676 => 'ο', + 120677 => 'π', + 120678 => 'ρ', + 120679 => 'θ', + 120680 => 'σ', + 120681 => 'τ', + 120682 => 'υ', + 120683 => 'φ', + 120684 => 'χ', + 120685 => 'ψ', + 120686 => 'ω', + 120687 => '∇', + 120688 => 'α', + 120689 => 'β', + 120690 => 'γ', + 120691 => 'δ', + 120692 => 'ε', + 120693 => 'ζ', + 120694 => 'η', + 120695 => 'θ', + 120696 => 'ι', + 120697 => 'κ', + 120698 => 'λ', + 120699 => 'μ', + 120700 => 'ν', + 120701 => 'ξ', + 120702 => 'ο', + 120703 => 'π', + 120704 => 'ρ', + 120705 => 'σ', + 120706 => 'σ', + 120707 => 'τ', + 120708 => 'υ', + 120709 => 'φ', + 120710 => 'χ', + 120711 => 'ψ', + 120712 => 'ω', + 120713 => '∂', + 120714 => 'ε', + 120715 => 'θ', + 120716 => 'κ', + 120717 => 'φ', + 120718 => 'ρ', + 120719 => 'π', + 120720 => 'α', + 120721 => 'β', + 120722 => 'γ', + 120723 => 'δ', + 120724 => 'ε', + 120725 => 'ζ', + 120726 => 'η', + 120727 => 'θ', + 120728 => 'ι', + 120729 => 'κ', + 120730 => 'λ', + 120731 => 'μ', + 120732 => 'ν', + 120733 => 'ξ', + 120734 => 'ο', + 120735 => 'π', + 120736 => 'ρ', + 120737 => 'θ', + 120738 => 'σ', + 120739 => 'τ', + 120740 => 'υ', + 120741 => 'φ', + 120742 => 'χ', + 120743 => 'ψ', + 120744 => 'ω', + 120745 => '∇', + 120746 => 'α', + 120747 => 'β', + 120748 => 'γ', + 120749 => 'δ', + 120750 => 'ε', + 120751 => 'ζ', + 120752 => 'η', + 120753 => 'θ', + 120754 => 'ι', + 120755 => 'κ', + 120756 => 'λ', + 120757 => 'μ', + 120758 => 'ν', + 120759 => 'ξ', + 120760 => 'ο', + 120761 => 'π', + 120762 => 'ρ', + 120763 => 'σ', + 120764 => 'σ', + 120765 => 'τ', + 120766 => 'υ', + 120767 => 'φ', + 120768 => 'χ', + 120769 => 'ψ', + 120770 => 'ω', + 120771 => '∂', + 120772 => 'ε', + 120773 => 'θ', + 120774 => 'κ', + 120775 => 'φ', + 120776 => 'ρ', + 120777 => 'π', + 120778 => 'ϝ', + 120779 => 'ϝ', + 120782 => '0', + 120783 => '1', + 120784 => '2', + 120785 => '3', + 120786 => '4', + 120787 => '5', + 120788 => '6', + 120789 => '7', + 120790 => '8', + 120791 => '9', + 120792 => '0', + 120793 => '1', + 120794 => '2', + 120795 => '3', + 120796 => '4', + 120797 => '5', + 120798 => '6', + 120799 => '7', + 120800 => '8', + 120801 => '9', + 120802 => '0', + 120803 => '1', + 120804 => '2', + 120805 => '3', + 120806 => '4', + 120807 => '5', + 120808 => '6', + 120809 => '7', + 120810 => '8', + 120811 => '9', + 120812 => '0', + 120813 => '1', + 120814 => '2', + 120815 => '3', + 120816 => '4', + 120817 => '5', + 120818 => '6', + 120819 => '7', + 120820 => '8', + 120821 => '9', + 120822 => '0', + 120823 => '1', + 120824 => '2', + 120825 => '3', + 120826 => '4', + 120827 => '5', + 120828 => '6', + 120829 => '7', + 120830 => '8', + 120831 => '9', + 125184 => '𞤢', + 125185 => '𞤣', + 125186 => '𞤤', + 125187 => '𞤥', + 125188 => '𞤦', + 125189 => '𞤧', + 125190 => '𞤨', + 125191 => '𞤩', + 125192 => '𞤪', + 125193 => '𞤫', + 125194 => '𞤬', + 125195 => '𞤭', + 125196 => '𞤮', + 125197 => '𞤯', + 125198 => '𞤰', + 125199 => '𞤱', + 125200 => '𞤲', + 125201 => '𞤳', + 125202 => '𞤴', + 125203 => '𞤵', + 125204 => '𞤶', + 125205 => '𞤷', + 125206 => '𞤸', + 125207 => '𞤹', + 125208 => '𞤺', + 125209 => '𞤻', + 125210 => '𞤼', + 125211 => '𞤽', + 125212 => '𞤾', + 125213 => '𞤿', + 125214 => '𞥀', + 125215 => '𞥁', + 125216 => '𞥂', + 125217 => '𞥃', + 126464 => 'ا', + 126465 => 'ب', + 126466 => 'ج', + 126467 => 'د', + 126469 => 'و', + 126470 => 'ز', + 126471 => 'ح', + 126472 => 'ط', + 126473 => 'ي', + 126474 => 'ك', + 126475 => 'ل', + 126476 => 'م', + 126477 => 'ن', + 126478 => 'س', + 126479 => 'ع', + 126480 => 'ف', + 126481 => 'ص', + 126482 => 'ق', + 126483 => 'ر', + 126484 => 'ش', + 126485 => 'ت', + 126486 => 'ث', + 126487 => 'خ', + 126488 => 'ذ', + 126489 => 'ض', + 126490 => 'ظ', + 126491 => 'غ', + 126492 => 'ٮ', + 126493 => 'ں', + 126494 => 'ڡ', + 126495 => 'ٯ', + 126497 => 'ب', + 126498 => 'ج', + 126500 => 'ه', + 126503 => 'ح', + 126505 => 'ي', + 126506 => 'ك', + 126507 => 'ل', + 126508 => 'م', + 126509 => 'ن', + 126510 => 'س', + 126511 => 'ع', + 126512 => 'ف', + 126513 => 'ص', + 126514 => 'ق', + 126516 => 'ش', + 126517 => 'ت', + 126518 => 'ث', + 126519 => 'خ', + 126521 => 'ض', + 126523 => 'غ', + 126530 => 'ج', + 126535 => 'ح', + 126537 => 'ي', + 126539 => 'ل', + 126541 => 'ن', + 126542 => 'س', + 126543 => 'ع', + 126545 => 'ص', + 126546 => 'ق', + 126548 => 'ش', + 126551 => 'خ', + 126553 => 'ض', + 126555 => 'غ', + 126557 => 'ں', + 126559 => 'ٯ', + 126561 => 'ب', + 126562 => 'ج', + 126564 => 'ه', + 126567 => 'ح', + 126568 => 'ط', + 126569 => 'ي', + 126570 => 'ك', + 126572 => 'م', + 126573 => 'ن', + 126574 => 'س', + 126575 => 'ع', + 126576 => 'ف', + 126577 => 'ص', + 126578 => 'ق', + 126580 => 'ش', + 126581 => 'ت', + 126582 => 'ث', + 126583 => 'خ', + 126585 => 'ض', + 126586 => 'ظ', + 126587 => 'غ', + 126588 => 'ٮ', + 126590 => 'ڡ', + 126592 => 'ا', + 126593 => 'ب', + 126594 => 'ج', + 126595 => 'د', + 126596 => 'ه', + 126597 => 'و', + 126598 => 'ز', + 126599 => 'ح', + 126600 => 'ط', + 126601 => 'ي', + 126603 => 'ل', + 126604 => 'م', + 126605 => 'ن', + 126606 => 'س', + 126607 => 'ع', + 126608 => 'ف', + 126609 => 'ص', + 126610 => 'ق', + 126611 => 'ر', + 126612 => 'ش', + 126613 => 'ت', + 126614 => 'ث', + 126615 => 'خ', + 126616 => 'ذ', + 126617 => 'ض', + 126618 => 'ظ', + 126619 => 'غ', + 126625 => 'ب', + 126626 => 'ج', + 126627 => 'د', + 126629 => 'و', + 126630 => 'ز', + 126631 => 'ح', + 126632 => 'ط', + 126633 => 'ي', + 126635 => 'ل', + 126636 => 'م', + 126637 => 'ن', + 126638 => 'س', + 126639 => 'ع', + 126640 => 'ف', + 126641 => 'ص', + 126642 => 'ق', + 126643 => 'ر', + 126644 => 'ش', + 126645 => 'ت', + 126646 => 'ث', + 126647 => 'خ', + 126648 => 'ذ', + 126649 => 'ض', + 126650 => 'ظ', + 126651 => 'غ', + 127274 => '〔s〕', + 127275 => 'c', + 127276 => 'r', + 127277 => 'cd', + 127278 => 'wz', + 127280 => 'a', + 127281 => 'b', + 127282 => 'c', + 127283 => 'd', + 127284 => 'e', + 127285 => 'f', + 127286 => 'g', + 127287 => 'h', + 127288 => 'i', + 127289 => 'j', + 127290 => 'k', + 127291 => 'l', + 127292 => 'm', + 127293 => 'n', + 127294 => 'o', + 127295 => 'p', + 127296 => 'q', + 127297 => 'r', + 127298 => 's', + 127299 => 't', + 127300 => 'u', + 127301 => 'v', + 127302 => 'w', + 127303 => 'x', + 127304 => 'y', + 127305 => 'z', + 127306 => 'hv', + 127307 => 'mv', + 127308 => 'sd', + 127309 => 'ss', + 127310 => 'ppv', + 127311 => 'wc', + 127338 => 'mc', + 127339 => 'md', + 127340 => 'mr', + 127376 => 'dj', + 127488 => 'ほか', + 127489 => 'ココ', + 127490 => 'サ', + 127504 => '手', + 127505 => '字', + 127506 => '双', + 127507 => 'デ', + 127508 => '二', + 127509 => '多', + 127510 => '解', + 127511 => '天', + 127512 => '交', + 127513 => '映', + 127514 => '無', + 127515 => '料', + 127516 => '前', + 127517 => '後', + 127518 => '再', + 127519 => '新', + 127520 => '初', + 127521 => '終', + 127522 => '生', + 127523 => '販', + 127524 => '声', + 127525 => '吹', + 127526 => '演', + 127527 => '投', + 127528 => '捕', + 127529 => '一', + 127530 => '三', + 127531 => '遊', + 127532 => '左', + 127533 => '中', + 127534 => '右', + 127535 => '指', + 127536 => '走', + 127537 => '打', + 127538 => '禁', + 127539 => '空', + 127540 => '合', + 127541 => '満', + 127542 => '有', + 127543 => '月', + 127544 => '申', + 127545 => '割', + 127546 => '営', + 127547 => '配', + 127552 => '〔本〕', + 127553 => '〔三〕', + 127554 => '〔二〕', + 127555 => '〔安〕', + 127556 => '〔点〕', + 127557 => '〔打〕', + 127558 => '〔盗〕', + 127559 => '〔勝〕', + 127560 => '〔敗〕', + 127568 => '得', + 127569 => '可', + 130032 => '0', + 130033 => '1', + 130034 => '2', + 130035 => '3', + 130036 => '4', + 130037 => '5', + 130038 => '6', + 130039 => '7', + 130040 => '8', + 130041 => '9', + 194560 => '丽', + 194561 => '丸', + 194562 => '乁', + 194563 => '𠄢', + 194564 => '你', + 194565 => '侮', + 194566 => '侻', + 194567 => '倂', + 194568 => '偺', + 194569 => '備', + 194570 => '僧', + 194571 => '像', + 194572 => '㒞', + 194573 => '𠘺', + 194574 => '免', + 194575 => '兔', + 194576 => '兤', + 194577 => '具', + 194578 => '𠔜', + 194579 => '㒹', + 194580 => '內', + 194581 => '再', + 194582 => '𠕋', + 194583 => '冗', + 194584 => '冤', + 194585 => '仌', + 194586 => '冬', + 194587 => '况', + 194588 => '𩇟', + 194589 => '凵', + 194590 => '刃', + 194591 => '㓟', + 194592 => '刻', + 194593 => '剆', + 194594 => '割', + 194595 => '剷', + 194596 => '㔕', + 194597 => '勇', + 194598 => '勉', + 194599 => '勤', + 194600 => '勺', + 194601 => '包', + 194602 => '匆', + 194603 => '北', + 194604 => '卉', + 194605 => '卑', + 194606 => '博', + 194607 => '即', + 194608 => '卽', + 194609 => '卿', + 194610 => '卿', + 194611 => '卿', + 194612 => '𠨬', + 194613 => '灰', + 194614 => '及', + 194615 => '叟', + 194616 => '𠭣', + 194617 => '叫', + 194618 => '叱', + 194619 => '吆', + 194620 => '咞', + 194621 => '吸', + 194622 => '呈', + 194623 => '周', + 194624 => '咢', + 194625 => '哶', + 194626 => '唐', + 194627 => '啓', + 194628 => '啣', + 194629 => '善', + 194630 => '善', + 194631 => '喙', + 194632 => '喫', + 194633 => '喳', + 194634 => '嗂', + 194635 => '圖', + 194636 => '嘆', + 194637 => '圗', + 194638 => '噑', + 194639 => '噴', + 194640 => '切', + 194641 => '壮', + 194642 => '城', + 194643 => '埴', + 194644 => '堍', + 194645 => '型', + 194646 => '堲', + 194647 => '報', + 194648 => '墬', + 194649 => '𡓤', + 194650 => '売', + 194651 => '壷', + 194652 => '夆', + 194653 => '多', + 194654 => '夢', + 194655 => '奢', + 194656 => '𡚨', + 194657 => '𡛪', + 194658 => '姬', + 194659 => '娛', + 194660 => '娧', + 194661 => '姘', + 194662 => '婦', + 194663 => '㛮', + 194665 => '嬈', + 194666 => '嬾', + 194667 => '嬾', + 194668 => '𡧈', + 194669 => '寃', + 194670 => '寘', + 194671 => '寧', + 194672 => '寳', + 194673 => '𡬘', + 194674 => '寿', + 194675 => '将', + 194677 => '尢', + 194678 => '㞁', + 194679 => '屠', + 194680 => '屮', + 194681 => '峀', + 194682 => '岍', + 194683 => '𡷤', + 194684 => '嵃', + 194685 => '𡷦', + 194686 => '嵮', + 194687 => '嵫', + 194688 => '嵼', + 194689 => '巡', + 194690 => '巢', + 194691 => '㠯', + 194692 => '巽', + 194693 => '帨', + 194694 => '帽', + 194695 => '幩', + 194696 => '㡢', + 194697 => '𢆃', + 194698 => '㡼', + 194699 => '庰', + 194700 => '庳', + 194701 => '庶', + 194702 => '廊', + 194703 => '𪎒', + 194704 => '廾', + 194705 => '𢌱', + 194706 => '𢌱', + 194707 => '舁', + 194708 => '弢', + 194709 => '弢', + 194710 => '㣇', + 194711 => '𣊸', + 194712 => '𦇚', + 194713 => '形', + 194714 => '彫', + 194715 => '㣣', + 194716 => '徚', + 194717 => '忍', + 194718 => '志', + 194719 => '忹', + 194720 => '悁', + 194721 => '㤺', + 194722 => '㤜', + 194723 => '悔', + 194724 => '𢛔', + 194725 => '惇', + 194726 => '慈', + 194727 => '慌', + 194728 => '慎', + 194729 => '慌', + 194730 => '慺', + 194731 => '憎', + 194732 => '憲', + 194733 => '憤', + 194734 => '憯', + 194735 => '懞', + 194736 => '懲', + 194737 => '懶', + 194738 => '成', + 194739 => '戛', + 194740 => '扝', + 194741 => '抱', + 194742 => '拔', + 194743 => '捐', + 194744 => '𢬌', + 194745 => '挽', + 194746 => '拼', + 194747 => '捨', + 194748 => '掃', + 194749 => '揤', + 194750 => '𢯱', + 194751 => '搢', + 194752 => '揅', + 194753 => '掩', + 194754 => '㨮', + 194755 => '摩', + 194756 => '摾', + 194757 => '撝', + 194758 => '摷', + 194759 => '㩬', + 194760 => '敏', + 194761 => '敬', + 194762 => '𣀊', + 194763 => '旣', + 194764 => '書', + 194765 => '晉', + 194766 => '㬙', + 194767 => '暑', + 194768 => '㬈', + 194769 => '㫤', + 194770 => '冒', + 194771 => '冕', + 194772 => '最', + 194773 => '暜', + 194774 => '肭', + 194775 => '䏙', + 194776 => '朗', + 194777 => '望', + 194778 => '朡', + 194779 => '杞', + 194780 => '杓', + 194781 => '𣏃', + 194782 => '㭉', + 194783 => '柺', + 194784 => '枅', + 194785 => '桒', + 194786 => '梅', + 194787 => '𣑭', + 194788 => '梎', + 194789 => '栟', + 194790 => '椔', + 194791 => '㮝', + 194792 => '楂', + 194793 => '榣', + 194794 => '槪', + 194795 => '檨', + 194796 => '𣚣', + 194797 => '櫛', + 194798 => '㰘', + 194799 => '次', + 194800 => '𣢧', + 194801 => '歔', + 194802 => '㱎', + 194803 => '歲', + 194804 => '殟', + 194805 => '殺', + 194806 => '殻', + 194807 => '𣪍', + 194808 => '𡴋', + 194809 => '𣫺', + 194810 => '汎', + 194811 => '𣲼', + 194812 => '沿', + 194813 => '泍', + 194814 => '汧', + 194815 => '洖', + 194816 => '派', + 194817 => '海', + 194818 => '流', + 194819 => '浩', + 194820 => '浸', + 194821 => '涅', + 194822 => '𣴞', + 194823 => '洴', + 194824 => '港', + 194825 => '湮', + 194826 => '㴳', + 194827 => '滋', + 194828 => '滇', + 194829 => '𣻑', + 194830 => '淹', + 194831 => '潮', + 194832 => '𣽞', + 194833 => '𣾎', + 194834 => '濆', + 194835 => '瀹', + 194836 => '瀞', + 194837 => '瀛', + 194838 => '㶖', + 194839 => '灊', + 194840 => '災', + 194841 => '灷', + 194842 => '炭', + 194843 => '𠔥', + 194844 => '煅', + 194845 => '𤉣', + 194846 => '熜', + 194848 => '爨', + 194849 => '爵', + 194850 => '牐', + 194851 => '𤘈', + 194852 => '犀', + 194853 => '犕', + 194854 => '𤜵', + 194855 => '𤠔', + 194856 => '獺', + 194857 => '王', + 194858 => '㺬', + 194859 => '玥', + 194860 => '㺸', + 194861 => '㺸', + 194862 => '瑇', + 194863 => '瑜', + 194864 => '瑱', + 194865 => '璅', + 194866 => '瓊', + 194867 => '㼛', + 194868 => '甤', + 194869 => '𤰶', + 194870 => '甾', + 194871 => '𤲒', + 194872 => '異', + 194873 => '𢆟', + 194874 => '瘐', + 194875 => '𤾡', + 194876 => '𤾸', + 194877 => '𥁄', + 194878 => '㿼', + 194879 => '䀈', + 194880 => '直', + 194881 => '𥃳', + 194882 => '𥃲', + 194883 => '𥄙', + 194884 => '𥄳', + 194885 => '眞', + 194886 => '真', + 194887 => '真', + 194888 => '睊', + 194889 => '䀹', + 194890 => '瞋', + 194891 => '䁆', + 194892 => '䂖', + 194893 => '𥐝', + 194894 => '硎', + 194895 => '碌', + 194896 => '磌', + 194897 => '䃣', + 194898 => '𥘦', + 194899 => '祖', + 194900 => '𥚚', + 194901 => '𥛅', + 194902 => '福', + 194903 => '秫', + 194904 => '䄯', + 194905 => '穀', + 194906 => '穊', + 194907 => '穏', + 194908 => '𥥼', + 194909 => '𥪧', + 194910 => '𥪧', + 194912 => '䈂', + 194913 => '𥮫', + 194914 => '篆', + 194915 => '築', + 194916 => '䈧', + 194917 => '𥲀', + 194918 => '糒', + 194919 => '䊠', + 194920 => '糨', + 194921 => '糣', + 194922 => '紀', + 194923 => '𥾆', + 194924 => '絣', + 194925 => '䌁', + 194926 => '緇', + 194927 => '縂', + 194928 => '繅', + 194929 => '䌴', + 194930 => '𦈨', + 194931 => '𦉇', + 194932 => '䍙', + 194933 => '𦋙', + 194934 => '罺', + 194935 => '𦌾', + 194936 => '羕', + 194937 => '翺', + 194938 => '者', + 194939 => '𦓚', + 194940 => '𦔣', + 194941 => '聠', + 194942 => '𦖨', + 194943 => '聰', + 194944 => '𣍟', + 194945 => '䏕', + 194946 => '育', + 194947 => '脃', + 194948 => '䐋', + 194949 => '脾', + 194950 => '媵', + 194951 => '𦞧', + 194952 => '𦞵', + 194953 => '𣎓', + 194954 => '𣎜', + 194955 => '舁', + 194956 => '舄', + 194957 => '辞', + 194958 => '䑫', + 194959 => '芑', + 194960 => '芋', + 194961 => '芝', + 194962 => '劳', + 194963 => '花', + 194964 => '芳', + 194965 => '芽', + 194966 => '苦', + 194967 => '𦬼', + 194968 => '若', + 194969 => '茝', + 194970 => '荣', + 194971 => '莭', + 194972 => '茣', + 194973 => '莽', + 194974 => '菧', + 194975 => '著', + 194976 => '荓', + 194977 => '菊', + 194978 => '菌', + 194979 => '菜', + 194980 => '𦰶', + 194981 => '𦵫', + 194982 => '𦳕', + 194983 => '䔫', + 194984 => '蓱', + 194985 => '蓳', + 194986 => '蔖', + 194987 => '𧏊', + 194988 => '蕤', + 194989 => '𦼬', + 194990 => '䕝', + 194991 => '䕡', + 194992 => '𦾱', + 194993 => '𧃒', + 194994 => '䕫', + 194995 => '虐', + 194996 => '虜', + 194997 => '虧', + 194998 => '虩', + 194999 => '蚩', + 195000 => '蚈', + 195001 => '蜎', + 195002 => '蛢', + 195003 => '蝹', + 195004 => '蜨', + 195005 => '蝫', + 195006 => '螆', + 195008 => '蟡', + 195009 => '蠁', + 195010 => '䗹', + 195011 => '衠', + 195012 => '衣', + 195013 => '𧙧', + 195014 => '裗', + 195015 => '裞', + 195016 => '䘵', + 195017 => '裺', + 195018 => '㒻', + 195019 => '𧢮', + 195020 => '𧥦', + 195021 => '䚾', + 195022 => '䛇', + 195023 => '誠', + 195024 => '諭', + 195025 => '變', + 195026 => '豕', + 195027 => '𧲨', + 195028 => '貫', + 195029 => '賁', + 195030 => '贛', + 195031 => '起', + 195032 => '𧼯', + 195033 => '𠠄', + 195034 => '跋', + 195035 => '趼', + 195036 => '跰', + 195037 => '𠣞', + 195038 => '軔', + 195039 => '輸', + 195040 => '𨗒', + 195041 => '𨗭', + 195042 => '邔', + 195043 => '郱', + 195044 => '鄑', + 195045 => '𨜮', + 195046 => '鄛', + 195047 => '鈸', + 195048 => '鋗', + 195049 => '鋘', + 195050 => '鉼', + 195051 => '鏹', + 195052 => '鐕', + 195053 => '𨯺', + 195054 => '開', + 195055 => '䦕', + 195056 => '閷', + 195057 => '𨵷', + 195058 => '䧦', + 195059 => '雃', + 195060 => '嶲', + 195061 => '霣', + 195062 => '𩅅', + 195063 => '𩈚', + 195064 => '䩮', + 195065 => '䩶', + 195066 => '韠', + 195067 => '𩐊', + 195068 => '䪲', + 195069 => '𩒖', + 195070 => '頋', + 195071 => '頋', + 195072 => '頩', + 195073 => '𩖶', + 195074 => '飢', + 195075 => '䬳', + 195076 => '餩', + 195077 => '馧', + 195078 => '駂', + 195079 => '駾', + 195080 => '䯎', + 195081 => '𩬰', + 195082 => '鬒', + 195083 => '鱀', + 195084 => '鳽', + 195085 => '䳎', + 195086 => '䳭', + 195087 => '鵧', + 195088 => '𪃎', + 195089 => '䳸', + 195090 => '𪄅', + 195091 => '𪈎', + 195092 => '𪊑', + 195093 => '麻', + 195094 => '䵖', + 195095 => '黹', + 195096 => '黾', + 195097 => '鼅', + 195098 => '鼏', + 195099 => '鼖', + 195100 => '鼻', + 195101 => '𪘀', +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php new file mode 100644 index 00000000..1958e37e --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php @@ -0,0 +1,65 @@ + 9, + 2509 => 9, + 2637 => 9, + 2765 => 9, + 2893 => 9, + 3021 => 9, + 3149 => 9, + 3277 => 9, + 3387 => 9, + 3388 => 9, + 3405 => 9, + 3530 => 9, + 3642 => 9, + 3770 => 9, + 3972 => 9, + 4153 => 9, + 4154 => 9, + 5908 => 9, + 5940 => 9, + 6098 => 9, + 6752 => 9, + 6980 => 9, + 7082 => 9, + 7083 => 9, + 7154 => 9, + 7155 => 9, + 11647 => 9, + 43014 => 9, + 43052 => 9, + 43204 => 9, + 43347 => 9, + 43456 => 9, + 43766 => 9, + 44013 => 9, + 68159 => 9, + 69702 => 9, + 69759 => 9, + 69817 => 9, + 69939 => 9, + 69940 => 9, + 70080 => 9, + 70197 => 9, + 70378 => 9, + 70477 => 9, + 70722 => 9, + 70850 => 9, + 71103 => 9, + 71231 => 9, + 71350 => 9, + 71467 => 9, + 71737 => 9, + 71997 => 9, + 71998 => 9, + 72160 => 9, + 72244 => 9, + 72263 => 9, + 72345 => 9, + 72767 => 9, + 73028 => 9, + 73029 => 9, + 73111 => 9, +); diff --git a/vendor/symfony/polyfill-intl-idn/bootstrap.php b/vendor/symfony/polyfill-intl-idn/bootstrap.php new file mode 100644 index 00000000..f02d5de7 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/bootstrap.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Idn as p; + +if (extension_loaded('intl')) { + return; +} + +if (!defined('U_IDNA_PROHIBITED_ERROR')) { + define('U_IDNA_PROHIBITED_ERROR', 66560); +} +if (!defined('U_IDNA_ERROR_START')) { + define('U_IDNA_ERROR_START', 66560); +} +if (!defined('U_IDNA_UNASSIGNED_ERROR')) { + define('U_IDNA_UNASSIGNED_ERROR', 66561); +} +if (!defined('U_IDNA_CHECK_BIDI_ERROR')) { + define('U_IDNA_CHECK_BIDI_ERROR', 66562); +} +if (!defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { + define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); +} +if (!defined('U_IDNA_ACE_PREFIX_ERROR')) { + define('U_IDNA_ACE_PREFIX_ERROR', 66564); +} +if (!defined('U_IDNA_VERIFICATION_ERROR')) { + define('U_IDNA_VERIFICATION_ERROR', 66565); +} +if (!defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { + define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); +} +if (!defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { + define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); +} +if (!defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { + define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); +} +if (!defined('U_IDNA_ERROR_LIMIT')) { + define('U_IDNA_ERROR_LIMIT', 66569); +} +if (!defined('U_STRINGPREP_PROHIBITED_ERROR')) { + define('U_STRINGPREP_PROHIBITED_ERROR', 66560); +} +if (!defined('U_STRINGPREP_UNASSIGNED_ERROR')) { + define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); +} +if (!defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { + define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); +} +if (!defined('IDNA_DEFAULT')) { + define('IDNA_DEFAULT', 0); +} +if (!defined('IDNA_ALLOW_UNASSIGNED')) { + define('IDNA_ALLOW_UNASSIGNED', 1); +} +if (!defined('IDNA_USE_STD3_RULES')) { + define('IDNA_USE_STD3_RULES', 2); +} +if (!defined('IDNA_CHECK_BIDI')) { + define('IDNA_CHECK_BIDI', 4); +} +if (!defined('IDNA_CHECK_CONTEXTJ')) { + define('IDNA_CHECK_CONTEXTJ', 8); +} +if (!defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { + define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); +} +if (!defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { + define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); +} +if (!defined('INTL_IDNA_VARIANT_2003')) { + define('INTL_IDNA_VARIANT_2003', 0); +} +if (!defined('INTL_IDNA_VARIANT_UTS46')) { + define('INTL_IDNA_VARIANT_UTS46', 1); +} +if (!defined('IDNA_ERROR_EMPTY_LABEL')) { + define('IDNA_ERROR_EMPTY_LABEL', 1); +} +if (!defined('IDNA_ERROR_LABEL_TOO_LONG')) { + define('IDNA_ERROR_LABEL_TOO_LONG', 2); +} +if (!defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { + define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); +} +if (!defined('IDNA_ERROR_LEADING_HYPHEN')) { + define('IDNA_ERROR_LEADING_HYPHEN', 8); +} +if (!defined('IDNA_ERROR_TRAILING_HYPHEN')) { + define('IDNA_ERROR_TRAILING_HYPHEN', 16); +} +if (!defined('IDNA_ERROR_HYPHEN_3_4')) { + define('IDNA_ERROR_HYPHEN_3_4', 32); +} +if (!defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { + define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); +} +if (!defined('IDNA_ERROR_DISALLOWED')) { + define('IDNA_ERROR_DISALLOWED', 128); +} +if (!defined('IDNA_ERROR_PUNYCODE')) { + define('IDNA_ERROR_PUNYCODE', 256); +} +if (!defined('IDNA_ERROR_LABEL_HAS_DOT')) { + define('IDNA_ERROR_LABEL_HAS_DOT', 512); +} +if (!defined('IDNA_ERROR_INVALID_ACE_LABEL')) { + define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); +} +if (!defined('IDNA_ERROR_BIDI')) { + define('IDNA_ERROR_BIDI', 2048); +} +if (!defined('IDNA_ERROR_CONTEXTJ')) { + define('IDNA_ERROR_CONTEXTJ', 4096); +} + +if (PHP_VERSION_ID < 70400) { + if (!function_exists('idn_to_ascii')) { + function idn_to_ascii($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } + } + if (!function_exists('idn_to_utf8')) { + function idn_to_utf8($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } + } +} else { + if (!function_exists('idn_to_ascii')) { + function idn_to_ascii($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } + } + if (!function_exists('idn_to_utf8')) { + function idn_to_utf8($domain, $options = IDNA_DEFAULT, $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } + } +} diff --git a/vendor/symfony/polyfill-intl-idn/composer.json b/vendor/symfony/polyfill-intl-idn/composer.json new file mode 100644 index 00000000..a3bd0d76 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/composer.json @@ -0,0 +1,44 @@ +{ + "name": "symfony/polyfill-intl-idn", + "type": "library", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "idn"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/LICENSE b/vendor/symfony/polyfill-intl-normalizer/LICENSE new file mode 100644 index 00000000..4cd8bdd3 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php new file mode 100644 index 00000000..a60fae62 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php @@ -0,0 +1,308 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Normalizer; + +/** + * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. + * + * It has been validated with Unicode 6.3 Normalization Conformance Test. + * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. + * + * @author Nicolas Grekas + * + * @internal + */ +class Normalizer +{ + const FORM_D = \Normalizer::FORM_D; + const FORM_KD = \Normalizer::FORM_KD; + const FORM_C = \Normalizer::FORM_C; + const FORM_KC = \Normalizer::FORM_KC; + const NFD = \Normalizer::NFD; + const NFKD = \Normalizer::NFKD; + const NFC = \Normalizer::NFC; + const NFKC = \Normalizer::NFKC; + + private static $C; + private static $D; + private static $KD; + private static $cC; + private static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4); + private static $ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; + + public static function isNormalized($s, $form = self::NFC) + { + if (!\in_array($form, array(self::NFD, self::NFKD, self::NFC, self::NFKC))) { + return false; + } + $s = (string) $s; + if (!isset($s[strspn($s, self::$ASCII)])) { + return true; + } + if (self::NFC == $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) { + return true; + } + + return self::normalize($s, $form) === $s; + } + + public static function normalize($s, $form = self::NFC) + { + $s = (string) $s; + if (!preg_match('//u', $s)) { + return false; + } + + switch ($form) { + case self::NFC: $C = true; $K = false; break; + case self::NFD: $C = false; $K = false; break; + case self::NFKC: $C = true; $K = true; break; + case self::NFKD: $C = false; $K = true; break; + default: + if (\defined('Normalizer::NONE') && \Normalizer::NONE == $form) { + return $s; + } + + return false; + } + + if ('' === $s) { + return ''; + } + + if ($K && null === self::$KD) { + self::$KD = self::getData('compatibilityDecomposition'); + } + + if (null === self::$D) { + self::$D = self::getData('canonicalDecomposition'); + self::$cC = self::getData('combiningClass'); + } + + if (null !== $mbEncoding = (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) ? mb_internal_encoding() : null) { + mb_internal_encoding('8bit'); + } + + $r = self::decompose($s, $K); + + if ($C) { + if (null === self::$C) { + self::$C = self::getData('canonicalComposition'); + } + + $r = self::recompose($r); + } + if (null !== $mbEncoding) { + mb_internal_encoding($mbEncoding); + } + + return $r; + } + + private static function recompose($s) + { + $ASCII = self::$ASCII; + $compMap = self::$C; + $combClass = self::$cC; + $ulenMask = self::$ulenMask; + + $result = $tail = ''; + + $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xF0"]; + $len = \strlen($s); + + $lastUchr = substr($s, 0, $i); + $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0; + + while ($i < $len) { + if ($s[$i] < "\x80") { + // ASCII chars + + if ($tail) { + $lastUchr .= $tail; + $tail = ''; + } + + if ($j = strspn($s, $ASCII, $i + 1)) { + $lastUchr .= substr($s, $i, $j); + $i += $j; + } + + $result .= $lastUchr; + $lastUchr = $s[$i]; + $lastUcls = 0; + ++$i; + continue; + } + + $ulen = $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + + if ($lastUchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr + || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr + || $lastUcls) { + // Table lookup and combining chars composition + + $ucls = isset($combClass[$uchr]) ? $combClass[$uchr] : 0; + + if (isset($compMap[$lastUchr.$uchr]) && (!$lastUcls || $lastUcls < $ucls)) { + $lastUchr = $compMap[$lastUchr.$uchr]; + } elseif ($lastUcls = $ucls) { + $tail .= $uchr; + } else { + if ($tail) { + $lastUchr .= $tail; + $tail = ''; + } + + $result .= $lastUchr; + $lastUchr = $uchr; + } + } else { + // Hangul chars + + $L = \ord($lastUchr[2]) - 0x80; + $V = \ord($uchr[2]) - 0xA1; + $T = 0; + + $uchr = substr($s, $i + $ulen, 3); + + if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") { + $T = \ord($uchr[2]) - 0xA7; + 0 > $T && $T += 0x40; + $ulen += 3; + } + + $L = 0xAC00 + ($L * 21 + $V) * 28 + $T; + $lastUchr = \chr(0xE0 | $L >> 12).\chr(0x80 | $L >> 6 & 0x3F).\chr(0x80 | $L & 0x3F); + } + + $i += $ulen; + } + + return $result.$lastUchr.$tail; + } + + private static function decompose($s, $c) + { + $result = ''; + + $ASCII = self::$ASCII; + $decompMap = self::$D; + $combClass = self::$cC; + $ulenMask = self::$ulenMask; + if ($c) { + $compatMap = self::$KD; + } + + $c = array(); + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + if ($s[$i] < "\x80") { + // ASCII chars + + if ($c) { + ksort($c); + $result .= implode('', $c); + $c = array(); + } + + $j = 1 + strspn($s, $ASCII, $i + 1); + $result .= substr($s, $i, $j); + $i += $j; + continue; + } + + $ulen = $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr) { + // Table lookup + + if ($uchr !== $j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr)) { + $uchr = $j; + + $j = \strlen($uchr); + $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xF0"]; + + if ($ulen != $j) { + // Put trailing chars in $s + + $j -= $ulen; + $i -= $j; + + if (0 > $i) { + $s = str_repeat(' ', -$i).$s; + $len -= $i; + $i = 0; + } + + while ($j--) { + $s[$i + $j] = $uchr[$ulen + $j]; + } + + $uchr = substr($uchr, 0, $ulen); + } + } + if (isset($combClass[$uchr])) { + // Combining chars, for sorting + + if (!isset($c[$combClass[$uchr]])) { + $c[$combClass[$uchr]] = ''; + } + $c[$combClass[$uchr]] .= $uchr; + continue; + } + } else { + // Hangul chars + + $uchr = unpack('C*', $uchr); + $j = (($uchr[1] - 224) << 12) + (($uchr[2] - 128) << 6) + $uchr[3] - 0xAC80; + + $uchr = "\xE1\x84".\chr(0x80 + (int) ($j / 588)) + ."\xE1\x85".\chr(0xA1 + (int) (($j % 588) / 28)); + + if ($j %= 28) { + $uchr .= $j < 25 + ? ("\xE1\x86".\chr(0xA7 + $j)) + : ("\xE1\x87".\chr(0x67 + $j)); + } + } + if ($c) { + ksort($c); + $result .= implode('', $c); + $c = array(); + } + + $result .= $uchr; + } + + if ($c) { + ksort($c); + $result .= implode('', $c); + } + + return $result; + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/README.md b/vendor/symfony/polyfill-intl-normalizer/README.md new file mode 100644 index 00000000..15060c5f --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/README.md @@ -0,0 +1,14 @@ +Symfony Polyfill / Intl: Normalizer +=================================== + +This component provides a fallback implementation for the +[`Normalizer`](https://php.net/Normalizer) class provided +by the [Intl](https://php.net/intl) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php new file mode 100644 index 00000000..ca18eff3 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php @@ -0,0 +1,17 @@ + 'À', + 'Á' => 'Á', + 'Â' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Å' => 'Å', + 'Ç' => 'Ç', + 'È' => 'È', + 'É' => 'É', + 'Ê' => 'Ê', + 'Ë' => 'Ë', + 'Ì' => 'Ì', + 'Í' => 'Í', + 'Î' => 'Î', + 'Ï' => 'Ï', + 'Ñ' => 'Ñ', + 'Ò' => 'Ò', + 'Ó' => 'Ó', + 'Ô' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + 'Ù' => 'Ù', + 'Ú' => 'Ú', + 'Û' => 'Û', + 'Ü' => 'Ü', + 'Ý' => 'Ý', + 'à' => 'à', + 'á' => 'á', + 'â' => 'â', + 'ã' => 'ã', + 'ä' => 'ä', + 'å' => 'å', + 'ç' => 'ç', + 'è' => 'è', + 'é' => 'é', + 'ê' => 'ê', + 'ë' => 'ë', + 'ì' => 'ì', + 'í' => 'í', + 'î' => 'î', + 'ï' => 'ï', + 'ñ' => 'ñ', + 'ò' => 'ò', + 'ó' => 'ó', + 'ô' => 'ô', + 'õ' => 'õ', + 'ö' => 'ö', + 'ù' => 'ù', + 'ú' => 'ú', + 'û' => 'û', + 'ü' => 'ü', + 'ý' => 'ý', + 'ÿ' => 'ÿ', + 'Ā' => 'Ā', + 'ā' => 'ā', + 'Ă' => 'Ă', + 'ă' => 'ă', + 'Ą' => 'Ą', + 'ą' => 'ą', + 'Ć' => 'Ć', + 'ć' => 'ć', + 'Ĉ' => 'Ĉ', + 'ĉ' => 'ĉ', + 'Ċ' => 'Ċ', + 'ċ' => 'ċ', + 'Č' => 'Č', + 'č' => 'č', + 'Ď' => 'Ď', + 'ď' => 'ď', + 'Ē' => 'Ē', + 'ē' => 'ē', + 'Ĕ' => 'Ĕ', + 'ĕ' => 'ĕ', + 'Ė' => 'Ė', + 'ė' => 'ė', + 'Ę' => 'Ę', + 'ę' => 'ę', + 'Ě' => 'Ě', + 'ě' => 'ě', + 'Ĝ' => 'Ĝ', + 'ĝ' => 'ĝ', + 'Ğ' => 'Ğ', + 'ğ' => 'ğ', + 'Ġ' => 'Ġ', + 'ġ' => 'ġ', + 'Ģ' => 'Ģ', + 'ģ' => 'ģ', + 'Ĥ' => 'Ĥ', + 'ĥ' => 'ĥ', + 'Ĩ' => 'Ĩ', + 'ĩ' => 'ĩ', + 'Ī' => 'Ī', + 'ī' => 'ī', + 'Ĭ' => 'Ĭ', + 'ĭ' => 'ĭ', + 'Į' => 'Į', + 'į' => 'į', + 'İ' => 'İ', + 'Ĵ' => 'Ĵ', + 'ĵ' => 'ĵ', + 'Ķ' => 'Ķ', + 'ķ' => 'ķ', + 'Ĺ' => 'Ĺ', + 'ĺ' => 'ĺ', + 'Ļ' => 'Ļ', + 'ļ' => 'ļ', + 'Ľ' => 'Ľ', + 'ľ' => 'ľ', + 'Ń' => 'Ń', + 'ń' => 'ń', + 'Ņ' => 'Ņ', + 'ņ' => 'ņ', + 'Ň' => 'Ň', + 'ň' => 'ň', + 'Ō' => 'Ō', + 'ō' => 'ō', + 'Ŏ' => 'Ŏ', + 'ŏ' => 'ŏ', + 'Ő' => 'Ő', + 'ő' => 'ő', + 'Ŕ' => 'Ŕ', + 'ŕ' => 'ŕ', + 'Ŗ' => 'Ŗ', + 'ŗ' => 'ŗ', + 'Ř' => 'Ř', + 'ř' => 'ř', + 'Ś' => 'Ś', + 'ś' => 'ś', + 'Ŝ' => 'Ŝ', + 'ŝ' => 'ŝ', + 'Ş' => 'Ş', + 'ş' => 'ş', + 'Š' => 'Š', + 'š' => 'š', + 'Ţ' => 'Ţ', + 'ţ' => 'ţ', + 'Ť' => 'Ť', + 'ť' => 'ť', + 'Ũ' => 'Ũ', + 'ũ' => 'ũ', + 'Ū' => 'Ū', + 'ū' => 'ū', + 'Ŭ' => 'Ŭ', + 'ŭ' => 'ŭ', + 'Ů' => 'Ů', + 'ů' => 'ů', + 'Ű' => 'Ű', + 'ű' => 'ű', + 'Ų' => 'Ų', + 'ų' => 'ų', + 'Ŵ' => 'Ŵ', + 'ŵ' => 'ŵ', + 'Ŷ' => 'Ŷ', + 'ŷ' => 'ŷ', + 'Ÿ' => 'Ÿ', + 'Ź' => 'Ź', + 'ź' => 'ź', + 'Ż' => 'Ż', + 'ż' => 'ż', + 'Ž' => 'Ž', + 'ž' => 'ž', + 'Ơ' => 'Ơ', + 'ơ' => 'ơ', + 'Ư' => 'Ư', + 'ư' => 'ư', + 'Ǎ' => 'Ǎ', + 'ǎ' => 'ǎ', + 'Ǐ' => 'Ǐ', + 'ǐ' => 'ǐ', + 'Ǒ' => 'Ǒ', + 'ǒ' => 'ǒ', + 'Ǔ' => 'Ǔ', + 'ǔ' => 'ǔ', + 'Ǖ' => 'Ǖ', + 'ǖ' => 'ǖ', + 'Ǘ' => 'Ǘ', + 'ǘ' => 'ǘ', + 'Ǚ' => 'Ǚ', + 'ǚ' => 'ǚ', + 'Ǜ' => 'Ǜ', + 'ǜ' => 'ǜ', + 'Ǟ' => 'Ǟ', + 'ǟ' => 'ǟ', + 'Ǡ' => 'Ǡ', + 'ǡ' => 'ǡ', + 'Ǣ' => 'Ǣ', + 'ǣ' => 'ǣ', + 'Ǧ' => 'Ǧ', + 'ǧ' => 'ǧ', + 'Ǩ' => 'Ǩ', + 'ǩ' => 'ǩ', + 'Ǫ' => 'Ǫ', + 'ǫ' => 'ǫ', + 'Ǭ' => 'Ǭ', + 'ǭ' => 'ǭ', + 'Ǯ' => 'Ǯ', + 'ǯ' => 'ǯ', + 'ǰ' => 'ǰ', + 'Ǵ' => 'Ǵ', + 'ǵ' => 'ǵ', + 'Ǹ' => 'Ǹ', + 'ǹ' => 'ǹ', + 'Ǻ' => 'Ǻ', + 'ǻ' => 'ǻ', + 'Ǽ' => 'Ǽ', + 'ǽ' => 'ǽ', + 'Ǿ' => 'Ǿ', + 'ǿ' => 'ǿ', + 'Ȁ' => 'Ȁ', + 'ȁ' => 'ȁ', + 'Ȃ' => 'Ȃ', + 'ȃ' => 'ȃ', + 'Ȅ' => 'Ȅ', + 'ȅ' => 'ȅ', + 'Ȇ' => 'Ȇ', + 'ȇ' => 'ȇ', + 'Ȉ' => 'Ȉ', + 'ȉ' => 'ȉ', + 'Ȋ' => 'Ȋ', + 'ȋ' => 'ȋ', + 'Ȍ' => 'Ȍ', + 'ȍ' => 'ȍ', + 'Ȏ' => 'Ȏ', + 'ȏ' => 'ȏ', + 'Ȑ' => 'Ȑ', + 'ȑ' => 'ȑ', + 'Ȓ' => 'Ȓ', + 'ȓ' => 'ȓ', + 'Ȕ' => 'Ȕ', + 'ȕ' => 'ȕ', + 'Ȗ' => 'Ȗ', + 'ȗ' => 'ȗ', + 'Ș' => 'Ș', + 'ș' => 'ș', + 'Ț' => 'Ț', + 'ț' => 'ț', + 'Ȟ' => 'Ȟ', + 'ȟ' => 'ȟ', + 'Ȧ' => 'Ȧ', + 'ȧ' => 'ȧ', + 'Ȩ' => 'Ȩ', + 'ȩ' => 'ȩ', + 'Ȫ' => 'Ȫ', + 'ȫ' => 'ȫ', + 'Ȭ' => 'Ȭ', + 'ȭ' => 'ȭ', + 'Ȯ' => 'Ȯ', + 'ȯ' => 'ȯ', + 'Ȱ' => 'Ȱ', + 'ȱ' => 'ȱ', + 'Ȳ' => 'Ȳ', + 'ȳ' => 'ȳ', + '΅' => '΅', + 'Ά' => 'Ά', + 'Έ' => 'Έ', + 'Ή' => 'Ή', + 'Ί' => 'Ί', + 'Ό' => 'Ό', + 'Ύ' => 'Ύ', + 'Ώ' => 'Ώ', + 'ΐ' => 'ΐ', + 'Ϊ' => 'Ϊ', + 'Ϋ' => 'Ϋ', + 'ά' => 'ά', + 'έ' => 'έ', + 'ή' => 'ή', + 'ί' => 'ί', + 'ΰ' => 'ΰ', + 'ϊ' => 'ϊ', + 'ϋ' => 'ϋ', + 'ό' => 'ό', + 'ύ' => 'ύ', + 'ώ' => 'ώ', + 'ϓ' => 'ϓ', + 'ϔ' => 'ϔ', + 'Ѐ' => 'Ѐ', + 'Ё' => 'Ё', + 'Ѓ' => 'Ѓ', + 'Ї' => 'Ї', + 'Ќ' => 'Ќ', + 'Ѝ' => 'Ѝ', + 'Ў' => 'Ў', + 'Й' => 'Й', + 'й' => 'й', + 'ѐ' => 'ѐ', + 'ё' => 'ё', + 'ѓ' => 'ѓ', + 'ї' => 'ї', + 'ќ' => 'ќ', + 'ѝ' => 'ѝ', + 'ў' => 'ў', + 'Ѷ' => 'Ѷ', + 'ѷ' => 'ѷ', + 'Ӂ' => 'Ӂ', + 'ӂ' => 'ӂ', + 'Ӑ' => 'Ӑ', + 'ӑ' => 'ӑ', + 'Ӓ' => 'Ӓ', + 'ӓ' => 'ӓ', + 'Ӗ' => 'Ӗ', + 'ӗ' => 'ӗ', + 'Ӛ' => 'Ӛ', + 'ӛ' => 'ӛ', + 'Ӝ' => 'Ӝ', + 'ӝ' => 'ӝ', + 'Ӟ' => 'Ӟ', + 'ӟ' => 'ӟ', + 'Ӣ' => 'Ӣ', + 'ӣ' => 'ӣ', + 'Ӥ' => 'Ӥ', + 'ӥ' => 'ӥ', + 'Ӧ' => 'Ӧ', + 'ӧ' => 'ӧ', + 'Ӫ' => 'Ӫ', + 'ӫ' => 'ӫ', + 'Ӭ' => 'Ӭ', + 'ӭ' => 'ӭ', + 'Ӯ' => 'Ӯ', + 'ӯ' => 'ӯ', + 'Ӱ' => 'Ӱ', + 'ӱ' => 'ӱ', + 'Ӳ' => 'Ӳ', + 'ӳ' => 'ӳ', + 'Ӵ' => 'Ӵ', + 'ӵ' => 'ӵ', + 'Ӹ' => 'Ӹ', + 'ӹ' => 'ӹ', + 'آ' => 'آ', + 'أ' => 'أ', + 'ؤ' => 'ؤ', + 'إ' => 'إ', + 'ئ' => 'ئ', + 'ۀ' => 'ۀ', + 'ۂ' => 'ۂ', + 'ۓ' => 'ۓ', + 'ऩ' => 'ऩ', + 'ऱ' => 'ऱ', + 'ऴ' => 'ऴ', + 'ো' => 'ো', + 'ৌ' => 'ৌ', + 'ୈ' => 'ୈ', + 'ୋ' => 'ୋ', + 'ୌ' => 'ୌ', + 'ஔ' => 'ஔ', + 'ொ' => 'ொ', + 'ோ' => 'ோ', + 'ௌ' => 'ௌ', + 'ై' => 'ై', + 'ೀ' => 'ೀ', + 'ೇ' => 'ೇ', + 'ೈ' => 'ೈ', + 'ೊ' => 'ೊ', + 'ೋ' => 'ೋ', + 'ൊ' => 'ൊ', + 'ോ' => 'ോ', + 'ൌ' => 'ൌ', + 'ේ' => 'ේ', + 'ො' => 'ො', + 'ෝ' => 'ෝ', + 'ෞ' => 'ෞ', + 'ဦ' => 'ဦ', + 'ᬆ' => 'ᬆ', + 'ᬈ' => 'ᬈ', + 'ᬊ' => 'ᬊ', + 'ᬌ' => 'ᬌ', + 'ᬎ' => 'ᬎ', + 'ᬒ' => 'ᬒ', + 'ᬻ' => 'ᬻ', + 'ᬽ' => 'ᬽ', + 'ᭀ' => 'ᭀ', + 'ᭁ' => 'ᭁ', + 'ᭃ' => 'ᭃ', + 'Ḁ' => 'Ḁ', + 'ḁ' => 'ḁ', + 'Ḃ' => 'Ḃ', + 'ḃ' => 'ḃ', + 'Ḅ' => 'Ḅ', + 'ḅ' => 'ḅ', + 'Ḇ' => 'Ḇ', + 'ḇ' => 'ḇ', + 'Ḉ' => 'Ḉ', + 'ḉ' => 'ḉ', + 'Ḋ' => 'Ḋ', + 'ḋ' => 'ḋ', + 'Ḍ' => 'Ḍ', + 'ḍ' => 'ḍ', + 'Ḏ' => 'Ḏ', + 'ḏ' => 'ḏ', + 'Ḑ' => 'Ḑ', + 'ḑ' => 'ḑ', + 'Ḓ' => 'Ḓ', + 'ḓ' => 'ḓ', + 'Ḕ' => 'Ḕ', + 'ḕ' => 'ḕ', + 'Ḗ' => 'Ḗ', + 'ḗ' => 'ḗ', + 'Ḙ' => 'Ḙ', + 'ḙ' => 'ḙ', + 'Ḛ' => 'Ḛ', + 'ḛ' => 'ḛ', + 'Ḝ' => 'Ḝ', + 'ḝ' => 'ḝ', + 'Ḟ' => 'Ḟ', + 'ḟ' => 'ḟ', + 'Ḡ' => 'Ḡ', + 'ḡ' => 'ḡ', + 'Ḣ' => 'Ḣ', + 'ḣ' => 'ḣ', + 'Ḥ' => 'Ḥ', + 'ḥ' => 'ḥ', + 'Ḧ' => 'Ḧ', + 'ḧ' => 'ḧ', + 'Ḩ' => 'Ḩ', + 'ḩ' => 'ḩ', + 'Ḫ' => 'Ḫ', + 'ḫ' => 'ḫ', + 'Ḭ' => 'Ḭ', + 'ḭ' => 'ḭ', + 'Ḯ' => 'Ḯ', + 'ḯ' => 'ḯ', + 'Ḱ' => 'Ḱ', + 'ḱ' => 'ḱ', + 'Ḳ' => 'Ḳ', + 'ḳ' => 'ḳ', + 'Ḵ' => 'Ḵ', + 'ḵ' => 'ḵ', + 'Ḷ' => 'Ḷ', + 'ḷ' => 'ḷ', + 'Ḹ' => 'Ḹ', + 'ḹ' => 'ḹ', + 'Ḻ' => 'Ḻ', + 'ḻ' => 'ḻ', + 'Ḽ' => 'Ḽ', + 'ḽ' => 'ḽ', + 'Ḿ' => 'Ḿ', + 'ḿ' => 'ḿ', + 'Ṁ' => 'Ṁ', + 'ṁ' => 'ṁ', + 'Ṃ' => 'Ṃ', + 'ṃ' => 'ṃ', + 'Ṅ' => 'Ṅ', + 'ṅ' => 'ṅ', + 'Ṇ' => 'Ṇ', + 'ṇ' => 'ṇ', + 'Ṉ' => 'Ṉ', + 'ṉ' => 'ṉ', + 'Ṋ' => 'Ṋ', + 'ṋ' => 'ṋ', + 'Ṍ' => 'Ṍ', + 'ṍ' => 'ṍ', + 'Ṏ' => 'Ṏ', + 'ṏ' => 'ṏ', + 'Ṑ' => 'Ṑ', + 'ṑ' => 'ṑ', + 'Ṓ' => 'Ṓ', + 'ṓ' => 'ṓ', + 'Ṕ' => 'Ṕ', + 'ṕ' => 'ṕ', + 'Ṗ' => 'Ṗ', + 'ṗ' => 'ṗ', + 'Ṙ' => 'Ṙ', + 'ṙ' => 'ṙ', + 'Ṛ' => 'Ṛ', + 'ṛ' => 'ṛ', + 'Ṝ' => 'Ṝ', + 'ṝ' => 'ṝ', + 'Ṟ' => 'Ṟ', + 'ṟ' => 'ṟ', + 'Ṡ' => 'Ṡ', + 'ṡ' => 'ṡ', + 'Ṣ' => 'Ṣ', + 'ṣ' => 'ṣ', + 'Ṥ' => 'Ṥ', + 'ṥ' => 'ṥ', + 'Ṧ' => 'Ṧ', + 'ṧ' => 'ṧ', + 'Ṩ' => 'Ṩ', + 'ṩ' => 'ṩ', + 'Ṫ' => 'Ṫ', + 'ṫ' => 'ṫ', + 'Ṭ' => 'Ṭ', + 'ṭ' => 'ṭ', + 'Ṯ' => 'Ṯ', + 'ṯ' => 'ṯ', + 'Ṱ' => 'Ṱ', + 'ṱ' => 'ṱ', + 'Ṳ' => 'Ṳ', + 'ṳ' => 'ṳ', + 'Ṵ' => 'Ṵ', + 'ṵ' => 'ṵ', + 'Ṷ' => 'Ṷ', + 'ṷ' => 'ṷ', + 'Ṹ' => 'Ṹ', + 'ṹ' => 'ṹ', + 'Ṻ' => 'Ṻ', + 'ṻ' => 'ṻ', + 'Ṽ' => 'Ṽ', + 'ṽ' => 'ṽ', + 'Ṿ' => 'Ṿ', + 'ṿ' => 'ṿ', + 'Ẁ' => 'Ẁ', + 'ẁ' => 'ẁ', + 'Ẃ' => 'Ẃ', + 'ẃ' => 'ẃ', + 'Ẅ' => 'Ẅ', + 'ẅ' => 'ẅ', + 'Ẇ' => 'Ẇ', + 'ẇ' => 'ẇ', + 'Ẉ' => 'Ẉ', + 'ẉ' => 'ẉ', + 'Ẋ' => 'Ẋ', + 'ẋ' => 'ẋ', + 'Ẍ' => 'Ẍ', + 'ẍ' => 'ẍ', + 'Ẏ' => 'Ẏ', + 'ẏ' => 'ẏ', + 'Ẑ' => 'Ẑ', + 'ẑ' => 'ẑ', + 'Ẓ' => 'Ẓ', + 'ẓ' => 'ẓ', + 'Ẕ' => 'Ẕ', + 'ẕ' => 'ẕ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'ẘ', + 'ẙ' => 'ẙ', + 'ẛ' => 'ẛ', + 'Ạ' => 'Ạ', + 'ạ' => 'ạ', + 'Ả' => 'Ả', + 'ả' => 'ả', + 'Ấ' => 'Ấ', + 'ấ' => 'ấ', + 'Ầ' => 'Ầ', + 'ầ' => 'ầ', + 'Ẩ' => 'Ẩ', + 'ẩ' => 'ẩ', + 'Ẫ' => 'Ẫ', + 'ẫ' => 'ẫ', + 'Ậ' => 'Ậ', + 'ậ' => 'ậ', + 'Ắ' => 'Ắ', + 'ắ' => 'ắ', + 'Ằ' => 'Ằ', + 'ằ' => 'ằ', + 'Ẳ' => 'Ẳ', + 'ẳ' => 'ẳ', + 'Ẵ' => 'Ẵ', + 'ẵ' => 'ẵ', + 'Ặ' => 'Ặ', + 'ặ' => 'ặ', + 'Ẹ' => 'Ẹ', + 'ẹ' => 'ẹ', + 'Ẻ' => 'Ẻ', + 'ẻ' => 'ẻ', + 'Ẽ' => 'Ẽ', + 'ẽ' => 'ẽ', + 'Ế' => 'Ế', + 'ế' => 'ế', + 'Ề' => 'Ề', + 'ề' => 'ề', + 'Ể' => 'Ể', + 'ể' => 'ể', + 'Ễ' => 'Ễ', + 'ễ' => 'ễ', + 'Ệ' => 'Ệ', + 'ệ' => 'ệ', + 'Ỉ' => 'Ỉ', + 'ỉ' => 'ỉ', + 'Ị' => 'Ị', + 'ị' => 'ị', + 'Ọ' => 'Ọ', + 'ọ' => 'ọ', + 'Ỏ' => 'Ỏ', + 'ỏ' => 'ỏ', + 'Ố' => 'Ố', + 'ố' => 'ố', + 'Ồ' => 'Ồ', + 'ồ' => 'ồ', + 'Ổ' => 'Ổ', + 'ổ' => 'ổ', + 'Ỗ' => 'Ỗ', + 'ỗ' => 'ỗ', + 'Ộ' => 'Ộ', + 'ộ' => 'ộ', + 'Ớ' => 'Ớ', + 'ớ' => 'ớ', + 'Ờ' => 'Ờ', + 'ờ' => 'ờ', + 'Ở' => 'Ở', + 'ở' => 'ở', + 'Ỡ' => 'Ỡ', + 'ỡ' => 'ỡ', + 'Ợ' => 'Ợ', + 'ợ' => 'ợ', + 'Ụ' => 'Ụ', + 'ụ' => 'ụ', + 'Ủ' => 'Ủ', + 'ủ' => 'ủ', + 'Ứ' => 'Ứ', + 'ứ' => 'ứ', + 'Ừ' => 'Ừ', + 'ừ' => 'ừ', + 'Ử' => 'Ử', + 'ử' => 'ử', + 'Ữ' => 'Ữ', + 'ữ' => 'ữ', + 'Ự' => 'Ự', + 'ự' => 'ự', + 'Ỳ' => 'Ỳ', + 'ỳ' => 'ỳ', + 'Ỵ' => 'Ỵ', + 'ỵ' => 'ỵ', + 'Ỷ' => 'Ỷ', + 'ỷ' => 'ỷ', + 'Ỹ' => 'Ỹ', + 'ỹ' => 'ỹ', + 'ἀ' => 'ἀ', + 'ἁ' => 'ἁ', + 'ἂ' => 'ἂ', + 'ἃ' => 'ἃ', + 'ἄ' => 'ἄ', + 'ἅ' => 'ἅ', + 'ἆ' => 'ἆ', + 'ἇ' => 'ἇ', + 'Ἀ' => 'Ἀ', + 'Ἁ' => 'Ἁ', + 'Ἂ' => 'Ἂ', + 'Ἃ' => 'Ἃ', + 'Ἄ' => 'Ἄ', + 'Ἅ' => 'Ἅ', + 'Ἆ' => 'Ἆ', + 'Ἇ' => 'Ἇ', + 'ἐ' => 'ἐ', + 'ἑ' => 'ἑ', + 'ἒ' => 'ἒ', + 'ἓ' => 'ἓ', + 'ἔ' => 'ἔ', + 'ἕ' => 'ἕ', + 'Ἐ' => 'Ἐ', + 'Ἑ' => 'Ἑ', + 'Ἒ' => 'Ἒ', + 'Ἓ' => 'Ἓ', + 'Ἔ' => 'Ἔ', + 'Ἕ' => 'Ἕ', + 'ἠ' => 'ἠ', + 'ἡ' => 'ἡ', + 'ἢ' => 'ἢ', + 'ἣ' => 'ἣ', + 'ἤ' => 'ἤ', + 'ἥ' => 'ἥ', + 'ἦ' => 'ἦ', + 'ἧ' => 'ἧ', + 'Ἠ' => 'Ἠ', + 'Ἡ' => 'Ἡ', + 'Ἢ' => 'Ἢ', + 'Ἣ' => 'Ἣ', + 'Ἤ' => 'Ἤ', + 'Ἥ' => 'Ἥ', + 'Ἦ' => 'Ἦ', + 'Ἧ' => 'Ἧ', + 'ἰ' => 'ἰ', + 'ἱ' => 'ἱ', + 'ἲ' => 'ἲ', + 'ἳ' => 'ἳ', + 'ἴ' => 'ἴ', + 'ἵ' => 'ἵ', + 'ἶ' => 'ἶ', + 'ἷ' => 'ἷ', + 'Ἰ' => 'Ἰ', + 'Ἱ' => 'Ἱ', + 'Ἲ' => 'Ἲ', + 'Ἳ' => 'Ἳ', + 'Ἴ' => 'Ἴ', + 'Ἵ' => 'Ἵ', + 'Ἶ' => 'Ἶ', + 'Ἷ' => 'Ἷ', + 'ὀ' => 'ὀ', + 'ὁ' => 'ὁ', + 'ὂ' => 'ὂ', + 'ὃ' => 'ὃ', + 'ὄ' => 'ὄ', + 'ὅ' => 'ὅ', + 'Ὀ' => 'Ὀ', + 'Ὁ' => 'Ὁ', + 'Ὂ' => 'Ὂ', + 'Ὃ' => 'Ὃ', + 'Ὄ' => 'Ὄ', + 'Ὅ' => 'Ὅ', + 'ὐ' => 'ὐ', + 'ὑ' => 'ὑ', + 'ὒ' => 'ὒ', + 'ὓ' => 'ὓ', + 'ὔ' => 'ὔ', + 'ὕ' => 'ὕ', + 'ὖ' => 'ὖ', + 'ὗ' => 'ὗ', + 'Ὑ' => 'Ὑ', + 'Ὓ' => 'Ὓ', + 'Ὕ' => 'Ὕ', + 'Ὗ' => 'Ὗ', + 'ὠ' => 'ὠ', + 'ὡ' => 'ὡ', + 'ὢ' => 'ὢ', + 'ὣ' => 'ὣ', + 'ὤ' => 'ὤ', + 'ὥ' => 'ὥ', + 'ὦ' => 'ὦ', + 'ὧ' => 'ὧ', + 'Ὠ' => 'Ὠ', + 'Ὡ' => 'Ὡ', + 'Ὢ' => 'Ὢ', + 'Ὣ' => 'Ὣ', + 'Ὤ' => 'Ὤ', + 'Ὥ' => 'Ὥ', + 'Ὦ' => 'Ὦ', + 'Ὧ' => 'Ὧ', + 'ὰ' => 'ὰ', + 'ὲ' => 'ὲ', + 'ὴ' => 'ὴ', + 'ὶ' => 'ὶ', + 'ὸ' => 'ὸ', + 'ὺ' => 'ὺ', + 'ὼ' => 'ὼ', + 'ᾀ' => 'ᾀ', + 'ᾁ' => 'ᾁ', + 'ᾂ' => 'ᾂ', + 'ᾃ' => 'ᾃ', + 'ᾄ' => 'ᾄ', + 'ᾅ' => 'ᾅ', + 'ᾆ' => 'ᾆ', + 'ᾇ' => 'ᾇ', + 'ᾈ' => 'ᾈ', + 'ᾉ' => 'ᾉ', + 'ᾊ' => 'ᾊ', + 'ᾋ' => 'ᾋ', + 'ᾌ' => 'ᾌ', + 'ᾍ' => 'ᾍ', + 'ᾎ' => 'ᾎ', + 'ᾏ' => 'ᾏ', + 'ᾐ' => 'ᾐ', + 'ᾑ' => 'ᾑ', + 'ᾒ' => 'ᾒ', + 'ᾓ' => 'ᾓ', + 'ᾔ' => 'ᾔ', + 'ᾕ' => 'ᾕ', + 'ᾖ' => 'ᾖ', + 'ᾗ' => 'ᾗ', + 'ᾘ' => 'ᾘ', + 'ᾙ' => 'ᾙ', + 'ᾚ' => 'ᾚ', + 'ᾛ' => 'ᾛ', + 'ᾜ' => 'ᾜ', + 'ᾝ' => 'ᾝ', + 'ᾞ' => 'ᾞ', + 'ᾟ' => 'ᾟ', + 'ᾠ' => 'ᾠ', + 'ᾡ' => 'ᾡ', + 'ᾢ' => 'ᾢ', + 'ᾣ' => 'ᾣ', + 'ᾤ' => 'ᾤ', + 'ᾥ' => 'ᾥ', + 'ᾦ' => 'ᾦ', + 'ᾧ' => 'ᾧ', + 'ᾨ' => 'ᾨ', + 'ᾩ' => 'ᾩ', + 'ᾪ' => 'ᾪ', + 'ᾫ' => 'ᾫ', + 'ᾬ' => 'ᾬ', + 'ᾭ' => 'ᾭ', + 'ᾮ' => 'ᾮ', + 'ᾯ' => 'ᾯ', + 'ᾰ' => 'ᾰ', + 'ᾱ' => 'ᾱ', + 'ᾲ' => 'ᾲ', + 'ᾳ' => 'ᾳ', + 'ᾴ' => 'ᾴ', + 'ᾶ' => 'ᾶ', + 'ᾷ' => 'ᾷ', + 'Ᾰ' => 'Ᾰ', + 'Ᾱ' => 'Ᾱ', + 'Ὰ' => 'Ὰ', + 'ᾼ' => 'ᾼ', + '῁' => '῁', + 'ῂ' => 'ῂ', + 'ῃ' => 'ῃ', + 'ῄ' => 'ῄ', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῇ', + 'Ὲ' => 'Ὲ', + 'Ὴ' => 'Ὴ', + 'ῌ' => 'ῌ', + '῍' => '῍', + '῎' => '῎', + '῏' => '῏', + 'ῐ' => 'ῐ', + 'ῑ' => 'ῑ', + 'ῒ' => 'ῒ', + 'ῖ' => 'ῖ', + 'ῗ' => 'ῗ', + 'Ῐ' => 'Ῐ', + 'Ῑ' => 'Ῑ', + 'Ὶ' => 'Ὶ', + '῝' => '῝', + '῞' => '῞', + '῟' => '῟', + 'ῠ' => 'ῠ', + 'ῡ' => 'ῡ', + 'ῢ' => 'ῢ', + 'ῤ' => 'ῤ', + 'ῥ' => 'ῥ', + 'ῦ' => 'ῦ', + 'ῧ' => 'ῧ', + 'Ῠ' => 'Ῠ', + 'Ῡ' => 'Ῡ', + 'Ὺ' => 'Ὺ', + 'Ῥ' => 'Ῥ', + '῭' => '῭', + 'ῲ' => 'ῲ', + 'ῳ' => 'ῳ', + 'ῴ' => 'ῴ', + 'ῶ' => 'ῶ', + 'ῷ' => 'ῷ', + 'Ὸ' => 'Ὸ', + 'Ὼ' => 'Ὼ', + 'ῼ' => 'ῼ', + '↚' => '↚', + '↛' => '↛', + '↮' => '↮', + '⇍' => '⇍', + '⇎' => '⇎', + '⇏' => '⇏', + '∄' => '∄', + '∉' => '∉', + '∌' => '∌', + '∤' => '∤', + '∦' => '∦', + '≁' => '≁', + '≄' => '≄', + '≇' => '≇', + '≉' => '≉', + '≠' => '≠', + '≢' => '≢', + '≭' => '≭', + '≮' => '≮', + '≯' => '≯', + '≰' => '≰', + '≱' => '≱', + '≴' => '≴', + '≵' => '≵', + '≸' => '≸', + '≹' => '≹', + '⊀' => '⊀', + '⊁' => '⊁', + '⊄' => '⊄', + '⊅' => '⊅', + '⊈' => '⊈', + '⊉' => '⊉', + '⊬' => '⊬', + '⊭' => '⊭', + '⊮' => '⊮', + '⊯' => '⊯', + '⋠' => '⋠', + '⋡' => '⋡', + '⋢' => '⋢', + '⋣' => '⋣', + '⋪' => '⋪', + '⋫' => '⋫', + '⋬' => '⋬', + '⋭' => '⋭', + 'が' => 'が', + 'ぎ' => 'ぎ', + 'ぐ' => 'ぐ', + 'げ' => 'げ', + 'ご' => 'ご', + 'ざ' => 'ざ', + 'じ' => 'じ', + 'ず' => 'ず', + 'ぜ' => 'ぜ', + 'ぞ' => 'ぞ', + 'だ' => 'だ', + 'ぢ' => 'ぢ', + 'づ' => 'づ', + 'で' => 'で', + 'ど' => 'ど', + 'ば' => 'ば', + 'ぱ' => 'ぱ', + 'び' => 'び', + 'ぴ' => 'ぴ', + 'ぶ' => 'ぶ', + 'ぷ' => 'ぷ', + 'べ' => 'べ', + 'ぺ' => 'ぺ', + 'ぼ' => 'ぼ', + 'ぽ' => 'ぽ', + 'ゔ' => 'ゔ', + 'ゞ' => 'ゞ', + 'ガ' => 'ガ', + 'ギ' => 'ギ', + 'グ' => 'グ', + 'ゲ' => 'ゲ', + 'ゴ' => 'ゴ', + 'ザ' => 'ザ', + 'ジ' => 'ジ', + 'ズ' => 'ズ', + 'ゼ' => 'ゼ', + 'ゾ' => 'ゾ', + 'ダ' => 'ダ', + 'ヂ' => 'ヂ', + 'ヅ' => 'ヅ', + 'デ' => 'デ', + 'ド' => 'ド', + 'バ' => 'バ', + 'パ' => 'パ', + 'ビ' => 'ビ', + 'ピ' => 'ピ', + 'ブ' => 'ブ', + 'プ' => 'プ', + 'ベ' => 'ベ', + 'ペ' => 'ペ', + 'ボ' => 'ボ', + 'ポ' => 'ポ', + 'ヴ' => 'ヴ', + 'ヷ' => 'ヷ', + 'ヸ' => 'ヸ', + 'ヹ' => 'ヹ', + 'ヺ' => 'ヺ', + 'ヾ' => 'ヾ', + '𑂚' => '𑂚', + '𑂜' => '𑂜', + '𑂫' => '𑂫', + '𑄮' => '𑄮', + '𑄯' => '𑄯', + '𑍋' => '𑍋', + '𑍌' => '𑍌', + '𑒻' => '𑒻', + '𑒼' => '𑒼', + '𑒾' => '𑒾', + '𑖺' => '𑖺', + '𑖻' => '𑖻', + '𑤸' => '𑤸', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php new file mode 100644 index 00000000..5a3e8e09 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php @@ -0,0 +1,2065 @@ + 'À', + 'Á' => 'Á', + 'Â' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Å' => 'Å', + 'Ç' => 'Ç', + 'È' => 'È', + 'É' => 'É', + 'Ê' => 'Ê', + 'Ë' => 'Ë', + 'Ì' => 'Ì', + 'Í' => 'Í', + 'Î' => 'Î', + 'Ï' => 'Ï', + 'Ñ' => 'Ñ', + 'Ò' => 'Ò', + 'Ó' => 'Ó', + 'Ô' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + 'Ù' => 'Ù', + 'Ú' => 'Ú', + 'Û' => 'Û', + 'Ü' => 'Ü', + 'Ý' => 'Ý', + 'à' => 'à', + 'á' => 'á', + 'â' => 'â', + 'ã' => 'ã', + 'ä' => 'ä', + 'å' => 'å', + 'ç' => 'ç', + 'è' => 'è', + 'é' => 'é', + 'ê' => 'ê', + 'ë' => 'ë', + 'ì' => 'ì', + 'í' => 'í', + 'î' => 'î', + 'ï' => 'ï', + 'ñ' => 'ñ', + 'ò' => 'ò', + 'ó' => 'ó', + 'ô' => 'ô', + 'õ' => 'õ', + 'ö' => 'ö', + 'ù' => 'ù', + 'ú' => 'ú', + 'û' => 'û', + 'ü' => 'ü', + 'ý' => 'ý', + 'ÿ' => 'ÿ', + 'Ā' => 'Ā', + 'ā' => 'ā', + 'Ă' => 'Ă', + 'ă' => 'ă', + 'Ą' => 'Ą', + 'ą' => 'ą', + 'Ć' => 'Ć', + 'ć' => 'ć', + 'Ĉ' => 'Ĉ', + 'ĉ' => 'ĉ', + 'Ċ' => 'Ċ', + 'ċ' => 'ċ', + 'Č' => 'Č', + 'č' => 'č', + 'Ď' => 'Ď', + 'ď' => 'ď', + 'Ē' => 'Ē', + 'ē' => 'ē', + 'Ĕ' => 'Ĕ', + 'ĕ' => 'ĕ', + 'Ė' => 'Ė', + 'ė' => 'ė', + 'Ę' => 'Ę', + 'ę' => 'ę', + 'Ě' => 'Ě', + 'ě' => 'ě', + 'Ĝ' => 'Ĝ', + 'ĝ' => 'ĝ', + 'Ğ' => 'Ğ', + 'ğ' => 'ğ', + 'Ġ' => 'Ġ', + 'ġ' => 'ġ', + 'Ģ' => 'Ģ', + 'ģ' => 'ģ', + 'Ĥ' => 'Ĥ', + 'ĥ' => 'ĥ', + 'Ĩ' => 'Ĩ', + 'ĩ' => 'ĩ', + 'Ī' => 'Ī', + 'ī' => 'ī', + 'Ĭ' => 'Ĭ', + 'ĭ' => 'ĭ', + 'Į' => 'Į', + 'į' => 'į', + 'İ' => 'İ', + 'Ĵ' => 'Ĵ', + 'ĵ' => 'ĵ', + 'Ķ' => 'Ķ', + 'ķ' => 'ķ', + 'Ĺ' => 'Ĺ', + 'ĺ' => 'ĺ', + 'Ļ' => 'Ļ', + 'ļ' => 'ļ', + 'Ľ' => 'Ľ', + 'ľ' => 'ľ', + 'Ń' => 'Ń', + 'ń' => 'ń', + 'Ņ' => 'Ņ', + 'ņ' => 'ņ', + 'Ň' => 'Ň', + 'ň' => 'ň', + 'Ō' => 'Ō', + 'ō' => 'ō', + 'Ŏ' => 'Ŏ', + 'ŏ' => 'ŏ', + 'Ő' => 'Ő', + 'ő' => 'ő', + 'Ŕ' => 'Ŕ', + 'ŕ' => 'ŕ', + 'Ŗ' => 'Ŗ', + 'ŗ' => 'ŗ', + 'Ř' => 'Ř', + 'ř' => 'ř', + 'Ś' => 'Ś', + 'ś' => 'ś', + 'Ŝ' => 'Ŝ', + 'ŝ' => 'ŝ', + 'Ş' => 'Ş', + 'ş' => 'ş', + 'Š' => 'Š', + 'š' => 'š', + 'Ţ' => 'Ţ', + 'ţ' => 'ţ', + 'Ť' => 'Ť', + 'ť' => 'ť', + 'Ũ' => 'Ũ', + 'ũ' => 'ũ', + 'Ū' => 'Ū', + 'ū' => 'ū', + 'Ŭ' => 'Ŭ', + 'ŭ' => 'ŭ', + 'Ů' => 'Ů', + 'ů' => 'ů', + 'Ű' => 'Ű', + 'ű' => 'ű', + 'Ų' => 'Ų', + 'ų' => 'ų', + 'Ŵ' => 'Ŵ', + 'ŵ' => 'ŵ', + 'Ŷ' => 'Ŷ', + 'ŷ' => 'ŷ', + 'Ÿ' => 'Ÿ', + 'Ź' => 'Ź', + 'ź' => 'ź', + 'Ż' => 'Ż', + 'ż' => 'ż', + 'Ž' => 'Ž', + 'ž' => 'ž', + 'Ơ' => 'Ơ', + 'ơ' => 'ơ', + 'Ư' => 'Ư', + 'ư' => 'ư', + 'Ǎ' => 'Ǎ', + 'ǎ' => 'ǎ', + 'Ǐ' => 'Ǐ', + 'ǐ' => 'ǐ', + 'Ǒ' => 'Ǒ', + 'ǒ' => 'ǒ', + 'Ǔ' => 'Ǔ', + 'ǔ' => 'ǔ', + 'Ǖ' => 'Ǖ', + 'ǖ' => 'ǖ', + 'Ǘ' => 'Ǘ', + 'ǘ' => 'ǘ', + 'Ǚ' => 'Ǚ', + 'ǚ' => 'ǚ', + 'Ǜ' => 'Ǜ', + 'ǜ' => 'ǜ', + 'Ǟ' => 'Ǟ', + 'ǟ' => 'ǟ', + 'Ǡ' => 'Ǡ', + 'ǡ' => 'ǡ', + 'Ǣ' => 'Ǣ', + 'ǣ' => 'ǣ', + 'Ǧ' => 'Ǧ', + 'ǧ' => 'ǧ', + 'Ǩ' => 'Ǩ', + 'ǩ' => 'ǩ', + 'Ǫ' => 'Ǫ', + 'ǫ' => 'ǫ', + 'Ǭ' => 'Ǭ', + 'ǭ' => 'ǭ', + 'Ǯ' => 'Ǯ', + 'ǯ' => 'ǯ', + 'ǰ' => 'ǰ', + 'Ǵ' => 'Ǵ', + 'ǵ' => 'ǵ', + 'Ǹ' => 'Ǹ', + 'ǹ' => 'ǹ', + 'Ǻ' => 'Ǻ', + 'ǻ' => 'ǻ', + 'Ǽ' => 'Ǽ', + 'ǽ' => 'ǽ', + 'Ǿ' => 'Ǿ', + 'ǿ' => 'ǿ', + 'Ȁ' => 'Ȁ', + 'ȁ' => 'ȁ', + 'Ȃ' => 'Ȃ', + 'ȃ' => 'ȃ', + 'Ȅ' => 'Ȅ', + 'ȅ' => 'ȅ', + 'Ȇ' => 'Ȇ', + 'ȇ' => 'ȇ', + 'Ȉ' => 'Ȉ', + 'ȉ' => 'ȉ', + 'Ȋ' => 'Ȋ', + 'ȋ' => 'ȋ', + 'Ȍ' => 'Ȍ', + 'ȍ' => 'ȍ', + 'Ȏ' => 'Ȏ', + 'ȏ' => 'ȏ', + 'Ȑ' => 'Ȑ', + 'ȑ' => 'ȑ', + 'Ȓ' => 'Ȓ', + 'ȓ' => 'ȓ', + 'Ȕ' => 'Ȕ', + 'ȕ' => 'ȕ', + 'Ȗ' => 'Ȗ', + 'ȗ' => 'ȗ', + 'Ș' => 'Ș', + 'ș' => 'ș', + 'Ț' => 'Ț', + 'ț' => 'ț', + 'Ȟ' => 'Ȟ', + 'ȟ' => 'ȟ', + 'Ȧ' => 'Ȧ', + 'ȧ' => 'ȧ', + 'Ȩ' => 'Ȩ', + 'ȩ' => 'ȩ', + 'Ȫ' => 'Ȫ', + 'ȫ' => 'ȫ', + 'Ȭ' => 'Ȭ', + 'ȭ' => 'ȭ', + 'Ȯ' => 'Ȯ', + 'ȯ' => 'ȯ', + 'Ȱ' => 'Ȱ', + 'ȱ' => 'ȱ', + 'Ȳ' => 'Ȳ', + 'ȳ' => 'ȳ', + '̀' => '̀', + '́' => '́', + '̓' => '̓', + '̈́' => '̈́', + 'ʹ' => 'ʹ', + ';' => ';', + '΅' => '΅', + 'Ά' => 'Ά', + '·' => '·', + 'Έ' => 'Έ', + 'Ή' => 'Ή', + 'Ί' => 'Ί', + 'Ό' => 'Ό', + 'Ύ' => 'Ύ', + 'Ώ' => 'Ώ', + 'ΐ' => 'ΐ', + 'Ϊ' => 'Ϊ', + 'Ϋ' => 'Ϋ', + 'ά' => 'ά', + 'έ' => 'έ', + 'ή' => 'ή', + 'ί' => 'ί', + 'ΰ' => 'ΰ', + 'ϊ' => 'ϊ', + 'ϋ' => 'ϋ', + 'ό' => 'ό', + 'ύ' => 'ύ', + 'ώ' => 'ώ', + 'ϓ' => 'ϓ', + 'ϔ' => 'ϔ', + 'Ѐ' => 'Ѐ', + 'Ё' => 'Ё', + 'Ѓ' => 'Ѓ', + 'Ї' => 'Ї', + 'Ќ' => 'Ќ', + 'Ѝ' => 'Ѝ', + 'Ў' => 'Ў', + 'Й' => 'Й', + 'й' => 'й', + 'ѐ' => 'ѐ', + 'ё' => 'ё', + 'ѓ' => 'ѓ', + 'ї' => 'ї', + 'ќ' => 'ќ', + 'ѝ' => 'ѝ', + 'ў' => 'ў', + 'Ѷ' => 'Ѷ', + 'ѷ' => 'ѷ', + 'Ӂ' => 'Ӂ', + 'ӂ' => 'ӂ', + 'Ӑ' => 'Ӑ', + 'ӑ' => 'ӑ', + 'Ӓ' => 'Ӓ', + 'ӓ' => 'ӓ', + 'Ӗ' => 'Ӗ', + 'ӗ' => 'ӗ', + 'Ӛ' => 'Ӛ', + 'ӛ' => 'ӛ', + 'Ӝ' => 'Ӝ', + 'ӝ' => 'ӝ', + 'Ӟ' => 'Ӟ', + 'ӟ' => 'ӟ', + 'Ӣ' => 'Ӣ', + 'ӣ' => 'ӣ', + 'Ӥ' => 'Ӥ', + 'ӥ' => 'ӥ', + 'Ӧ' => 'Ӧ', + 'ӧ' => 'ӧ', + 'Ӫ' => 'Ӫ', + 'ӫ' => 'ӫ', + 'Ӭ' => 'Ӭ', + 'ӭ' => 'ӭ', + 'Ӯ' => 'Ӯ', + 'ӯ' => 'ӯ', + 'Ӱ' => 'Ӱ', + 'ӱ' => 'ӱ', + 'Ӳ' => 'Ӳ', + 'ӳ' => 'ӳ', + 'Ӵ' => 'Ӵ', + 'ӵ' => 'ӵ', + 'Ӹ' => 'Ӹ', + 'ӹ' => 'ӹ', + 'آ' => 'آ', + 'أ' => 'أ', + 'ؤ' => 'ؤ', + 'إ' => 'إ', + 'ئ' => 'ئ', + 'ۀ' => 'ۀ', + 'ۂ' => 'ۂ', + 'ۓ' => 'ۓ', + 'ऩ' => 'ऩ', + 'ऱ' => 'ऱ', + 'ऴ' => 'ऴ', + 'क़' => 'क़', + 'ख़' => 'ख़', + 'ग़' => 'ग़', + 'ज़' => 'ज़', + 'ड़' => 'ड़', + 'ढ़' => 'ढ़', + 'फ़' => 'फ़', + 'य़' => 'य़', + 'ো' => 'ো', + 'ৌ' => 'ৌ', + 'ড়' => 'ড়', + 'ঢ়' => 'ঢ়', + 'য়' => 'য়', + 'ਲ਼' => 'ਲ਼', + 'ਸ਼' => 'ਸ਼', + 'ਖ਼' => 'ਖ਼', + 'ਗ਼' => 'ਗ਼', + 'ਜ਼' => 'ਜ਼', + 'ਫ਼' => 'ਫ਼', + 'ୈ' => 'ୈ', + 'ୋ' => 'ୋ', + 'ୌ' => 'ୌ', + 'ଡ଼' => 'ଡ଼', + 'ଢ଼' => 'ଢ଼', + 'ஔ' => 'ஔ', + 'ொ' => 'ொ', + 'ோ' => 'ோ', + 'ௌ' => 'ௌ', + 'ై' => 'ై', + 'ೀ' => 'ೀ', + 'ೇ' => 'ೇ', + 'ೈ' => 'ೈ', + 'ೊ' => 'ೊ', + 'ೋ' => 'ೋ', + 'ൊ' => 'ൊ', + 'ോ' => 'ോ', + 'ൌ' => 'ൌ', + 'ේ' => 'ේ', + 'ො' => 'ො', + 'ෝ' => 'ෝ', + 'ෞ' => 'ෞ', + 'གྷ' => 'གྷ', + 'ཌྷ' => 'ཌྷ', + 'དྷ' => 'དྷ', + 'བྷ' => 'བྷ', + 'ཛྷ' => 'ཛྷ', + 'ཀྵ' => 'ཀྵ', + 'ཱི' => 'ཱི', + 'ཱུ' => 'ཱུ', + 'ྲྀ' => 'ྲྀ', + 'ླྀ' => 'ླྀ', + 'ཱྀ' => 'ཱྀ', + 'ྒྷ' => 'ྒྷ', + 'ྜྷ' => 'ྜྷ', + 'ྡྷ' => 'ྡྷ', + 'ྦྷ' => 'ྦྷ', + 'ྫྷ' => 'ྫྷ', + 'ྐྵ' => 'ྐྵ', + 'ဦ' => 'ဦ', + 'ᬆ' => 'ᬆ', + 'ᬈ' => 'ᬈ', + 'ᬊ' => 'ᬊ', + 'ᬌ' => 'ᬌ', + 'ᬎ' => 'ᬎ', + 'ᬒ' => 'ᬒ', + 'ᬻ' => 'ᬻ', + 'ᬽ' => 'ᬽ', + 'ᭀ' => 'ᭀ', + 'ᭁ' => 'ᭁ', + 'ᭃ' => 'ᭃ', + 'Ḁ' => 'Ḁ', + 'ḁ' => 'ḁ', + 'Ḃ' => 'Ḃ', + 'ḃ' => 'ḃ', + 'Ḅ' => 'Ḅ', + 'ḅ' => 'ḅ', + 'Ḇ' => 'Ḇ', + 'ḇ' => 'ḇ', + 'Ḉ' => 'Ḉ', + 'ḉ' => 'ḉ', + 'Ḋ' => 'Ḋ', + 'ḋ' => 'ḋ', + 'Ḍ' => 'Ḍ', + 'ḍ' => 'ḍ', + 'Ḏ' => 'Ḏ', + 'ḏ' => 'ḏ', + 'Ḑ' => 'Ḑ', + 'ḑ' => 'ḑ', + 'Ḓ' => 'Ḓ', + 'ḓ' => 'ḓ', + 'Ḕ' => 'Ḕ', + 'ḕ' => 'ḕ', + 'Ḗ' => 'Ḗ', + 'ḗ' => 'ḗ', + 'Ḙ' => 'Ḙ', + 'ḙ' => 'ḙ', + 'Ḛ' => 'Ḛ', + 'ḛ' => 'ḛ', + 'Ḝ' => 'Ḝ', + 'ḝ' => 'ḝ', + 'Ḟ' => 'Ḟ', + 'ḟ' => 'ḟ', + 'Ḡ' => 'Ḡ', + 'ḡ' => 'ḡ', + 'Ḣ' => 'Ḣ', + 'ḣ' => 'ḣ', + 'Ḥ' => 'Ḥ', + 'ḥ' => 'ḥ', + 'Ḧ' => 'Ḧ', + 'ḧ' => 'ḧ', + 'Ḩ' => 'Ḩ', + 'ḩ' => 'ḩ', + 'Ḫ' => 'Ḫ', + 'ḫ' => 'ḫ', + 'Ḭ' => 'Ḭ', + 'ḭ' => 'ḭ', + 'Ḯ' => 'Ḯ', + 'ḯ' => 'ḯ', + 'Ḱ' => 'Ḱ', + 'ḱ' => 'ḱ', + 'Ḳ' => 'Ḳ', + 'ḳ' => 'ḳ', + 'Ḵ' => 'Ḵ', + 'ḵ' => 'ḵ', + 'Ḷ' => 'Ḷ', + 'ḷ' => 'ḷ', + 'Ḹ' => 'Ḹ', + 'ḹ' => 'ḹ', + 'Ḻ' => 'Ḻ', + 'ḻ' => 'ḻ', + 'Ḽ' => 'Ḽ', + 'ḽ' => 'ḽ', + 'Ḿ' => 'Ḿ', + 'ḿ' => 'ḿ', + 'Ṁ' => 'Ṁ', + 'ṁ' => 'ṁ', + 'Ṃ' => 'Ṃ', + 'ṃ' => 'ṃ', + 'Ṅ' => 'Ṅ', + 'ṅ' => 'ṅ', + 'Ṇ' => 'Ṇ', + 'ṇ' => 'ṇ', + 'Ṉ' => 'Ṉ', + 'ṉ' => 'ṉ', + 'Ṋ' => 'Ṋ', + 'ṋ' => 'ṋ', + 'Ṍ' => 'Ṍ', + 'ṍ' => 'ṍ', + 'Ṏ' => 'Ṏ', + 'ṏ' => 'ṏ', + 'Ṑ' => 'Ṑ', + 'ṑ' => 'ṑ', + 'Ṓ' => 'Ṓ', + 'ṓ' => 'ṓ', + 'Ṕ' => 'Ṕ', + 'ṕ' => 'ṕ', + 'Ṗ' => 'Ṗ', + 'ṗ' => 'ṗ', + 'Ṙ' => 'Ṙ', + 'ṙ' => 'ṙ', + 'Ṛ' => 'Ṛ', + 'ṛ' => 'ṛ', + 'Ṝ' => 'Ṝ', + 'ṝ' => 'ṝ', + 'Ṟ' => 'Ṟ', + 'ṟ' => 'ṟ', + 'Ṡ' => 'Ṡ', + 'ṡ' => 'ṡ', + 'Ṣ' => 'Ṣ', + 'ṣ' => 'ṣ', + 'Ṥ' => 'Ṥ', + 'ṥ' => 'ṥ', + 'Ṧ' => 'Ṧ', + 'ṧ' => 'ṧ', + 'Ṩ' => 'Ṩ', + 'ṩ' => 'ṩ', + 'Ṫ' => 'Ṫ', + 'ṫ' => 'ṫ', + 'Ṭ' => 'Ṭ', + 'ṭ' => 'ṭ', + 'Ṯ' => 'Ṯ', + 'ṯ' => 'ṯ', + 'Ṱ' => 'Ṱ', + 'ṱ' => 'ṱ', + 'Ṳ' => 'Ṳ', + 'ṳ' => 'ṳ', + 'Ṵ' => 'Ṵ', + 'ṵ' => 'ṵ', + 'Ṷ' => 'Ṷ', + 'ṷ' => 'ṷ', + 'Ṹ' => 'Ṹ', + 'ṹ' => 'ṹ', + 'Ṻ' => 'Ṻ', + 'ṻ' => 'ṻ', + 'Ṽ' => 'Ṽ', + 'ṽ' => 'ṽ', + 'Ṿ' => 'Ṿ', + 'ṿ' => 'ṿ', + 'Ẁ' => 'Ẁ', + 'ẁ' => 'ẁ', + 'Ẃ' => 'Ẃ', + 'ẃ' => 'ẃ', + 'Ẅ' => 'Ẅ', + 'ẅ' => 'ẅ', + 'Ẇ' => 'Ẇ', + 'ẇ' => 'ẇ', + 'Ẉ' => 'Ẉ', + 'ẉ' => 'ẉ', + 'Ẋ' => 'Ẋ', + 'ẋ' => 'ẋ', + 'Ẍ' => 'Ẍ', + 'ẍ' => 'ẍ', + 'Ẏ' => 'Ẏ', + 'ẏ' => 'ẏ', + 'Ẑ' => 'Ẑ', + 'ẑ' => 'ẑ', + 'Ẓ' => 'Ẓ', + 'ẓ' => 'ẓ', + 'Ẕ' => 'Ẕ', + 'ẕ' => 'ẕ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'ẘ', + 'ẙ' => 'ẙ', + 'ẛ' => 'ẛ', + 'Ạ' => 'Ạ', + 'ạ' => 'ạ', + 'Ả' => 'Ả', + 'ả' => 'ả', + 'Ấ' => 'Ấ', + 'ấ' => 'ấ', + 'Ầ' => 'Ầ', + 'ầ' => 'ầ', + 'Ẩ' => 'Ẩ', + 'ẩ' => 'ẩ', + 'Ẫ' => 'Ẫ', + 'ẫ' => 'ẫ', + 'Ậ' => 'Ậ', + 'ậ' => 'ậ', + 'Ắ' => 'Ắ', + 'ắ' => 'ắ', + 'Ằ' => 'Ằ', + 'ằ' => 'ằ', + 'Ẳ' => 'Ẳ', + 'ẳ' => 'ẳ', + 'Ẵ' => 'Ẵ', + 'ẵ' => 'ẵ', + 'Ặ' => 'Ặ', + 'ặ' => 'ặ', + 'Ẹ' => 'Ẹ', + 'ẹ' => 'ẹ', + 'Ẻ' => 'Ẻ', + 'ẻ' => 'ẻ', + 'Ẽ' => 'Ẽ', + 'ẽ' => 'ẽ', + 'Ế' => 'Ế', + 'ế' => 'ế', + 'Ề' => 'Ề', + 'ề' => 'ề', + 'Ể' => 'Ể', + 'ể' => 'ể', + 'Ễ' => 'Ễ', + 'ễ' => 'ễ', + 'Ệ' => 'Ệ', + 'ệ' => 'ệ', + 'Ỉ' => 'Ỉ', + 'ỉ' => 'ỉ', + 'Ị' => 'Ị', + 'ị' => 'ị', + 'Ọ' => 'Ọ', + 'ọ' => 'ọ', + 'Ỏ' => 'Ỏ', + 'ỏ' => 'ỏ', + 'Ố' => 'Ố', + 'ố' => 'ố', + 'Ồ' => 'Ồ', + 'ồ' => 'ồ', + 'Ổ' => 'Ổ', + 'ổ' => 'ổ', + 'Ỗ' => 'Ỗ', + 'ỗ' => 'ỗ', + 'Ộ' => 'Ộ', + 'ộ' => 'ộ', + 'Ớ' => 'Ớ', + 'ớ' => 'ớ', + 'Ờ' => 'Ờ', + 'ờ' => 'ờ', + 'Ở' => 'Ở', + 'ở' => 'ở', + 'Ỡ' => 'Ỡ', + 'ỡ' => 'ỡ', + 'Ợ' => 'Ợ', + 'ợ' => 'ợ', + 'Ụ' => 'Ụ', + 'ụ' => 'ụ', + 'Ủ' => 'Ủ', + 'ủ' => 'ủ', + 'Ứ' => 'Ứ', + 'ứ' => 'ứ', + 'Ừ' => 'Ừ', + 'ừ' => 'ừ', + 'Ử' => 'Ử', + 'ử' => 'ử', + 'Ữ' => 'Ữ', + 'ữ' => 'ữ', + 'Ự' => 'Ự', + 'ự' => 'ự', + 'Ỳ' => 'Ỳ', + 'ỳ' => 'ỳ', + 'Ỵ' => 'Ỵ', + 'ỵ' => 'ỵ', + 'Ỷ' => 'Ỷ', + 'ỷ' => 'ỷ', + 'Ỹ' => 'Ỹ', + 'ỹ' => 'ỹ', + 'ἀ' => 'ἀ', + 'ἁ' => 'ἁ', + 'ἂ' => 'ἂ', + 'ἃ' => 'ἃ', + 'ἄ' => 'ἄ', + 'ἅ' => 'ἅ', + 'ἆ' => 'ἆ', + 'ἇ' => 'ἇ', + 'Ἀ' => 'Ἀ', + 'Ἁ' => 'Ἁ', + 'Ἂ' => 'Ἂ', + 'Ἃ' => 'Ἃ', + 'Ἄ' => 'Ἄ', + 'Ἅ' => 'Ἅ', + 'Ἆ' => 'Ἆ', + 'Ἇ' => 'Ἇ', + 'ἐ' => 'ἐ', + 'ἑ' => 'ἑ', + 'ἒ' => 'ἒ', + 'ἓ' => 'ἓ', + 'ἔ' => 'ἔ', + 'ἕ' => 'ἕ', + 'Ἐ' => 'Ἐ', + 'Ἑ' => 'Ἑ', + 'Ἒ' => 'Ἒ', + 'Ἓ' => 'Ἓ', + 'Ἔ' => 'Ἔ', + 'Ἕ' => 'Ἕ', + 'ἠ' => 'ἠ', + 'ἡ' => 'ἡ', + 'ἢ' => 'ἢ', + 'ἣ' => 'ἣ', + 'ἤ' => 'ἤ', + 'ἥ' => 'ἥ', + 'ἦ' => 'ἦ', + 'ἧ' => 'ἧ', + 'Ἠ' => 'Ἠ', + 'Ἡ' => 'Ἡ', + 'Ἢ' => 'Ἢ', + 'Ἣ' => 'Ἣ', + 'Ἤ' => 'Ἤ', + 'Ἥ' => 'Ἥ', + 'Ἦ' => 'Ἦ', + 'Ἧ' => 'Ἧ', + 'ἰ' => 'ἰ', + 'ἱ' => 'ἱ', + 'ἲ' => 'ἲ', + 'ἳ' => 'ἳ', + 'ἴ' => 'ἴ', + 'ἵ' => 'ἵ', + 'ἶ' => 'ἶ', + 'ἷ' => 'ἷ', + 'Ἰ' => 'Ἰ', + 'Ἱ' => 'Ἱ', + 'Ἲ' => 'Ἲ', + 'Ἳ' => 'Ἳ', + 'Ἴ' => 'Ἴ', + 'Ἵ' => 'Ἵ', + 'Ἶ' => 'Ἶ', + 'Ἷ' => 'Ἷ', + 'ὀ' => 'ὀ', + 'ὁ' => 'ὁ', + 'ὂ' => 'ὂ', + 'ὃ' => 'ὃ', + 'ὄ' => 'ὄ', + 'ὅ' => 'ὅ', + 'Ὀ' => 'Ὀ', + 'Ὁ' => 'Ὁ', + 'Ὂ' => 'Ὂ', + 'Ὃ' => 'Ὃ', + 'Ὄ' => 'Ὄ', + 'Ὅ' => 'Ὅ', + 'ὐ' => 'ὐ', + 'ὑ' => 'ὑ', + 'ὒ' => 'ὒ', + 'ὓ' => 'ὓ', + 'ὔ' => 'ὔ', + 'ὕ' => 'ὕ', + 'ὖ' => 'ὖ', + 'ὗ' => 'ὗ', + 'Ὑ' => 'Ὑ', + 'Ὓ' => 'Ὓ', + 'Ὕ' => 'Ὕ', + 'Ὗ' => 'Ὗ', + 'ὠ' => 'ὠ', + 'ὡ' => 'ὡ', + 'ὢ' => 'ὢ', + 'ὣ' => 'ὣ', + 'ὤ' => 'ὤ', + 'ὥ' => 'ὥ', + 'ὦ' => 'ὦ', + 'ὧ' => 'ὧ', + 'Ὠ' => 'Ὠ', + 'Ὡ' => 'Ὡ', + 'Ὢ' => 'Ὢ', + 'Ὣ' => 'Ὣ', + 'Ὤ' => 'Ὤ', + 'Ὥ' => 'Ὥ', + 'Ὦ' => 'Ὦ', + 'Ὧ' => 'Ὧ', + 'ὰ' => 'ὰ', + 'ά' => 'ά', + 'ὲ' => 'ὲ', + 'έ' => 'έ', + 'ὴ' => 'ὴ', + 'ή' => 'ή', + 'ὶ' => 'ὶ', + 'ί' => 'ί', + 'ὸ' => 'ὸ', + 'ό' => 'ό', + 'ὺ' => 'ὺ', + 'ύ' => 'ύ', + 'ὼ' => 'ὼ', + 'ώ' => 'ώ', + 'ᾀ' => 'ᾀ', + 'ᾁ' => 'ᾁ', + 'ᾂ' => 'ᾂ', + 'ᾃ' => 'ᾃ', + 'ᾄ' => 'ᾄ', + 'ᾅ' => 'ᾅ', + 'ᾆ' => 'ᾆ', + 'ᾇ' => 'ᾇ', + 'ᾈ' => 'ᾈ', + 'ᾉ' => 'ᾉ', + 'ᾊ' => 'ᾊ', + 'ᾋ' => 'ᾋ', + 'ᾌ' => 'ᾌ', + 'ᾍ' => 'ᾍ', + 'ᾎ' => 'ᾎ', + 'ᾏ' => 'ᾏ', + 'ᾐ' => 'ᾐ', + 'ᾑ' => 'ᾑ', + 'ᾒ' => 'ᾒ', + 'ᾓ' => 'ᾓ', + 'ᾔ' => 'ᾔ', + 'ᾕ' => 'ᾕ', + 'ᾖ' => 'ᾖ', + 'ᾗ' => 'ᾗ', + 'ᾘ' => 'ᾘ', + 'ᾙ' => 'ᾙ', + 'ᾚ' => 'ᾚ', + 'ᾛ' => 'ᾛ', + 'ᾜ' => 'ᾜ', + 'ᾝ' => 'ᾝ', + 'ᾞ' => 'ᾞ', + 'ᾟ' => 'ᾟ', + 'ᾠ' => 'ᾠ', + 'ᾡ' => 'ᾡ', + 'ᾢ' => 'ᾢ', + 'ᾣ' => 'ᾣ', + 'ᾤ' => 'ᾤ', + 'ᾥ' => 'ᾥ', + 'ᾦ' => 'ᾦ', + 'ᾧ' => 'ᾧ', + 'ᾨ' => 'ᾨ', + 'ᾩ' => 'ᾩ', + 'ᾪ' => 'ᾪ', + 'ᾫ' => 'ᾫ', + 'ᾬ' => 'ᾬ', + 'ᾭ' => 'ᾭ', + 'ᾮ' => 'ᾮ', + 'ᾯ' => 'ᾯ', + 'ᾰ' => 'ᾰ', + 'ᾱ' => 'ᾱ', + 'ᾲ' => 'ᾲ', + 'ᾳ' => 'ᾳ', + 'ᾴ' => 'ᾴ', + 'ᾶ' => 'ᾶ', + 'ᾷ' => 'ᾷ', + 'Ᾰ' => 'Ᾰ', + 'Ᾱ' => 'Ᾱ', + 'Ὰ' => 'Ὰ', + 'Ά' => 'Ά', + 'ᾼ' => 'ᾼ', + 'ι' => 'ι', + '῁' => '῁', + 'ῂ' => 'ῂ', + 'ῃ' => 'ῃ', + 'ῄ' => 'ῄ', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῇ', + 'Ὲ' => 'Ὲ', + 'Έ' => 'Έ', + 'Ὴ' => 'Ὴ', + 'Ή' => 'Ή', + 'ῌ' => 'ῌ', + '῍' => '῍', + '῎' => '῎', + '῏' => '῏', + 'ῐ' => 'ῐ', + 'ῑ' => 'ῑ', + 'ῒ' => 'ῒ', + 'ΐ' => 'ΐ', + 'ῖ' => 'ῖ', + 'ῗ' => 'ῗ', + 'Ῐ' => 'Ῐ', + 'Ῑ' => 'Ῑ', + 'Ὶ' => 'Ὶ', + 'Ί' => 'Ί', + '῝' => '῝', + '῞' => '῞', + '῟' => '῟', + 'ῠ' => 'ῠ', + 'ῡ' => 'ῡ', + 'ῢ' => 'ῢ', + 'ΰ' => 'ΰ', + 'ῤ' => 'ῤ', + 'ῥ' => 'ῥ', + 'ῦ' => 'ῦ', + 'ῧ' => 'ῧ', + 'Ῠ' => 'Ῠ', + 'Ῡ' => 'Ῡ', + 'Ὺ' => 'Ὺ', + 'Ύ' => 'Ύ', + 'Ῥ' => 'Ῥ', + '῭' => '῭', + '΅' => '΅', + '`' => '`', + 'ῲ' => 'ῲ', + 'ῳ' => 'ῳ', + 'ῴ' => 'ῴ', + 'ῶ' => 'ῶ', + 'ῷ' => 'ῷ', + 'Ὸ' => 'Ὸ', + 'Ό' => 'Ό', + 'Ὼ' => 'Ὼ', + 'Ώ' => 'Ώ', + 'ῼ' => 'ῼ', + '´' => '´', + ' ' => ' ', + ' ' => ' ', + 'Ω' => 'Ω', + 'K' => 'K', + 'Å' => 'Å', + '↚' => '↚', + '↛' => '↛', + '↮' => '↮', + '⇍' => '⇍', + '⇎' => '⇎', + '⇏' => '⇏', + '∄' => '∄', + '∉' => '∉', + '∌' => '∌', + '∤' => '∤', + '∦' => '∦', + '≁' => '≁', + '≄' => '≄', + '≇' => '≇', + '≉' => '≉', + '≠' => '≠', + '≢' => '≢', + '≭' => '≭', + '≮' => '≮', + '≯' => '≯', + '≰' => '≰', + '≱' => '≱', + '≴' => '≴', + '≵' => '≵', + '≸' => '≸', + '≹' => '≹', + '⊀' => '⊀', + '⊁' => '⊁', + '⊄' => '⊄', + '⊅' => '⊅', + '⊈' => '⊈', + '⊉' => '⊉', + '⊬' => '⊬', + '⊭' => '⊭', + '⊮' => '⊮', + '⊯' => '⊯', + '⋠' => '⋠', + '⋡' => '⋡', + '⋢' => '⋢', + '⋣' => '⋣', + '⋪' => '⋪', + '⋫' => '⋫', + '⋬' => '⋬', + '⋭' => '⋭', + '〈' => '〈', + '〉' => '〉', + '⫝̸' => '⫝̸', + 'が' => 'が', + 'ぎ' => 'ぎ', + 'ぐ' => 'ぐ', + 'げ' => 'げ', + 'ご' => 'ご', + 'ざ' => 'ざ', + 'じ' => 'じ', + 'ず' => 'ず', + 'ぜ' => 'ぜ', + 'ぞ' => 'ぞ', + 'だ' => 'だ', + 'ぢ' => 'ぢ', + 'づ' => 'づ', + 'で' => 'で', + 'ど' => 'ど', + 'ば' => 'ば', + 'ぱ' => 'ぱ', + 'び' => 'び', + 'ぴ' => 'ぴ', + 'ぶ' => 'ぶ', + 'ぷ' => 'ぷ', + 'べ' => 'べ', + 'ぺ' => 'ぺ', + 'ぼ' => 'ぼ', + 'ぽ' => 'ぽ', + 'ゔ' => 'ゔ', + 'ゞ' => 'ゞ', + 'ガ' => 'ガ', + 'ギ' => 'ギ', + 'グ' => 'グ', + 'ゲ' => 'ゲ', + 'ゴ' => 'ゴ', + 'ザ' => 'ザ', + 'ジ' => 'ジ', + 'ズ' => 'ズ', + 'ゼ' => 'ゼ', + 'ゾ' => 'ゾ', + 'ダ' => 'ダ', + 'ヂ' => 'ヂ', + 'ヅ' => 'ヅ', + 'デ' => 'デ', + 'ド' => 'ド', + 'バ' => 'バ', + 'パ' => 'パ', + 'ビ' => 'ビ', + 'ピ' => 'ピ', + 'ブ' => 'ブ', + 'プ' => 'プ', + 'ベ' => 'ベ', + 'ペ' => 'ペ', + 'ボ' => 'ボ', + 'ポ' => 'ポ', + 'ヴ' => 'ヴ', + 'ヷ' => 'ヷ', + 'ヸ' => 'ヸ', + 'ヹ' => 'ヹ', + 'ヺ' => 'ヺ', + 'ヾ' => 'ヾ', + '豈' => '豈', + '更' => '更', + '車' => '車', + '賈' => '賈', + '滑' => '滑', + '串' => '串', + '句' => '句', + '龜' => '龜', + '龜' => '龜', + '契' => '契', + '金' => '金', + '喇' => '喇', + '奈' => '奈', + '懶' => '懶', + '癩' => '癩', + '羅' => '羅', + '蘿' => '蘿', + '螺' => '螺', + '裸' => '裸', + '邏' => '邏', + '樂' => '樂', + '洛' => '洛', + '烙' => '烙', + '珞' => '珞', + '落' => '落', + '酪' => '酪', + '駱' => '駱', + '亂' => '亂', + '卵' => '卵', + '欄' => '欄', + '爛' => '爛', + '蘭' => '蘭', + '鸞' => '鸞', + '嵐' => '嵐', + '濫' => '濫', + '藍' => '藍', + '襤' => '襤', + '拉' => '拉', + '臘' => '臘', + '蠟' => '蠟', + '廊' => '廊', + '朗' => '朗', + '浪' => '浪', + '狼' => '狼', + '郎' => '郎', + '來' => '來', + '冷' => '冷', + '勞' => '勞', + '擄' => '擄', + '櫓' => '櫓', + '爐' => '爐', + '盧' => '盧', + '老' => '老', + '蘆' => '蘆', + '虜' => '虜', + '路' => '路', + '露' => '露', + '魯' => '魯', + '鷺' => '鷺', + '碌' => '碌', + '祿' => '祿', + '綠' => '綠', + '菉' => '菉', + '錄' => '錄', + '鹿' => '鹿', + '論' => '論', + '壟' => '壟', + '弄' => '弄', + '籠' => '籠', + '聾' => '聾', + '牢' => '牢', + '磊' => '磊', + '賂' => '賂', + '雷' => '雷', + '壘' => '壘', + '屢' => '屢', + '樓' => '樓', + '淚' => '淚', + '漏' => '漏', + '累' => '累', + '縷' => '縷', + '陋' => '陋', + '勒' => '勒', + '肋' => '肋', + '凜' => '凜', + '凌' => '凌', + '稜' => '稜', + '綾' => '綾', + '菱' => '菱', + '陵' => '陵', + '讀' => '讀', + '拏' => '拏', + '樂' => '樂', + '諾' => '諾', + '丹' => '丹', + '寧' => '寧', + '怒' => '怒', + '率' => '率', + '異' => '異', + '北' => '北', + '磻' => '磻', + '便' => '便', + '復' => '復', + '不' => '不', + '泌' => '泌', + '數' => '數', + '索' => '索', + '參' => '參', + '塞' => '塞', + '省' => '省', + '葉' => '葉', + '說' => '說', + '殺' => '殺', + '辰' => '辰', + '沈' => '沈', + '拾' => '拾', + '若' => '若', + '掠' => '掠', + '略' => '略', + '亮' => '亮', + '兩' => '兩', + '凉' => '凉', + '梁' => '梁', + '糧' => '糧', + '良' => '良', + '諒' => '諒', + '量' => '量', + '勵' => '勵', + '呂' => '呂', + '女' => '女', + '廬' => '廬', + '旅' => '旅', + '濾' => '濾', + '礪' => '礪', + '閭' => '閭', + '驪' => '驪', + '麗' => '麗', + '黎' => '黎', + '力' => '力', + '曆' => '曆', + '歷' => '歷', + '轢' => '轢', + '年' => '年', + '憐' => '憐', + '戀' => '戀', + '撚' => '撚', + '漣' => '漣', + '煉' => '煉', + '璉' => '璉', + '秊' => '秊', + '練' => '練', + '聯' => '聯', + '輦' => '輦', + '蓮' => '蓮', + '連' => '連', + '鍊' => '鍊', + '列' => '列', + '劣' => '劣', + '咽' => '咽', + '烈' => '烈', + '裂' => '裂', + '說' => '說', + '廉' => '廉', + '念' => '念', + '捻' => '捻', + '殮' => '殮', + '簾' => '簾', + '獵' => '獵', + '令' => '令', + '囹' => '囹', + '寧' => '寧', + '嶺' => '嶺', + '怜' => '怜', + '玲' => '玲', + '瑩' => '瑩', + '羚' => '羚', + '聆' => '聆', + '鈴' => '鈴', + '零' => '零', + '靈' => '靈', + '領' => '領', + '例' => '例', + '禮' => '禮', + '醴' => '醴', + '隸' => '隸', + '惡' => '惡', + '了' => '了', + '僚' => '僚', + '寮' => '寮', + '尿' => '尿', + '料' => '料', + '樂' => '樂', + '燎' => '燎', + '療' => '療', + '蓼' => '蓼', + '遼' => '遼', + '龍' => '龍', + '暈' => '暈', + '阮' => '阮', + '劉' => '劉', + '杻' => '杻', + '柳' => '柳', + '流' => '流', + '溜' => '溜', + '琉' => '琉', + '留' => '留', + '硫' => '硫', + '紐' => '紐', + '類' => '類', + '六' => '六', + '戮' => '戮', + '陸' => '陸', + '倫' => '倫', + '崙' => '崙', + '淪' => '淪', + '輪' => '輪', + '律' => '律', + '慄' => '慄', + '栗' => '栗', + '率' => '率', + '隆' => '隆', + '利' => '利', + '吏' => '吏', + '履' => '履', + '易' => '易', + '李' => '李', + '梨' => '梨', + '泥' => '泥', + '理' => '理', + '痢' => '痢', + '罹' => '罹', + '裏' => '裏', + '裡' => '裡', + '里' => '里', + '離' => '離', + '匿' => '匿', + '溺' => '溺', + '吝' => '吝', + '燐' => '燐', + '璘' => '璘', + '藺' => '藺', + '隣' => '隣', + '鱗' => '鱗', + '麟' => '麟', + '林' => '林', + '淋' => '淋', + '臨' => '臨', + '立' => '立', + '笠' => '笠', + '粒' => '粒', + '狀' => '狀', + '炙' => '炙', + '識' => '識', + '什' => '什', + '茶' => '茶', + '刺' => '刺', + '切' => '切', + '度' => '度', + '拓' => '拓', + '糖' => '糖', + '宅' => '宅', + '洞' => '洞', + '暴' => '暴', + '輻' => '輻', + '行' => '行', + '降' => '降', + '見' => '見', + '廓' => '廓', + '兀' => '兀', + '嗀' => '嗀', + '塚' => '塚', + '晴' => '晴', + '凞' => '凞', + '猪' => '猪', + '益' => '益', + '礼' => '礼', + '神' => '神', + '祥' => '祥', + '福' => '福', + '靖' => '靖', + '精' => '精', + '羽' => '羽', + '蘒' => '蘒', + '諸' => '諸', + '逸' => '逸', + '都' => '都', + '飯' => '飯', + '飼' => '飼', + '館' => '館', + '鶴' => '鶴', + '郞' => '郞', + '隷' => '隷', + '侮' => '侮', + '僧' => '僧', + '免' => '免', + '勉' => '勉', + '勤' => '勤', + '卑' => '卑', + '喝' => '喝', + '嘆' => '嘆', + '器' => '器', + '塀' => '塀', + '墨' => '墨', + '層' => '層', + '屮' => '屮', + '悔' => '悔', + '慨' => '慨', + '憎' => '憎', + '懲' => '懲', + '敏' => '敏', + '既' => '既', + '暑' => '暑', + '梅' => '梅', + '海' => '海', + '渚' => '渚', + '漢' => '漢', + '煮' => '煮', + '爫' => '爫', + '琢' => '琢', + '碑' => '碑', + '社' => '社', + '祉' => '祉', + '祈' => '祈', + '祐' => '祐', + '祖' => '祖', + '祝' => '祝', + '禍' => '禍', + '禎' => '禎', + '穀' => '穀', + '突' => '突', + '節' => '節', + '練' => '練', + '縉' => '縉', + '繁' => '繁', + '署' => '署', + '者' => '者', + '臭' => '臭', + '艹' => '艹', + '艹' => '艹', + '著' => '著', + '褐' => '褐', + '視' => '視', + '謁' => '謁', + '謹' => '謹', + '賓' => '賓', + '贈' => '贈', + '辶' => '辶', + '逸' => '逸', + '難' => '難', + '響' => '響', + '頻' => '頻', + '恵' => '恵', + '𤋮' => '𤋮', + '舘' => '舘', + '並' => '並', + '况' => '况', + '全' => '全', + '侀' => '侀', + '充' => '充', + '冀' => '冀', + '勇' => '勇', + '勺' => '勺', + '喝' => '喝', + '啕' => '啕', + '喙' => '喙', + '嗢' => '嗢', + '塚' => '塚', + '墳' => '墳', + '奄' => '奄', + '奔' => '奔', + '婢' => '婢', + '嬨' => '嬨', + '廒' => '廒', + '廙' => '廙', + '彩' => '彩', + '徭' => '徭', + '惘' => '惘', + '慎' => '慎', + '愈' => '愈', + '憎' => '憎', + '慠' => '慠', + '懲' => '懲', + '戴' => '戴', + '揄' => '揄', + '搜' => '搜', + '摒' => '摒', + '敖' => '敖', + '晴' => '晴', + '朗' => '朗', + '望' => '望', + '杖' => '杖', + '歹' => '歹', + '殺' => '殺', + '流' => '流', + '滛' => '滛', + '滋' => '滋', + '漢' => '漢', + '瀞' => '瀞', + '煮' => '煮', + '瞧' => '瞧', + '爵' => '爵', + '犯' => '犯', + '猪' => '猪', + '瑱' => '瑱', + '甆' => '甆', + '画' => '画', + '瘝' => '瘝', + '瘟' => '瘟', + '益' => '益', + '盛' => '盛', + '直' => '直', + '睊' => '睊', + '着' => '着', + '磌' => '磌', + '窱' => '窱', + '節' => '節', + '类' => '类', + '絛' => '絛', + '練' => '練', + '缾' => '缾', + '者' => '者', + '荒' => '荒', + '華' => '華', + '蝹' => '蝹', + '襁' => '襁', + '覆' => '覆', + '視' => '視', + '調' => '調', + '諸' => '諸', + '請' => '請', + '謁' => '謁', + '諾' => '諾', + '諭' => '諭', + '謹' => '謹', + '變' => '變', + '贈' => '贈', + '輸' => '輸', + '遲' => '遲', + '醙' => '醙', + '鉶' => '鉶', + '陼' => '陼', + '難' => '難', + '靖' => '靖', + '韛' => '韛', + '響' => '響', + '頋' => '頋', + '頻' => '頻', + '鬒' => '鬒', + '龜' => '龜', + '𢡊' => '𢡊', + '𢡄' => '𢡄', + '𣏕' => '𣏕', + '㮝' => '㮝', + '䀘' => '䀘', + '䀹' => '䀹', + '𥉉' => '𥉉', + '𥳐' => '𥳐', + '𧻓' => '𧻓', + '齃' => '齃', + '龎' => '龎', + 'יִ' => 'יִ', + 'ײַ' => 'ײַ', + 'שׁ' => 'שׁ', + 'שׂ' => 'שׂ', + 'שּׁ' => 'שּׁ', + 'שּׂ' => 'שּׂ', + 'אַ' => 'אַ', + 'אָ' => 'אָ', + 'אּ' => 'אּ', + 'בּ' => 'בּ', + 'גּ' => 'גּ', + 'דּ' => 'דּ', + 'הּ' => 'הּ', + 'וּ' => 'וּ', + 'זּ' => 'זּ', + 'טּ' => 'טּ', + 'יּ' => 'יּ', + 'ךּ' => 'ךּ', + 'כּ' => 'כּ', + 'לּ' => 'לּ', + 'מּ' => 'מּ', + 'נּ' => 'נּ', + 'סּ' => 'סּ', + 'ףּ' => 'ףּ', + 'פּ' => 'פּ', + 'צּ' => 'צּ', + 'קּ' => 'קּ', + 'רּ' => 'רּ', + 'שּ' => 'שּ', + 'תּ' => 'תּ', + 'וֹ' => 'וֹ', + 'בֿ' => 'בֿ', + 'כֿ' => 'כֿ', + 'פֿ' => 'פֿ', + '𑂚' => '𑂚', + '𑂜' => '𑂜', + '𑂫' => '𑂫', + '𑄮' => '𑄮', + '𑄯' => '𑄯', + '𑍋' => '𑍋', + '𑍌' => '𑍌', + '𑒻' => '𑒻', + '𑒼' => '𑒼', + '𑒾' => '𑒾', + '𑖺' => '𑖺', + '𑖻' => '𑖻', + '𑤸' => '𑤸', + '𝅗𝅥' => '𝅗𝅥', + '𝅘𝅥' => '𝅘𝅥', + '𝅘𝅥𝅮' => '𝅘𝅥𝅮', + '𝅘𝅥𝅯' => '𝅘𝅥𝅯', + '𝅘𝅥𝅰' => '𝅘𝅥𝅰', + '𝅘𝅥𝅱' => '𝅘𝅥𝅱', + '𝅘𝅥𝅲' => '𝅘𝅥𝅲', + '𝆹𝅥' => '𝆹𝅥', + '𝆺𝅥' => '𝆺𝅥', + '𝆹𝅥𝅮' => '𝆹𝅥𝅮', + '𝆺𝅥𝅮' => '𝆺𝅥𝅮', + '𝆹𝅥𝅯' => '𝆹𝅥𝅯', + '𝆺𝅥𝅯' => '𝆺𝅥𝅯', + '丽' => '丽', + '丸' => '丸', + '乁' => '乁', + '𠄢' => '𠄢', + '你' => '你', + '侮' => '侮', + '侻' => '侻', + '倂' => '倂', + '偺' => '偺', + '備' => '備', + '僧' => '僧', + '像' => '像', + '㒞' => '㒞', + '𠘺' => '𠘺', + '免' => '免', + '兔' => '兔', + '兤' => '兤', + '具' => '具', + '𠔜' => '𠔜', + '㒹' => '㒹', + '內' => '內', + '再' => '再', + '𠕋' => '𠕋', + '冗' => '冗', + '冤' => '冤', + '仌' => '仌', + '冬' => '冬', + '况' => '况', + '𩇟' => '𩇟', + '凵' => '凵', + '刃' => '刃', + '㓟' => '㓟', + '刻' => '刻', + '剆' => '剆', + '割' => '割', + '剷' => '剷', + '㔕' => '㔕', + '勇' => '勇', + '勉' => '勉', + '勤' => '勤', + '勺' => '勺', + '包' => '包', + '匆' => '匆', + '北' => '北', + '卉' => '卉', + '卑' => '卑', + '博' => '博', + '即' => '即', + '卽' => '卽', + '卿' => '卿', + '卿' => '卿', + '卿' => '卿', + '𠨬' => '𠨬', + '灰' => '灰', + '及' => '及', + '叟' => '叟', + '𠭣' => '𠭣', + '叫' => '叫', + '叱' => '叱', + '吆' => '吆', + '咞' => '咞', + '吸' => '吸', + '呈' => '呈', + '周' => '周', + '咢' => '咢', + '哶' => '哶', + '唐' => '唐', + '啓' => '啓', + '啣' => '啣', + '善' => '善', + '善' => '善', + '喙' => '喙', + '喫' => '喫', + '喳' => '喳', + '嗂' => '嗂', + '圖' => '圖', + '嘆' => '嘆', + '圗' => '圗', + '噑' => '噑', + '噴' => '噴', + '切' => '切', + '壮' => '壮', + '城' => '城', + '埴' => '埴', + '堍' => '堍', + '型' => '型', + '堲' => '堲', + '報' => '報', + '墬' => '墬', + '𡓤' => '𡓤', + '売' => '売', + '壷' => '壷', + '夆' => '夆', + '多' => '多', + '夢' => '夢', + '奢' => '奢', + '𡚨' => '𡚨', + '𡛪' => '𡛪', + '姬' => '姬', + '娛' => '娛', + '娧' => '娧', + '姘' => '姘', + '婦' => '婦', + '㛮' => '㛮', + '㛼' => '㛼', + '嬈' => '嬈', + '嬾' => '嬾', + '嬾' => '嬾', + '𡧈' => '𡧈', + '寃' => '寃', + '寘' => '寘', + '寧' => '寧', + '寳' => '寳', + '𡬘' => '𡬘', + '寿' => '寿', + '将' => '将', + '当' => '当', + '尢' => '尢', + '㞁' => '㞁', + '屠' => '屠', + '屮' => '屮', + '峀' => '峀', + '岍' => '岍', + '𡷤' => '𡷤', + '嵃' => '嵃', + '𡷦' => '𡷦', + '嵮' => '嵮', + '嵫' => '嵫', + '嵼' => '嵼', + '巡' => '巡', + '巢' => '巢', + '㠯' => '㠯', + '巽' => '巽', + '帨' => '帨', + '帽' => '帽', + '幩' => '幩', + '㡢' => '㡢', + '𢆃' => '𢆃', + '㡼' => '㡼', + '庰' => '庰', + '庳' => '庳', + '庶' => '庶', + '廊' => '廊', + '𪎒' => '𪎒', + '廾' => '廾', + '𢌱' => '𢌱', + '𢌱' => '𢌱', + '舁' => '舁', + '弢' => '弢', + '弢' => '弢', + '㣇' => '㣇', + '𣊸' => '𣊸', + '𦇚' => '𦇚', + '形' => '形', + '彫' => '彫', + '㣣' => '㣣', + '徚' => '徚', + '忍' => '忍', + '志' => '志', + '忹' => '忹', + '悁' => '悁', + '㤺' => '㤺', + '㤜' => '㤜', + '悔' => '悔', + '𢛔' => '𢛔', + '惇' => '惇', + '慈' => '慈', + '慌' => '慌', + '慎' => '慎', + '慌' => '慌', + '慺' => '慺', + '憎' => '憎', + '憲' => '憲', + '憤' => '憤', + '憯' => '憯', + '懞' => '懞', + '懲' => '懲', + '懶' => '懶', + '成' => '成', + '戛' => '戛', + '扝' => '扝', + '抱' => '抱', + '拔' => '拔', + '捐' => '捐', + '𢬌' => '𢬌', + '挽' => '挽', + '拼' => '拼', + '捨' => '捨', + '掃' => '掃', + '揤' => '揤', + '𢯱' => '𢯱', + '搢' => '搢', + '揅' => '揅', + '掩' => '掩', + '㨮' => '㨮', + '摩' => '摩', + '摾' => '摾', + '撝' => '撝', + '摷' => '摷', + '㩬' => '㩬', + '敏' => '敏', + '敬' => '敬', + '𣀊' => '𣀊', + '旣' => '旣', + '書' => '書', + '晉' => '晉', + '㬙' => '㬙', + '暑' => '暑', + '㬈' => '㬈', + '㫤' => '㫤', + '冒' => '冒', + '冕' => '冕', + '最' => '最', + '暜' => '暜', + '肭' => '肭', + '䏙' => '䏙', + '朗' => '朗', + '望' => '望', + '朡' => '朡', + '杞' => '杞', + '杓' => '杓', + '𣏃' => '𣏃', + '㭉' => '㭉', + '柺' => '柺', + '枅' => '枅', + '桒' => '桒', + '梅' => '梅', + '𣑭' => '𣑭', + '梎' => '梎', + '栟' => '栟', + '椔' => '椔', + '㮝' => '㮝', + '楂' => '楂', + '榣' => '榣', + '槪' => '槪', + '檨' => '檨', + '𣚣' => '𣚣', + '櫛' => '櫛', + '㰘' => '㰘', + '次' => '次', + '𣢧' => '𣢧', + '歔' => '歔', + '㱎' => '㱎', + '歲' => '歲', + '殟' => '殟', + '殺' => '殺', + '殻' => '殻', + '𣪍' => '𣪍', + '𡴋' => '𡴋', + '𣫺' => '𣫺', + '汎' => '汎', + '𣲼' => '𣲼', + '沿' => '沿', + '泍' => '泍', + '汧' => '汧', + '洖' => '洖', + '派' => '派', + '海' => '海', + '流' => '流', + '浩' => '浩', + '浸' => '浸', + '涅' => '涅', + '𣴞' => '𣴞', + '洴' => '洴', + '港' => '港', + '湮' => '湮', + '㴳' => '㴳', + '滋' => '滋', + '滇' => '滇', + '𣻑' => '𣻑', + '淹' => '淹', + '潮' => '潮', + '𣽞' => '𣽞', + '𣾎' => '𣾎', + '濆' => '濆', + '瀹' => '瀹', + '瀞' => '瀞', + '瀛' => '瀛', + '㶖' => '㶖', + '灊' => '灊', + '災' => '災', + '灷' => '灷', + '炭' => '炭', + '𠔥' => '𠔥', + '煅' => '煅', + '𤉣' => '𤉣', + '熜' => '熜', + '𤎫' => '𤎫', + '爨' => '爨', + '爵' => '爵', + '牐' => '牐', + '𤘈' => '𤘈', + '犀' => '犀', + '犕' => '犕', + '𤜵' => '𤜵', + '𤠔' => '𤠔', + '獺' => '獺', + '王' => '王', + '㺬' => '㺬', + '玥' => '玥', + '㺸' => '㺸', + '㺸' => '㺸', + '瑇' => '瑇', + '瑜' => '瑜', + '瑱' => '瑱', + '璅' => '璅', + '瓊' => '瓊', + '㼛' => '㼛', + '甤' => '甤', + '𤰶' => '𤰶', + '甾' => '甾', + '𤲒' => '𤲒', + '異' => '異', + '𢆟' => '𢆟', + '瘐' => '瘐', + '𤾡' => '𤾡', + '𤾸' => '𤾸', + '𥁄' => '𥁄', + '㿼' => '㿼', + '䀈' => '䀈', + '直' => '直', + '𥃳' => '𥃳', + '𥃲' => '𥃲', + '𥄙' => '𥄙', + '𥄳' => '𥄳', + '眞' => '眞', + '真' => '真', + '真' => '真', + '睊' => '睊', + '䀹' => '䀹', + '瞋' => '瞋', + '䁆' => '䁆', + '䂖' => '䂖', + '𥐝' => '𥐝', + '硎' => '硎', + '碌' => '碌', + '磌' => '磌', + '䃣' => '䃣', + '𥘦' => '𥘦', + '祖' => '祖', + '𥚚' => '𥚚', + '𥛅' => '𥛅', + '福' => '福', + '秫' => '秫', + '䄯' => '䄯', + '穀' => '穀', + '穊' => '穊', + '穏' => '穏', + '𥥼' => '𥥼', + '𥪧' => '𥪧', + '𥪧' => '𥪧', + '竮' => '竮', + '䈂' => '䈂', + '𥮫' => '𥮫', + '篆' => '篆', + '築' => '築', + '䈧' => '䈧', + '𥲀' => '𥲀', + '糒' => '糒', + '䊠' => '䊠', + '糨' => '糨', + '糣' => '糣', + '紀' => '紀', + '𥾆' => '𥾆', + '絣' => '絣', + '䌁' => '䌁', + '緇' => '緇', + '縂' => '縂', + '繅' => '繅', + '䌴' => '䌴', + '𦈨' => '𦈨', + '𦉇' => '𦉇', + '䍙' => '䍙', + '𦋙' => '𦋙', + '罺' => '罺', + '𦌾' => '𦌾', + '羕' => '羕', + '翺' => '翺', + '者' => '者', + '𦓚' => '𦓚', + '𦔣' => '𦔣', + '聠' => '聠', + '𦖨' => '𦖨', + '聰' => '聰', + '𣍟' => '𣍟', + '䏕' => '䏕', + '育' => '育', + '脃' => '脃', + '䐋' => '䐋', + '脾' => '脾', + '媵' => '媵', + '𦞧' => '𦞧', + '𦞵' => '𦞵', + '𣎓' => '𣎓', + '𣎜' => '𣎜', + '舁' => '舁', + '舄' => '舄', + '辞' => '辞', + '䑫' => '䑫', + '芑' => '芑', + '芋' => '芋', + '芝' => '芝', + '劳' => '劳', + '花' => '花', + '芳' => '芳', + '芽' => '芽', + '苦' => '苦', + '𦬼' => '𦬼', + '若' => '若', + '茝' => '茝', + '荣' => '荣', + '莭' => '莭', + '茣' => '茣', + '莽' => '莽', + '菧' => '菧', + '著' => '著', + '荓' => '荓', + '菊' => '菊', + '菌' => '菌', + '菜' => '菜', + '𦰶' => '𦰶', + '𦵫' => '𦵫', + '𦳕' => '𦳕', + '䔫' => '䔫', + '蓱' => '蓱', + '蓳' => '蓳', + '蔖' => '蔖', + '𧏊' => '𧏊', + '蕤' => '蕤', + '𦼬' => '𦼬', + '䕝' => '䕝', + '䕡' => '䕡', + '𦾱' => '𦾱', + '𧃒' => '𧃒', + '䕫' => '䕫', + '虐' => '虐', + '虜' => '虜', + '虧' => '虧', + '虩' => '虩', + '蚩' => '蚩', + '蚈' => '蚈', + '蜎' => '蜎', + '蛢' => '蛢', + '蝹' => '蝹', + '蜨' => '蜨', + '蝫' => '蝫', + '螆' => '螆', + '䗗' => '䗗', + '蟡' => '蟡', + '蠁' => '蠁', + '䗹' => '䗹', + '衠' => '衠', + '衣' => '衣', + '𧙧' => '𧙧', + '裗' => '裗', + '裞' => '裞', + '䘵' => '䘵', + '裺' => '裺', + '㒻' => '㒻', + '𧢮' => '𧢮', + '𧥦' => '𧥦', + '䚾' => '䚾', + '䛇' => '䛇', + '誠' => '誠', + '諭' => '諭', + '變' => '變', + '豕' => '豕', + '𧲨' => '𧲨', + '貫' => '貫', + '賁' => '賁', + '贛' => '贛', + '起' => '起', + '𧼯' => '𧼯', + '𠠄' => '𠠄', + '跋' => '跋', + '趼' => '趼', + '跰' => '跰', + '𠣞' => '𠣞', + '軔' => '軔', + '輸' => '輸', + '𨗒' => '𨗒', + '𨗭' => '𨗭', + '邔' => '邔', + '郱' => '郱', + '鄑' => '鄑', + '𨜮' => '𨜮', + '鄛' => '鄛', + '鈸' => '鈸', + '鋗' => '鋗', + '鋘' => '鋘', + '鉼' => '鉼', + '鏹' => '鏹', + '鐕' => '鐕', + '𨯺' => '𨯺', + '開' => '開', + '䦕' => '䦕', + '閷' => '閷', + '𨵷' => '𨵷', + '䧦' => '䧦', + '雃' => '雃', + '嶲' => '嶲', + '霣' => '霣', + '𩅅' => '𩅅', + '𩈚' => '𩈚', + '䩮' => '䩮', + '䩶' => '䩶', + '韠' => '韠', + '𩐊' => '𩐊', + '䪲' => '䪲', + '𩒖' => '𩒖', + '頋' => '頋', + '頋' => '頋', + '頩' => '頩', + '𩖶' => '𩖶', + '飢' => '飢', + '䬳' => '䬳', + '餩' => '餩', + '馧' => '馧', + '駂' => '駂', + '駾' => '駾', + '䯎' => '䯎', + '𩬰' => '𩬰', + '鬒' => '鬒', + '鱀' => '鱀', + '鳽' => '鳽', + '䳎' => '䳎', + '䳭' => '䳭', + '鵧' => '鵧', + '𪃎' => '𪃎', + '䳸' => '䳸', + '𪄅' => '𪄅', + '𪈎' => '𪈎', + '𪊑' => '𪊑', + '麻' => '麻', + '䵖' => '䵖', + '黹' => '黹', + '黾' => '黾', + '鼅' => '鼅', + '鼏' => '鼏', + '鼖' => '鼖', + '鼻' => '鼻', + '𪘀' => '𪘀', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php new file mode 100644 index 00000000..ec90f36e --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php @@ -0,0 +1,876 @@ + 230, + '́' => 230, + '̂' => 230, + '̃' => 230, + '̄' => 230, + '̅' => 230, + '̆' => 230, + '̇' => 230, + '̈' => 230, + '̉' => 230, + '̊' => 230, + '̋' => 230, + '̌' => 230, + '̍' => 230, + '̎' => 230, + '̏' => 230, + '̐' => 230, + '̑' => 230, + '̒' => 230, + '̓' => 230, + '̔' => 230, + '̕' => 232, + '̖' => 220, + '̗' => 220, + '̘' => 220, + '̙' => 220, + '̚' => 232, + '̛' => 216, + '̜' => 220, + '̝' => 220, + '̞' => 220, + '̟' => 220, + '̠' => 220, + '̡' => 202, + '̢' => 202, + '̣' => 220, + '̤' => 220, + '̥' => 220, + '̦' => 220, + '̧' => 202, + '̨' => 202, + '̩' => 220, + '̪' => 220, + '̫' => 220, + '̬' => 220, + '̭' => 220, + '̮' => 220, + '̯' => 220, + '̰' => 220, + '̱' => 220, + '̲' => 220, + '̳' => 220, + '̴' => 1, + '̵' => 1, + '̶' => 1, + '̷' => 1, + '̸' => 1, + '̹' => 220, + '̺' => 220, + '̻' => 220, + '̼' => 220, + '̽' => 230, + '̾' => 230, + '̿' => 230, + '̀' => 230, + '́' => 230, + '͂' => 230, + '̓' => 230, + '̈́' => 230, + 'ͅ' => 240, + '͆' => 230, + '͇' => 220, + '͈' => 220, + '͉' => 220, + '͊' => 230, + '͋' => 230, + '͌' => 230, + '͍' => 220, + '͎' => 220, + '͐' => 230, + '͑' => 230, + '͒' => 230, + '͓' => 220, + '͔' => 220, + '͕' => 220, + '͖' => 220, + '͗' => 230, + '͘' => 232, + '͙' => 220, + '͚' => 220, + '͛' => 230, + '͜' => 233, + '͝' => 234, + '͞' => 234, + '͟' => 233, + '͠' => 234, + '͡' => 234, + '͢' => 233, + 'ͣ' => 230, + 'ͤ' => 230, + 'ͥ' => 230, + 'ͦ' => 230, + 'ͧ' => 230, + 'ͨ' => 230, + 'ͩ' => 230, + 'ͪ' => 230, + 'ͫ' => 230, + 'ͬ' => 230, + 'ͭ' => 230, + 'ͮ' => 230, + 'ͯ' => 230, + '҃' => 230, + '҄' => 230, + '҅' => 230, + '҆' => 230, + '҇' => 230, + '֑' => 220, + '֒' => 230, + '֓' => 230, + '֔' => 230, + '֕' => 230, + '֖' => 220, + '֗' => 230, + '֘' => 230, + '֙' => 230, + '֚' => 222, + '֛' => 220, + '֜' => 230, + '֝' => 230, + '֞' => 230, + '֟' => 230, + '֠' => 230, + '֡' => 230, + '֢' => 220, + '֣' => 220, + '֤' => 220, + '֥' => 220, + '֦' => 220, + '֧' => 220, + '֨' => 230, + '֩' => 230, + '֪' => 220, + '֫' => 230, + '֬' => 230, + '֭' => 222, + '֮' => 228, + '֯' => 230, + 'ְ' => 10, + 'ֱ' => 11, + 'ֲ' => 12, + 'ֳ' => 13, + 'ִ' => 14, + 'ֵ' => 15, + 'ֶ' => 16, + 'ַ' => 17, + 'ָ' => 18, + 'ֹ' => 19, + 'ֺ' => 19, + 'ֻ' => 20, + 'ּ' => 21, + 'ֽ' => 22, + 'ֿ' => 23, + 'ׁ' => 24, + 'ׂ' => 25, + 'ׄ' => 230, + 'ׅ' => 220, + 'ׇ' => 18, + 'ؐ' => 230, + 'ؑ' => 230, + 'ؒ' => 230, + 'ؓ' => 230, + 'ؔ' => 230, + 'ؕ' => 230, + 'ؖ' => 230, + 'ؗ' => 230, + 'ؘ' => 30, + 'ؙ' => 31, + 'ؚ' => 32, + 'ً' => 27, + 'ٌ' => 28, + 'ٍ' => 29, + 'َ' => 30, + 'ُ' => 31, + 'ِ' => 32, + 'ّ' => 33, + 'ْ' => 34, + 'ٓ' => 230, + 'ٔ' => 230, + 'ٕ' => 220, + 'ٖ' => 220, + 'ٗ' => 230, + '٘' => 230, + 'ٙ' => 230, + 'ٚ' => 230, + 'ٛ' => 230, + 'ٜ' => 220, + 'ٝ' => 230, + 'ٞ' => 230, + 'ٟ' => 220, + 'ٰ' => 35, + 'ۖ' => 230, + 'ۗ' => 230, + 'ۘ' => 230, + 'ۙ' => 230, + 'ۚ' => 230, + 'ۛ' => 230, + 'ۜ' => 230, + '۟' => 230, + '۠' => 230, + 'ۡ' => 230, + 'ۢ' => 230, + 'ۣ' => 220, + 'ۤ' => 230, + 'ۧ' => 230, + 'ۨ' => 230, + '۪' => 220, + '۫' => 230, + '۬' => 230, + 'ۭ' => 220, + 'ܑ' => 36, + 'ܰ' => 230, + 'ܱ' => 220, + 'ܲ' => 230, + 'ܳ' => 230, + 'ܴ' => 220, + 'ܵ' => 230, + 'ܶ' => 230, + 'ܷ' => 220, + 'ܸ' => 220, + 'ܹ' => 220, + 'ܺ' => 230, + 'ܻ' => 220, + 'ܼ' => 220, + 'ܽ' => 230, + 'ܾ' => 220, + 'ܿ' => 230, + '݀' => 230, + '݁' => 230, + '݂' => 220, + '݃' => 230, + '݄' => 220, + '݅' => 230, + '݆' => 220, + '݇' => 230, + '݈' => 220, + '݉' => 230, + '݊' => 230, + '߫' => 230, + '߬' => 230, + '߭' => 230, + '߮' => 230, + '߯' => 230, + '߰' => 230, + '߱' => 230, + '߲' => 220, + '߳' => 230, + '߽' => 220, + 'ࠖ' => 230, + 'ࠗ' => 230, + '࠘' => 230, + '࠙' => 230, + 'ࠛ' => 230, + 'ࠜ' => 230, + 'ࠝ' => 230, + 'ࠞ' => 230, + 'ࠟ' => 230, + 'ࠠ' => 230, + 'ࠡ' => 230, + 'ࠢ' => 230, + 'ࠣ' => 230, + 'ࠥ' => 230, + 'ࠦ' => 230, + 'ࠧ' => 230, + 'ࠩ' => 230, + 'ࠪ' => 230, + 'ࠫ' => 230, + 'ࠬ' => 230, + '࠭' => 230, + '࡙' => 220, + '࡚' => 220, + '࡛' => 220, + '࣓' => 220, + 'ࣔ' => 230, + 'ࣕ' => 230, + 'ࣖ' => 230, + 'ࣗ' => 230, + 'ࣘ' => 230, + 'ࣙ' => 230, + 'ࣚ' => 230, + 'ࣛ' => 230, + 'ࣜ' => 230, + 'ࣝ' => 230, + 'ࣞ' => 230, + 'ࣟ' => 230, + '࣠' => 230, + '࣡' => 230, + 'ࣣ' => 220, + 'ࣤ' => 230, + 'ࣥ' => 230, + 'ࣦ' => 220, + 'ࣧ' => 230, + 'ࣨ' => 230, + 'ࣩ' => 220, + '࣪' => 230, + '࣫' => 230, + '࣬' => 230, + '࣭' => 220, + '࣮' => 220, + '࣯' => 220, + 'ࣰ' => 27, + 'ࣱ' => 28, + 'ࣲ' => 29, + 'ࣳ' => 230, + 'ࣴ' => 230, + 'ࣵ' => 230, + 'ࣶ' => 220, + 'ࣷ' => 230, + 'ࣸ' => 230, + 'ࣹ' => 220, + 'ࣺ' => 220, + 'ࣻ' => 230, + 'ࣼ' => 230, + 'ࣽ' => 230, + 'ࣾ' => 230, + 'ࣿ' => 230, + '़' => 7, + '्' => 9, + '॑' => 230, + '॒' => 220, + '॓' => 230, + '॔' => 230, + '়' => 7, + '্' => 9, + '৾' => 230, + '਼' => 7, + '੍' => 9, + '઼' => 7, + '્' => 9, + '଼' => 7, + '୍' => 9, + '்' => 9, + '్' => 9, + 'ౕ' => 84, + 'ౖ' => 91, + '಼' => 7, + '್' => 9, + '഻' => 9, + '഼' => 9, + '്' => 9, + '්' => 9, + 'ุ' => 103, + 'ู' => 103, + 'ฺ' => 9, + '่' => 107, + '้' => 107, + '๊' => 107, + '๋' => 107, + 'ຸ' => 118, + 'ູ' => 118, + '຺' => 9, + '່' => 122, + '້' => 122, + '໊' => 122, + '໋' => 122, + '༘' => 220, + '༙' => 220, + '༵' => 220, + '༷' => 220, + '༹' => 216, + 'ཱ' => 129, + 'ི' => 130, + 'ུ' => 132, + 'ེ' => 130, + 'ཻ' => 130, + 'ོ' => 130, + 'ཽ' => 130, + 'ྀ' => 130, + 'ྂ' => 230, + 'ྃ' => 230, + '྄' => 9, + '྆' => 230, + '྇' => 230, + '࿆' => 220, + '့' => 7, + '္' => 9, + '်' => 9, + 'ႍ' => 220, + '፝' => 230, + '፞' => 230, + '፟' => 230, + '᜔' => 9, + '᜴' => 9, + '្' => 9, + '៝' => 230, + 'ᢩ' => 228, + '᤹' => 222, + '᤺' => 230, + '᤻' => 220, + 'ᨗ' => 230, + 'ᨘ' => 220, + '᩠' => 9, + '᩵' => 230, + '᩶' => 230, + '᩷' => 230, + '᩸' => 230, + '᩹' => 230, + '᩺' => 230, + '᩻' => 230, + '᩼' => 230, + '᩿' => 220, + '᪰' => 230, + '᪱' => 230, + '᪲' => 230, + '᪳' => 230, + '᪴' => 230, + '᪵' => 220, + '᪶' => 220, + '᪷' => 220, + '᪸' => 220, + '᪹' => 220, + '᪺' => 220, + '᪻' => 230, + '᪼' => 230, + '᪽' => 220, + 'ᪿ' => 220, + 'ᫀ' => 220, + '᬴' => 7, + '᭄' => 9, + '᭫' => 230, + '᭬' => 220, + '᭭' => 230, + '᭮' => 230, + '᭯' => 230, + '᭰' => 230, + '᭱' => 230, + '᭲' => 230, + '᭳' => 230, + '᮪' => 9, + '᮫' => 9, + '᯦' => 7, + '᯲' => 9, + '᯳' => 9, + '᰷' => 7, + '᳐' => 230, + '᳑' => 230, + '᳒' => 230, + '᳔' => 1, + '᳕' => 220, + '᳖' => 220, + '᳗' => 220, + '᳘' => 220, + '᳙' => 220, + '᳚' => 230, + '᳛' => 230, + '᳜' => 220, + '᳝' => 220, + '᳞' => 220, + '᳟' => 220, + '᳠' => 230, + '᳢' => 1, + '᳣' => 1, + '᳤' => 1, + '᳥' => 1, + '᳦' => 1, + '᳧' => 1, + '᳨' => 1, + '᳭' => 220, + '᳴' => 230, + '᳸' => 230, + '᳹' => 230, + '᷀' => 230, + '᷁' => 230, + '᷂' => 220, + '᷃' => 230, + '᷄' => 230, + '᷅' => 230, + '᷆' => 230, + '᷇' => 230, + '᷈' => 230, + '᷉' => 230, + '᷊' => 220, + '᷋' => 230, + '᷌' => 230, + '᷍' => 234, + '᷎' => 214, + '᷏' => 220, + '᷐' => 202, + '᷑' => 230, + '᷒' => 230, + 'ᷓ' => 230, + 'ᷔ' => 230, + 'ᷕ' => 230, + 'ᷖ' => 230, + 'ᷗ' => 230, + 'ᷘ' => 230, + 'ᷙ' => 230, + 'ᷚ' => 230, + 'ᷛ' => 230, + 'ᷜ' => 230, + 'ᷝ' => 230, + 'ᷞ' => 230, + 'ᷟ' => 230, + 'ᷠ' => 230, + 'ᷡ' => 230, + 'ᷢ' => 230, + 'ᷣ' => 230, + 'ᷤ' => 230, + 'ᷥ' => 230, + 'ᷦ' => 230, + 'ᷧ' => 230, + 'ᷨ' => 230, + 'ᷩ' => 230, + 'ᷪ' => 230, + 'ᷫ' => 230, + 'ᷬ' => 230, + 'ᷭ' => 230, + 'ᷮ' => 230, + 'ᷯ' => 230, + 'ᷰ' => 230, + 'ᷱ' => 230, + 'ᷲ' => 230, + 'ᷳ' => 230, + 'ᷴ' => 230, + '᷵' => 230, + '᷶' => 232, + '᷷' => 228, + '᷸' => 228, + '᷹' => 220, + '᷻' => 230, + '᷼' => 233, + '᷽' => 220, + '᷾' => 230, + '᷿' => 220, + '⃐' => 230, + '⃑' => 230, + '⃒' => 1, + '⃓' => 1, + '⃔' => 230, + '⃕' => 230, + '⃖' => 230, + '⃗' => 230, + '⃘' => 1, + '⃙' => 1, + '⃚' => 1, + '⃛' => 230, + '⃜' => 230, + '⃡' => 230, + '⃥' => 1, + '⃦' => 1, + '⃧' => 230, + '⃨' => 220, + '⃩' => 230, + '⃪' => 1, + '⃫' => 1, + '⃬' => 220, + '⃭' => 220, + '⃮' => 220, + '⃯' => 220, + '⃰' => 230, + '⳯' => 230, + '⳰' => 230, + '⳱' => 230, + '⵿' => 9, + 'ⷠ' => 230, + 'ⷡ' => 230, + 'ⷢ' => 230, + 'ⷣ' => 230, + 'ⷤ' => 230, + 'ⷥ' => 230, + 'ⷦ' => 230, + 'ⷧ' => 230, + 'ⷨ' => 230, + 'ⷩ' => 230, + 'ⷪ' => 230, + 'ⷫ' => 230, + 'ⷬ' => 230, + 'ⷭ' => 230, + 'ⷮ' => 230, + 'ⷯ' => 230, + 'ⷰ' => 230, + 'ⷱ' => 230, + 'ⷲ' => 230, + 'ⷳ' => 230, + 'ⷴ' => 230, + 'ⷵ' => 230, + 'ⷶ' => 230, + 'ⷷ' => 230, + 'ⷸ' => 230, + 'ⷹ' => 230, + 'ⷺ' => 230, + 'ⷻ' => 230, + 'ⷼ' => 230, + 'ⷽ' => 230, + 'ⷾ' => 230, + 'ⷿ' => 230, + '〪' => 218, + '〫' => 228, + '〬' => 232, + '〭' => 222, + '〮' => 224, + '〯' => 224, + '゙' => 8, + '゚' => 8, + '꙯' => 230, + 'ꙴ' => 230, + 'ꙵ' => 230, + 'ꙶ' => 230, + 'ꙷ' => 230, + 'ꙸ' => 230, + 'ꙹ' => 230, + 'ꙺ' => 230, + 'ꙻ' => 230, + '꙼' => 230, + '꙽' => 230, + 'ꚞ' => 230, + 'ꚟ' => 230, + '꛰' => 230, + '꛱' => 230, + '꠆' => 9, + '꠬' => 9, + '꣄' => 9, + '꣠' => 230, + '꣡' => 230, + '꣢' => 230, + '꣣' => 230, + '꣤' => 230, + '꣥' => 230, + '꣦' => 230, + '꣧' => 230, + '꣨' => 230, + '꣩' => 230, + '꣪' => 230, + '꣫' => 230, + '꣬' => 230, + '꣭' => 230, + '꣮' => 230, + '꣯' => 230, + '꣰' => 230, + '꣱' => 230, + '꤫' => 220, + '꤬' => 220, + '꤭' => 220, + '꥓' => 9, + '꦳' => 7, + '꧀' => 9, + 'ꪰ' => 230, + 'ꪲ' => 230, + 'ꪳ' => 230, + 'ꪴ' => 220, + 'ꪷ' => 230, + 'ꪸ' => 230, + 'ꪾ' => 230, + '꪿' => 230, + '꫁' => 230, + '꫶' => 9, + '꯭' => 9, + 'ﬞ' => 26, + '︠' => 230, + '︡' => 230, + '︢' => 230, + '︣' => 230, + '︤' => 230, + '︥' => 230, + '︦' => 230, + '︧' => 220, + '︨' => 220, + '︩' => 220, + '︪' => 220, + '︫' => 220, + '︬' => 220, + '︭' => 220, + '︮' => 230, + '︯' => 230, + '𐇽' => 220, + '𐋠' => 220, + '𐍶' => 230, + '𐍷' => 230, + '𐍸' => 230, + '𐍹' => 230, + '𐍺' => 230, + '𐨍' => 220, + '𐨏' => 230, + '𐨸' => 230, + '𐨹' => 1, + '𐨺' => 220, + '𐨿' => 9, + '𐫥' => 230, + '𐫦' => 220, + '𐴤' => 230, + '𐴥' => 230, + '𐴦' => 230, + '𐴧' => 230, + '𐺫' => 230, + '𐺬' => 230, + '𐽆' => 220, + '𐽇' => 220, + '𐽈' => 230, + '𐽉' => 230, + '𐽊' => 230, + '𐽋' => 220, + '𐽌' => 230, + '𐽍' => 220, + '𐽎' => 220, + '𐽏' => 220, + '𐽐' => 220, + '𑁆' => 9, + '𑁿' => 9, + '𑂹' => 9, + '𑂺' => 7, + '𑄀' => 230, + '𑄁' => 230, + '𑄂' => 230, + '𑄳' => 9, + '𑄴' => 9, + '𑅳' => 7, + '𑇀' => 9, + '𑇊' => 7, + '𑈵' => 9, + '𑈶' => 7, + '𑋩' => 7, + '𑋪' => 9, + '𑌻' => 7, + '𑌼' => 7, + '𑍍' => 9, + '𑍦' => 230, + '𑍧' => 230, + '𑍨' => 230, + '𑍩' => 230, + '𑍪' => 230, + '𑍫' => 230, + '𑍬' => 230, + '𑍰' => 230, + '𑍱' => 230, + '𑍲' => 230, + '𑍳' => 230, + '𑍴' => 230, + '𑑂' => 9, + '𑑆' => 7, + '𑑞' => 230, + '𑓂' => 9, + '𑓃' => 7, + '𑖿' => 9, + '𑗀' => 7, + '𑘿' => 9, + '𑚶' => 9, + '𑚷' => 7, + '𑜫' => 9, + '𑠹' => 9, + '𑠺' => 7, + '𑤽' => 9, + '𑤾' => 9, + '𑥃' => 7, + '𑧠' => 9, + '𑨴' => 9, + '𑩇' => 9, + '𑪙' => 9, + '𑰿' => 9, + '𑵂' => 7, + '𑵄' => 9, + '𑵅' => 9, + '𑶗' => 9, + '𖫰' => 1, + '𖫱' => 1, + '𖫲' => 1, + '𖫳' => 1, + '𖫴' => 1, + '𖬰' => 230, + '𖬱' => 230, + '𖬲' => 230, + '𖬳' => 230, + '𖬴' => 230, + '𖬵' => 230, + '𖬶' => 230, + '𖿰' => 6, + '𖿱' => 6, + '𛲞' => 1, + '𝅥' => 216, + '𝅦' => 216, + '𝅧' => 1, + '𝅨' => 1, + '𝅩' => 1, + '𝅭' => 226, + '𝅮' => 216, + '𝅯' => 216, + '𝅰' => 216, + '𝅱' => 216, + '𝅲' => 216, + '𝅻' => 220, + '𝅼' => 220, + '𝅽' => 220, + '𝅾' => 220, + '𝅿' => 220, + '𝆀' => 220, + '𝆁' => 220, + '𝆂' => 220, + '𝆅' => 230, + '𝆆' => 230, + '𝆇' => 230, + '𝆈' => 230, + '𝆉' => 230, + '𝆊' => 220, + '𝆋' => 220, + '𝆪' => 230, + '𝆫' => 230, + '𝆬' => 230, + '𝆭' => 230, + '𝉂' => 230, + '𝉃' => 230, + '𝉄' => 230, + '𞀀' => 230, + '𞀁' => 230, + '𞀂' => 230, + '𞀃' => 230, + '𞀄' => 230, + '𞀅' => 230, + '𞀆' => 230, + '𞀈' => 230, + '𞀉' => 230, + '𞀊' => 230, + '𞀋' => 230, + '𞀌' => 230, + '𞀍' => 230, + '𞀎' => 230, + '𞀏' => 230, + '𞀐' => 230, + '𞀑' => 230, + '𞀒' => 230, + '𞀓' => 230, + '𞀔' => 230, + '𞀕' => 230, + '𞀖' => 230, + '𞀗' => 230, + '𞀘' => 230, + '𞀛' => 230, + '𞀜' => 230, + '𞀝' => 230, + '𞀞' => 230, + '𞀟' => 230, + '𞀠' => 230, + '𞀡' => 230, + '𞀣' => 230, + '𞀤' => 230, + '𞀦' => 230, + '𞀧' => 230, + '𞀨' => 230, + '𞀩' => 230, + '𞀪' => 230, + '𞄰' => 230, + '𞄱' => 230, + '𞄲' => 230, + '𞄳' => 230, + '𞄴' => 230, + '𞄵' => 230, + '𞄶' => 230, + '𞋬' => 230, + '𞋭' => 230, + '𞋮' => 230, + '𞋯' => 230, + '𞣐' => 220, + '𞣑' => 220, + '𞣒' => 220, + '𞣓' => 220, + '𞣔' => 220, + '𞣕' => 220, + '𞣖' => 220, + '𞥄' => 230, + '𞥅' => 230, + '𞥆' => 230, + '𞥇' => 230, + '𞥈' => 230, + '𞥉' => 230, + '𞥊' => 7, +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php new file mode 100644 index 00000000..15749028 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php @@ -0,0 +1,3695 @@ + ' ', + '¨' => ' ̈', + 'ª' => 'a', + '¯' => ' ̄', + '²' => '2', + '³' => '3', + '´' => ' ́', + 'µ' => 'μ', + '¸' => ' ̧', + '¹' => '1', + 'º' => 'o', + '¼' => '1⁄4', + '½' => '1⁄2', + '¾' => '3⁄4', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'Ŀ' => 'L·', + 'ŀ' => 'l·', + 'ʼn' => 'ʼn', + 'ſ' => 's', + 'DŽ' => 'DŽ', + 'Dž' => 'Dž', + 'dž' => 'dž', + 'LJ' => 'LJ', + 'Lj' => 'Lj', + 'lj' => 'lj', + 'NJ' => 'NJ', + 'Nj' => 'Nj', + 'nj' => 'nj', + 'DZ' => 'DZ', + 'Dz' => 'Dz', + 'dz' => 'dz', + 'ʰ' => 'h', + 'ʱ' => 'ɦ', + 'ʲ' => 'j', + 'ʳ' => 'r', + 'ʴ' => 'ɹ', + 'ʵ' => 'ɻ', + 'ʶ' => 'ʁ', + 'ʷ' => 'w', + 'ʸ' => 'y', + '˘' => ' ̆', + '˙' => ' ̇', + '˚' => ' ̊', + '˛' => ' ̨', + '˜' => ' ̃', + '˝' => ' ̋', + 'ˠ' => 'ɣ', + 'ˡ' => 'l', + 'ˢ' => 's', + 'ˣ' => 'x', + 'ˤ' => 'ʕ', + 'ͺ' => ' ͅ', + '΄' => ' ́', + '΅' => ' ̈́', + 'ϐ' => 'β', + 'ϑ' => 'θ', + 'ϒ' => 'Υ', + 'ϓ' => 'Ύ', + 'ϔ' => 'Ϋ', + 'ϕ' => 'φ', + 'ϖ' => 'π', + 'ϰ' => 'κ', + 'ϱ' => 'ρ', + 'ϲ' => 'ς', + 'ϴ' => 'Θ', + 'ϵ' => 'ε', + 'Ϲ' => 'Σ', + 'և' => 'եւ', + 'ٵ' => 'اٴ', + 'ٶ' => 'وٴ', + 'ٷ' => 'ۇٴ', + 'ٸ' => 'يٴ', + 'ำ' => 'ํา', + 'ຳ' => 'ໍາ', + 'ໜ' => 'ຫນ', + 'ໝ' => 'ຫມ', + '༌' => '་', + 'ཷ' => 'ྲཱྀ', + 'ཹ' => 'ླཱྀ', + 'ჼ' => 'ნ', + 'ᴬ' => 'A', + 'ᴭ' => 'Æ', + 'ᴮ' => 'B', + 'ᴰ' => 'D', + 'ᴱ' => 'E', + 'ᴲ' => 'Ǝ', + 'ᴳ' => 'G', + 'ᴴ' => 'H', + 'ᴵ' => 'I', + 'ᴶ' => 'J', + 'ᴷ' => 'K', + 'ᴸ' => 'L', + 'ᴹ' => 'M', + 'ᴺ' => 'N', + 'ᴼ' => 'O', + 'ᴽ' => 'Ȣ', + 'ᴾ' => 'P', + 'ᴿ' => 'R', + 'ᵀ' => 'T', + 'ᵁ' => 'U', + 'ᵂ' => 'W', + 'ᵃ' => 'a', + 'ᵄ' => 'ɐ', + 'ᵅ' => 'ɑ', + 'ᵆ' => 'ᴂ', + 'ᵇ' => 'b', + 'ᵈ' => 'd', + 'ᵉ' => 'e', + 'ᵊ' => 'ə', + 'ᵋ' => 'ɛ', + 'ᵌ' => 'ɜ', + 'ᵍ' => 'g', + 'ᵏ' => 'k', + 'ᵐ' => 'm', + 'ᵑ' => 'ŋ', + 'ᵒ' => 'o', + 'ᵓ' => 'ɔ', + 'ᵔ' => 'ᴖ', + 'ᵕ' => 'ᴗ', + 'ᵖ' => 'p', + 'ᵗ' => 't', + 'ᵘ' => 'u', + 'ᵙ' => 'ᴝ', + 'ᵚ' => 'ɯ', + 'ᵛ' => 'v', + 'ᵜ' => 'ᴥ', + 'ᵝ' => 'β', + 'ᵞ' => 'γ', + 'ᵟ' => 'δ', + 'ᵠ' => 'φ', + 'ᵡ' => 'χ', + 'ᵢ' => 'i', + 'ᵣ' => 'r', + 'ᵤ' => 'u', + 'ᵥ' => 'v', + 'ᵦ' => 'β', + 'ᵧ' => 'γ', + 'ᵨ' => 'ρ', + 'ᵩ' => 'φ', + 'ᵪ' => 'χ', + 'ᵸ' => 'н', + 'ᶛ' => 'ɒ', + 'ᶜ' => 'c', + 'ᶝ' => 'ɕ', + 'ᶞ' => 'ð', + 'ᶟ' => 'ɜ', + 'ᶠ' => 'f', + 'ᶡ' => 'ɟ', + 'ᶢ' => 'ɡ', + 'ᶣ' => 'ɥ', + 'ᶤ' => 'ɨ', + 'ᶥ' => 'ɩ', + 'ᶦ' => 'ɪ', + 'ᶧ' => 'ᵻ', + 'ᶨ' => 'ʝ', + 'ᶩ' => 'ɭ', + 'ᶪ' => 'ᶅ', + 'ᶫ' => 'ʟ', + 'ᶬ' => 'ɱ', + 'ᶭ' => 'ɰ', + 'ᶮ' => 'ɲ', + 'ᶯ' => 'ɳ', + 'ᶰ' => 'ɴ', + 'ᶱ' => 'ɵ', + 'ᶲ' => 'ɸ', + 'ᶳ' => 'ʂ', + 'ᶴ' => 'ʃ', + 'ᶵ' => 'ƫ', + 'ᶶ' => 'ʉ', + 'ᶷ' => 'ʊ', + 'ᶸ' => 'ᴜ', + 'ᶹ' => 'ʋ', + 'ᶺ' => 'ʌ', + 'ᶻ' => 'z', + 'ᶼ' => 'ʐ', + 'ᶽ' => 'ʑ', + 'ᶾ' => 'ʒ', + 'ᶿ' => 'θ', + 'ẚ' => 'aʾ', + 'ẛ' => 'ṡ', + '᾽' => ' ̓', + '᾿' => ' ̓', + '῀' => ' ͂', + '῁' => ' ̈͂', + '῍' => ' ̓̀', + '῎' => ' ̓́', + '῏' => ' ̓͂', + '῝' => ' ̔̀', + '῞' => ' ̔́', + '῟' => ' ̔͂', + '῭' => ' ̈̀', + '΅' => ' ̈́', + '´' => ' ́', + '῾' => ' ̔', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + '‑' => '‐', + '‗' => ' ̳', + '․' => '.', + '‥' => '..', + '…' => '...', + ' ' => ' ', + '″' => '′′', + '‴' => '′′′', + '‶' => '‵‵', + '‷' => '‵‵‵', + '‼' => '!!', + '‾' => ' ̅', + '⁇' => '??', + '⁈' => '?!', + '⁉' => '!?', + '⁗' => '′′′′', + ' ' => ' ', + '⁰' => '0', + 'ⁱ' => 'i', + '⁴' => '4', + '⁵' => '5', + '⁶' => '6', + '⁷' => '7', + '⁸' => '8', + '⁹' => '9', + '⁺' => '+', + '⁻' => '−', + '⁼' => '=', + '⁽' => '(', + '⁾' => ')', + 'ⁿ' => 'n', + '₀' => '0', + '₁' => '1', + '₂' => '2', + '₃' => '3', + '₄' => '4', + '₅' => '5', + '₆' => '6', + '₇' => '7', + '₈' => '8', + '₉' => '9', + '₊' => '+', + '₋' => '−', + '₌' => '=', + '₍' => '(', + '₎' => ')', + 'ₐ' => 'a', + 'ₑ' => 'e', + 'ₒ' => 'o', + 'ₓ' => 'x', + 'ₔ' => 'ə', + 'ₕ' => 'h', + 'ₖ' => 'k', + 'ₗ' => 'l', + 'ₘ' => 'm', + 'ₙ' => 'n', + 'ₚ' => 'p', + 'ₛ' => 's', + 'ₜ' => 't', + '₨' => 'Rs', + '℀' => 'a/c', + '℁' => 'a/s', + 'ℂ' => 'C', + '℃' => '°C', + '℅' => 'c/o', + '℆' => 'c/u', + 'ℇ' => 'Ɛ', + '℉' => '°F', + 'ℊ' => 'g', + 'ℋ' => 'H', + 'ℌ' => 'H', + 'ℍ' => 'H', + 'ℎ' => 'h', + 'ℏ' => 'ħ', + 'ℐ' => 'I', + 'ℑ' => 'I', + 'ℒ' => 'L', + 'ℓ' => 'l', + 'ℕ' => 'N', + '№' => 'No', + 'ℙ' => 'P', + 'ℚ' => 'Q', + 'ℛ' => 'R', + 'ℜ' => 'R', + 'ℝ' => 'R', + '℠' => 'SM', + '℡' => 'TEL', + '™' => 'TM', + 'ℤ' => 'Z', + 'ℨ' => 'Z', + 'ℬ' => 'B', + 'ℭ' => 'C', + 'ℯ' => 'e', + 'ℰ' => 'E', + 'ℱ' => 'F', + 'ℳ' => 'M', + 'ℴ' => 'o', + 'ℵ' => 'א', + 'ℶ' => 'ב', + 'ℷ' => 'ג', + 'ℸ' => 'ד', + 'ℹ' => 'i', + '℻' => 'FAX', + 'ℼ' => 'π', + 'ℽ' => 'γ', + 'ℾ' => 'Γ', + 'ℿ' => 'Π', + '⅀' => '∑', + 'ⅅ' => 'D', + 'ⅆ' => 'd', + 'ⅇ' => 'e', + 'ⅈ' => 'i', + 'ⅉ' => 'j', + '⅐' => '1⁄7', + '⅑' => '1⁄9', + '⅒' => '1⁄10', + '⅓' => '1⁄3', + '⅔' => '2⁄3', + '⅕' => '1⁄5', + '⅖' => '2⁄5', + '⅗' => '3⁄5', + '⅘' => '4⁄5', + '⅙' => '1⁄6', + '⅚' => '5⁄6', + '⅛' => '1⁄8', + '⅜' => '3⁄8', + '⅝' => '5⁄8', + '⅞' => '7⁄8', + '⅟' => '1⁄', + 'Ⅰ' => 'I', + 'Ⅱ' => 'II', + 'Ⅲ' => 'III', + 'Ⅳ' => 'IV', + 'Ⅴ' => 'V', + 'Ⅵ' => 'VI', + 'Ⅶ' => 'VII', + 'Ⅷ' => 'VIII', + 'Ⅸ' => 'IX', + 'Ⅹ' => 'X', + 'Ⅺ' => 'XI', + 'Ⅻ' => 'XII', + 'Ⅼ' => 'L', + 'Ⅽ' => 'C', + 'Ⅾ' => 'D', + 'Ⅿ' => 'M', + 'ⅰ' => 'i', + 'ⅱ' => 'ii', + 'ⅲ' => 'iii', + 'ⅳ' => 'iv', + 'ⅴ' => 'v', + 'ⅵ' => 'vi', + 'ⅶ' => 'vii', + 'ⅷ' => 'viii', + 'ⅸ' => 'ix', + 'ⅹ' => 'x', + 'ⅺ' => 'xi', + 'ⅻ' => 'xii', + 'ⅼ' => 'l', + 'ⅽ' => 'c', + 'ⅾ' => 'd', + 'ⅿ' => 'm', + '↉' => '0⁄3', + '∬' => '∫∫', + '∭' => '∫∫∫', + '∯' => '∮∮', + '∰' => '∮∮∮', + '①' => '1', + '②' => '2', + '③' => '3', + '④' => '4', + '⑤' => '5', + '⑥' => '6', + '⑦' => '7', + '⑧' => '8', + '⑨' => '9', + '⑩' => '10', + '⑪' => '11', + '⑫' => '12', + '⑬' => '13', + '⑭' => '14', + '⑮' => '15', + '⑯' => '16', + '⑰' => '17', + '⑱' => '18', + '⑲' => '19', + '⑳' => '20', + '⑴' => '(1)', + '⑵' => '(2)', + '⑶' => '(3)', + '⑷' => '(4)', + '⑸' => '(5)', + '⑹' => '(6)', + '⑺' => '(7)', + '⑻' => '(8)', + '⑼' => '(9)', + '⑽' => '(10)', + '⑾' => '(11)', + '⑿' => '(12)', + '⒀' => '(13)', + '⒁' => '(14)', + '⒂' => '(15)', + '⒃' => '(16)', + '⒄' => '(17)', + '⒅' => '(18)', + '⒆' => '(19)', + '⒇' => '(20)', + '⒈' => '1.', + '⒉' => '2.', + '⒊' => '3.', + '⒋' => '4.', + '⒌' => '5.', + '⒍' => '6.', + '⒎' => '7.', + '⒏' => '8.', + '⒐' => '9.', + '⒑' => '10.', + '⒒' => '11.', + '⒓' => '12.', + '⒔' => '13.', + '⒕' => '14.', + '⒖' => '15.', + '⒗' => '16.', + '⒘' => '17.', + '⒙' => '18.', + '⒚' => '19.', + '⒛' => '20.', + '⒜' => '(a)', + '⒝' => '(b)', + '⒞' => '(c)', + '⒟' => '(d)', + '⒠' => '(e)', + '⒡' => '(f)', + '⒢' => '(g)', + '⒣' => '(h)', + '⒤' => '(i)', + '⒥' => '(j)', + '⒦' => '(k)', + '⒧' => '(l)', + '⒨' => '(m)', + '⒩' => '(n)', + '⒪' => '(o)', + '⒫' => '(p)', + '⒬' => '(q)', + '⒭' => '(r)', + '⒮' => '(s)', + '⒯' => '(t)', + '⒰' => '(u)', + '⒱' => '(v)', + '⒲' => '(w)', + '⒳' => '(x)', + '⒴' => '(y)', + '⒵' => '(z)', + 'Ⓐ' => 'A', + 'Ⓑ' => 'B', + 'Ⓒ' => 'C', + 'Ⓓ' => 'D', + 'Ⓔ' => 'E', + 'Ⓕ' => 'F', + 'Ⓖ' => 'G', + 'Ⓗ' => 'H', + 'Ⓘ' => 'I', + 'Ⓙ' => 'J', + 'Ⓚ' => 'K', + 'Ⓛ' => 'L', + 'Ⓜ' => 'M', + 'Ⓝ' => 'N', + 'Ⓞ' => 'O', + 'Ⓟ' => 'P', + 'Ⓠ' => 'Q', + 'Ⓡ' => 'R', + 'Ⓢ' => 'S', + 'Ⓣ' => 'T', + 'Ⓤ' => 'U', + 'Ⓥ' => 'V', + 'Ⓦ' => 'W', + 'Ⓧ' => 'X', + 'Ⓨ' => 'Y', + 'Ⓩ' => 'Z', + 'ⓐ' => 'a', + 'ⓑ' => 'b', + 'ⓒ' => 'c', + 'ⓓ' => 'd', + 'ⓔ' => 'e', + 'ⓕ' => 'f', + 'ⓖ' => 'g', + 'ⓗ' => 'h', + 'ⓘ' => 'i', + 'ⓙ' => 'j', + 'ⓚ' => 'k', + 'ⓛ' => 'l', + 'ⓜ' => 'm', + 'ⓝ' => 'n', + 'ⓞ' => 'o', + 'ⓟ' => 'p', + 'ⓠ' => 'q', + 'ⓡ' => 'r', + 'ⓢ' => 's', + 'ⓣ' => 't', + 'ⓤ' => 'u', + 'ⓥ' => 'v', + 'ⓦ' => 'w', + 'ⓧ' => 'x', + 'ⓨ' => 'y', + 'ⓩ' => 'z', + '⓪' => '0', + '⨌' => '∫∫∫∫', + '⩴' => '::=', + '⩵' => '==', + '⩶' => '===', + 'ⱼ' => 'j', + 'ⱽ' => 'V', + 'ⵯ' => 'ⵡ', + '⺟' => '母', + '⻳' => '龟', + '⼀' => '一', + '⼁' => '丨', + '⼂' => '丶', + '⼃' => '丿', + '⼄' => '乙', + '⼅' => '亅', + '⼆' => '二', + '⼇' => '亠', + '⼈' => '人', + '⼉' => '儿', + '⼊' => '入', + '⼋' => '八', + '⼌' => '冂', + '⼍' => '冖', + '⼎' => '冫', + '⼏' => '几', + '⼐' => '凵', + '⼑' => '刀', + '⼒' => '力', + '⼓' => '勹', + '⼔' => '匕', + '⼕' => '匚', + '⼖' => '匸', + '⼗' => '十', + '⼘' => '卜', + '⼙' => '卩', + '⼚' => '厂', + '⼛' => '厶', + '⼜' => '又', + '⼝' => '口', + '⼞' => '囗', + '⼟' => '土', + '⼠' => '士', + '⼡' => '夂', + '⼢' => '夊', + '⼣' => '夕', + '⼤' => '大', + '⼥' => '女', + '⼦' => '子', + '⼧' => '宀', + '⼨' => '寸', + '⼩' => '小', + '⼪' => '尢', + '⼫' => '尸', + '⼬' => '屮', + '⼭' => '山', + '⼮' => '巛', + '⼯' => '工', + '⼰' => '己', + '⼱' => '巾', + '⼲' => '干', + '⼳' => '幺', + '⼴' => '广', + '⼵' => '廴', + '⼶' => '廾', + '⼷' => '弋', + '⼸' => '弓', + '⼹' => '彐', + '⼺' => '彡', + '⼻' => '彳', + '⼼' => '心', + '⼽' => '戈', + '⼾' => '戶', + '⼿' => '手', + '⽀' => '支', + '⽁' => '攴', + '⽂' => '文', + '⽃' => '斗', + '⽄' => '斤', + '⽅' => '方', + '⽆' => '无', + '⽇' => '日', + '⽈' => '曰', + '⽉' => '月', + '⽊' => '木', + '⽋' => '欠', + '⽌' => '止', + '⽍' => '歹', + '⽎' => '殳', + '⽏' => '毋', + '⽐' => '比', + '⽑' => '毛', + '⽒' => '氏', + '⽓' => '气', + '⽔' => '水', + '⽕' => '火', + '⽖' => '爪', + '⽗' => '父', + '⽘' => '爻', + '⽙' => '爿', + '⽚' => '片', + '⽛' => '牙', + '⽜' => '牛', + '⽝' => '犬', + '⽞' => '玄', + '⽟' => '玉', + '⽠' => '瓜', + '⽡' => '瓦', + '⽢' => '甘', + '⽣' => '生', + '⽤' => '用', + '⽥' => '田', + '⽦' => '疋', + '⽧' => '疒', + '⽨' => '癶', + '⽩' => '白', + '⽪' => '皮', + '⽫' => '皿', + '⽬' => '目', + '⽭' => '矛', + '⽮' => '矢', + '⽯' => '石', + '⽰' => '示', + '⽱' => '禸', + '⽲' => '禾', + '⽳' => '穴', + '⽴' => '立', + '⽵' => '竹', + '⽶' => '米', + '⽷' => '糸', + '⽸' => '缶', + '⽹' => '网', + '⽺' => '羊', + '⽻' => '羽', + '⽼' => '老', + '⽽' => '而', + '⽾' => '耒', + '⽿' => '耳', + '⾀' => '聿', + '⾁' => '肉', + '⾂' => '臣', + '⾃' => '自', + '⾄' => '至', + '⾅' => '臼', + '⾆' => '舌', + '⾇' => '舛', + '⾈' => '舟', + '⾉' => '艮', + '⾊' => '色', + '⾋' => '艸', + '⾌' => '虍', + '⾍' => '虫', + '⾎' => '血', + '⾏' => '行', + '⾐' => '衣', + '⾑' => '襾', + '⾒' => '見', + '⾓' => '角', + '⾔' => '言', + '⾕' => '谷', + '⾖' => '豆', + '⾗' => '豕', + '⾘' => '豸', + '⾙' => '貝', + '⾚' => '赤', + '⾛' => '走', + '⾜' => '足', + '⾝' => '身', + '⾞' => '車', + '⾟' => '辛', + '⾠' => '辰', + '⾡' => '辵', + '⾢' => '邑', + '⾣' => '酉', + '⾤' => '釆', + '⾥' => '里', + '⾦' => '金', + '⾧' => '長', + '⾨' => '門', + '⾩' => '阜', + '⾪' => '隶', + '⾫' => '隹', + '⾬' => '雨', + '⾭' => '靑', + '⾮' => '非', + '⾯' => '面', + '⾰' => '革', + '⾱' => '韋', + '⾲' => '韭', + '⾳' => '音', + '⾴' => '頁', + '⾵' => '風', + '⾶' => '飛', + '⾷' => '食', + '⾸' => '首', + '⾹' => '香', + '⾺' => '馬', + '⾻' => '骨', + '⾼' => '高', + '⾽' => '髟', + '⾾' => '鬥', + '⾿' => '鬯', + '⿀' => '鬲', + '⿁' => '鬼', + '⿂' => '魚', + '⿃' => '鳥', + '⿄' => '鹵', + '⿅' => '鹿', + '⿆' => '麥', + '⿇' => '麻', + '⿈' => '黃', + '⿉' => '黍', + '⿊' => '黑', + '⿋' => '黹', + '⿌' => '黽', + '⿍' => '鼎', + '⿎' => '鼓', + '⿏' => '鼠', + '⿐' => '鼻', + '⿑' => '齊', + '⿒' => '齒', + '⿓' => '龍', + '⿔' => '龜', + '⿕' => '龠', + ' ' => ' ', + '〶' => '〒', + '〸' => '十', + '〹' => '卄', + '〺' => '卅', + '゛' => ' ゙', + '゜' => ' ゚', + 'ゟ' => 'より', + 'ヿ' => 'コト', + 'ㄱ' => 'ᄀ', + 'ㄲ' => 'ᄁ', + 'ㄳ' => 'ᆪ', + 'ㄴ' => 'ᄂ', + 'ㄵ' => 'ᆬ', + 'ㄶ' => 'ᆭ', + 'ㄷ' => 'ᄃ', + 'ㄸ' => 'ᄄ', + 'ㄹ' => 'ᄅ', + 'ㄺ' => 'ᆰ', + 'ㄻ' => 'ᆱ', + 'ㄼ' => 'ᆲ', + 'ㄽ' => 'ᆳ', + 'ㄾ' => 'ᆴ', + 'ㄿ' => 'ᆵ', + 'ㅀ' => 'ᄚ', + 'ㅁ' => 'ᄆ', + 'ㅂ' => 'ᄇ', + 'ㅃ' => 'ᄈ', + 'ㅄ' => 'ᄡ', + 'ㅅ' => 'ᄉ', + 'ㅆ' => 'ᄊ', + 'ㅇ' => 'ᄋ', + 'ㅈ' => 'ᄌ', + 'ㅉ' => 'ᄍ', + 'ㅊ' => 'ᄎ', + 'ㅋ' => 'ᄏ', + 'ㅌ' => 'ᄐ', + 'ㅍ' => 'ᄑ', + 'ㅎ' => 'ᄒ', + 'ㅏ' => 'ᅡ', + 'ㅐ' => 'ᅢ', + 'ㅑ' => 'ᅣ', + 'ㅒ' => 'ᅤ', + 'ㅓ' => 'ᅥ', + 'ㅔ' => 'ᅦ', + 'ㅕ' => 'ᅧ', + 'ㅖ' => 'ᅨ', + 'ㅗ' => 'ᅩ', + 'ㅘ' => 'ᅪ', + 'ㅙ' => 'ᅫ', + 'ㅚ' => 'ᅬ', + 'ㅛ' => 'ᅭ', + 'ㅜ' => 'ᅮ', + 'ㅝ' => 'ᅯ', + 'ㅞ' => 'ᅰ', + 'ㅟ' => 'ᅱ', + 'ㅠ' => 'ᅲ', + 'ㅡ' => 'ᅳ', + 'ㅢ' => 'ᅴ', + 'ㅣ' => 'ᅵ', + 'ㅤ' => 'ᅠ', + 'ㅥ' => 'ᄔ', + 'ㅦ' => 'ᄕ', + 'ㅧ' => 'ᇇ', + 'ㅨ' => 'ᇈ', + 'ㅩ' => 'ᇌ', + 'ㅪ' => 'ᇎ', + 'ㅫ' => 'ᇓ', + 'ㅬ' => 'ᇗ', + 'ㅭ' => 'ᇙ', + 'ㅮ' => 'ᄜ', + 'ㅯ' => 'ᇝ', + 'ㅰ' => 'ᇟ', + 'ㅱ' => 'ᄝ', + 'ㅲ' => 'ᄞ', + 'ㅳ' => 'ᄠ', + 'ㅴ' => 'ᄢ', + 'ㅵ' => 'ᄣ', + 'ㅶ' => 'ᄧ', + 'ㅷ' => 'ᄩ', + 'ㅸ' => 'ᄫ', + 'ㅹ' => 'ᄬ', + 'ㅺ' => 'ᄭ', + 'ㅻ' => 'ᄮ', + 'ㅼ' => 'ᄯ', + 'ㅽ' => 'ᄲ', + 'ㅾ' => 'ᄶ', + 'ㅿ' => 'ᅀ', + 'ㆀ' => 'ᅇ', + 'ㆁ' => 'ᅌ', + 'ㆂ' => 'ᇱ', + 'ㆃ' => 'ᇲ', + 'ㆄ' => 'ᅗ', + 'ㆅ' => 'ᅘ', + 'ㆆ' => 'ᅙ', + 'ㆇ' => 'ᆄ', + 'ㆈ' => 'ᆅ', + 'ㆉ' => 'ᆈ', + 'ㆊ' => 'ᆑ', + 'ㆋ' => 'ᆒ', + 'ㆌ' => 'ᆔ', + 'ㆍ' => 'ᆞ', + 'ㆎ' => 'ᆡ', + '㆒' => '一', + '㆓' => '二', + '㆔' => '三', + '㆕' => '四', + '㆖' => '上', + '㆗' => '中', + '㆘' => '下', + '㆙' => '甲', + '㆚' => '乙', + '㆛' => '丙', + '㆜' => '丁', + '㆝' => '天', + '㆞' => '地', + '㆟' => '人', + '㈀' => '(ᄀ)', + '㈁' => '(ᄂ)', + '㈂' => '(ᄃ)', + '㈃' => '(ᄅ)', + '㈄' => '(ᄆ)', + '㈅' => '(ᄇ)', + '㈆' => '(ᄉ)', + '㈇' => '(ᄋ)', + '㈈' => '(ᄌ)', + '㈉' => '(ᄎ)', + '㈊' => '(ᄏ)', + '㈋' => '(ᄐ)', + '㈌' => '(ᄑ)', + '㈍' => '(ᄒ)', + '㈎' => '(가)', + '㈏' => '(나)', + '㈐' => '(다)', + '㈑' => '(라)', + '㈒' => '(마)', + '㈓' => '(바)', + '㈔' => '(사)', + '㈕' => '(아)', + '㈖' => '(자)', + '㈗' => '(차)', + '㈘' => '(카)', + '㈙' => '(타)', + '㈚' => '(파)', + '㈛' => '(하)', + '㈜' => '(주)', + '㈝' => '(오전)', + '㈞' => '(오후)', + '㈠' => '(一)', + '㈡' => '(二)', + '㈢' => '(三)', + '㈣' => '(四)', + '㈤' => '(五)', + '㈥' => '(六)', + '㈦' => '(七)', + '㈧' => '(八)', + '㈨' => '(九)', + '㈩' => '(十)', + '㈪' => '(月)', + '㈫' => '(火)', + '㈬' => '(水)', + '㈭' => '(木)', + '㈮' => '(金)', + '㈯' => '(土)', + '㈰' => '(日)', + '㈱' => '(株)', + '㈲' => '(有)', + '㈳' => '(社)', + '㈴' => '(名)', + '㈵' => '(特)', + '㈶' => '(財)', + '㈷' => '(祝)', + '㈸' => '(労)', + '㈹' => '(代)', + '㈺' => '(呼)', + '㈻' => '(学)', + '㈼' => '(監)', + '㈽' => '(企)', + '㈾' => '(資)', + '㈿' => '(協)', + '㉀' => '(祭)', + '㉁' => '(休)', + '㉂' => '(自)', + '㉃' => '(至)', + '㉄' => '問', + '㉅' => '幼', + '㉆' => '文', + '㉇' => '箏', + '㉐' => 'PTE', + '㉑' => '21', + '㉒' => '22', + '㉓' => '23', + '㉔' => '24', + '㉕' => '25', + '㉖' => '26', + '㉗' => '27', + '㉘' => '28', + '㉙' => '29', + '㉚' => '30', + '㉛' => '31', + '㉜' => '32', + '㉝' => '33', + '㉞' => '34', + '㉟' => '35', + '㉠' => 'ᄀ', + '㉡' => 'ᄂ', + '㉢' => 'ᄃ', + '㉣' => 'ᄅ', + '㉤' => 'ᄆ', + '㉥' => 'ᄇ', + '㉦' => 'ᄉ', + '㉧' => 'ᄋ', + '㉨' => 'ᄌ', + '㉩' => 'ᄎ', + '㉪' => 'ᄏ', + '㉫' => 'ᄐ', + '㉬' => 'ᄑ', + '㉭' => 'ᄒ', + '㉮' => '가', + '㉯' => '나', + '㉰' => '다', + '㉱' => '라', + '㉲' => '마', + '㉳' => '바', + '㉴' => '사', + '㉵' => '아', + '㉶' => '자', + '㉷' => '차', + '㉸' => '카', + '㉹' => '타', + '㉺' => '파', + '㉻' => '하', + '㉼' => '참고', + '㉽' => '주의', + '㉾' => '우', + '㊀' => '一', + '㊁' => '二', + '㊂' => '三', + '㊃' => '四', + '㊄' => '五', + '㊅' => '六', + '㊆' => '七', + '㊇' => '八', + '㊈' => '九', + '㊉' => '十', + '㊊' => '月', + '㊋' => '火', + '㊌' => '水', + '㊍' => '木', + '㊎' => '金', + '㊏' => '土', + '㊐' => '日', + '㊑' => '株', + '㊒' => '有', + '㊓' => '社', + '㊔' => '名', + '㊕' => '特', + '㊖' => '財', + '㊗' => '祝', + '㊘' => '労', + '㊙' => '秘', + '㊚' => '男', + '㊛' => '女', + '㊜' => '適', + '㊝' => '優', + '㊞' => '印', + '㊟' => '注', + '㊠' => '項', + '㊡' => '休', + '㊢' => '写', + '㊣' => '正', + '㊤' => '上', + '㊥' => '中', + '㊦' => '下', + '㊧' => '左', + '㊨' => '右', + '㊩' => '医', + '㊪' => '宗', + '㊫' => '学', + '㊬' => '監', + '㊭' => '企', + '㊮' => '資', + '㊯' => '協', + '㊰' => '夜', + '㊱' => '36', + '㊲' => '37', + '㊳' => '38', + '㊴' => '39', + '㊵' => '40', + '㊶' => '41', + '㊷' => '42', + '㊸' => '43', + '㊹' => '44', + '㊺' => '45', + '㊻' => '46', + '㊼' => '47', + '㊽' => '48', + '㊾' => '49', + '㊿' => '50', + '㋀' => '1月', + '㋁' => '2月', + '㋂' => '3月', + '㋃' => '4月', + '㋄' => '5月', + '㋅' => '6月', + '㋆' => '7月', + '㋇' => '8月', + '㋈' => '9月', + '㋉' => '10月', + '㋊' => '11月', + '㋋' => '12月', + '㋌' => 'Hg', + '㋍' => 'erg', + '㋎' => 'eV', + '㋏' => 'LTD', + '㋐' => 'ア', + '㋑' => 'イ', + '㋒' => 'ウ', + '㋓' => 'エ', + '㋔' => 'オ', + '㋕' => 'カ', + '㋖' => 'キ', + '㋗' => 'ク', + '㋘' => 'ケ', + '㋙' => 'コ', + '㋚' => 'サ', + '㋛' => 'シ', + '㋜' => 'ス', + '㋝' => 'セ', + '㋞' => 'ソ', + '㋟' => 'タ', + '㋠' => 'チ', + '㋡' => 'ツ', + '㋢' => 'テ', + '㋣' => 'ト', + '㋤' => 'ナ', + '㋥' => 'ニ', + '㋦' => 'ヌ', + '㋧' => 'ネ', + '㋨' => 'ノ', + '㋩' => 'ハ', + '㋪' => 'ヒ', + '㋫' => 'フ', + '㋬' => 'ヘ', + '㋭' => 'ホ', + '㋮' => 'マ', + '㋯' => 'ミ', + '㋰' => 'ム', + '㋱' => 'メ', + '㋲' => 'モ', + '㋳' => 'ヤ', + '㋴' => 'ユ', + '㋵' => 'ヨ', + '㋶' => 'ラ', + '㋷' => 'リ', + '㋸' => 'ル', + '㋹' => 'レ', + '㋺' => 'ロ', + '㋻' => 'ワ', + '㋼' => 'ヰ', + '㋽' => 'ヱ', + '㋾' => 'ヲ', + '㋿' => '令和', + '㌀' => 'アパート', + '㌁' => 'アルファ', + '㌂' => 'アンペア', + '㌃' => 'アール', + '㌄' => 'イニング', + '㌅' => 'インチ', + '㌆' => 'ウォン', + '㌇' => 'エスクード', + '㌈' => 'エーカー', + '㌉' => 'オンス', + '㌊' => 'オーム', + '㌋' => 'カイリ', + '㌌' => 'カラット', + '㌍' => 'カロリー', + '㌎' => 'ガロン', + '㌏' => 'ガンマ', + '㌐' => 'ギガ', + '㌑' => 'ギニー', + '㌒' => 'キュリー', + '㌓' => 'ギルダー', + '㌔' => 'キロ', + '㌕' => 'キログラム', + '㌖' => 'キロメートル', + '㌗' => 'キロワット', + '㌘' => 'グラム', + '㌙' => 'グラムトン', + '㌚' => 'クルゼイロ', + '㌛' => 'クローネ', + '㌜' => 'ケース', + '㌝' => 'コルナ', + '㌞' => 'コーポ', + '㌟' => 'サイクル', + '㌠' => 'サンチーム', + '㌡' => 'シリング', + '㌢' => 'センチ', + '㌣' => 'セント', + '㌤' => 'ダース', + '㌥' => 'デシ', + '㌦' => 'ドル', + '㌧' => 'トン', + '㌨' => 'ナノ', + '㌩' => 'ノット', + '㌪' => 'ハイツ', + '㌫' => 'パーセント', + '㌬' => 'パーツ', + '㌭' => 'バーレル', + '㌮' => 'ピアストル', + '㌯' => 'ピクル', + '㌰' => 'ピコ', + '㌱' => 'ビル', + '㌲' => 'ファラッド', + '㌳' => 'フィート', + '㌴' => 'ブッシェル', + '㌵' => 'フラン', + '㌶' => 'ヘクタール', + '㌷' => 'ペソ', + '㌸' => 'ペニヒ', + '㌹' => 'ヘルツ', + '㌺' => 'ペンス', + '㌻' => 'ページ', + '㌼' => 'ベータ', + '㌽' => 'ポイント', + '㌾' => 'ボルト', + '㌿' => 'ホン', + '㍀' => 'ポンド', + '㍁' => 'ホール', + '㍂' => 'ホーン', + '㍃' => 'マイクロ', + '㍄' => 'マイル', + '㍅' => 'マッハ', + '㍆' => 'マルク', + '㍇' => 'マンション', + '㍈' => 'ミクロン', + '㍉' => 'ミリ', + '㍊' => 'ミリバール', + '㍋' => 'メガ', + '㍌' => 'メガトン', + '㍍' => 'メートル', + '㍎' => 'ヤード', + '㍏' => 'ヤール', + '㍐' => 'ユアン', + '㍑' => 'リットル', + '㍒' => 'リラ', + '㍓' => 'ルピー', + '㍔' => 'ルーブル', + '㍕' => 'レム', + '㍖' => 'レントゲン', + '㍗' => 'ワット', + '㍘' => '0点', + '㍙' => '1点', + '㍚' => '2点', + '㍛' => '3点', + '㍜' => '4点', + '㍝' => '5点', + '㍞' => '6点', + '㍟' => '7点', + '㍠' => '8点', + '㍡' => '9点', + '㍢' => '10点', + '㍣' => '11点', + '㍤' => '12点', + '㍥' => '13点', + '㍦' => '14点', + '㍧' => '15点', + '㍨' => '16点', + '㍩' => '17点', + '㍪' => '18点', + '㍫' => '19点', + '㍬' => '20点', + '㍭' => '21点', + '㍮' => '22点', + '㍯' => '23点', + '㍰' => '24点', + '㍱' => 'hPa', + '㍲' => 'da', + '㍳' => 'AU', + '㍴' => 'bar', + '㍵' => 'oV', + '㍶' => 'pc', + '㍷' => 'dm', + '㍸' => 'dm2', + '㍹' => 'dm3', + '㍺' => 'IU', + '㍻' => '平成', + '㍼' => '昭和', + '㍽' => '大正', + '㍾' => '明治', + '㍿' => '株式会社', + '㎀' => 'pA', + '㎁' => 'nA', + '㎂' => 'μA', + '㎃' => 'mA', + '㎄' => 'kA', + '㎅' => 'KB', + '㎆' => 'MB', + '㎇' => 'GB', + '㎈' => 'cal', + '㎉' => 'kcal', + '㎊' => 'pF', + '㎋' => 'nF', + '㎌' => 'μF', + '㎍' => 'μg', + '㎎' => 'mg', + '㎏' => 'kg', + '㎐' => 'Hz', + '㎑' => 'kHz', + '㎒' => 'MHz', + '㎓' => 'GHz', + '㎔' => 'THz', + '㎕' => 'μl', + '㎖' => 'ml', + '㎗' => 'dl', + '㎘' => 'kl', + '㎙' => 'fm', + '㎚' => 'nm', + '㎛' => 'μm', + '㎜' => 'mm', + '㎝' => 'cm', + '㎞' => 'km', + '㎟' => 'mm2', + '㎠' => 'cm2', + '㎡' => 'm2', + '㎢' => 'km2', + '㎣' => 'mm3', + '㎤' => 'cm3', + '㎥' => 'm3', + '㎦' => 'km3', + '㎧' => 'm∕s', + '㎨' => 'm∕s2', + '㎩' => 'Pa', + '㎪' => 'kPa', + '㎫' => 'MPa', + '㎬' => 'GPa', + '㎭' => 'rad', + '㎮' => 'rad∕s', + '㎯' => 'rad∕s2', + '㎰' => 'ps', + '㎱' => 'ns', + '㎲' => 'μs', + '㎳' => 'ms', + '㎴' => 'pV', + '㎵' => 'nV', + '㎶' => 'μV', + '㎷' => 'mV', + '㎸' => 'kV', + '㎹' => 'MV', + '㎺' => 'pW', + '㎻' => 'nW', + '㎼' => 'μW', + '㎽' => 'mW', + '㎾' => 'kW', + '㎿' => 'MW', + '㏀' => 'kΩ', + '㏁' => 'MΩ', + '㏂' => 'a.m.', + '㏃' => 'Bq', + '㏄' => 'cc', + '㏅' => 'cd', + '㏆' => 'C∕kg', + '㏇' => 'Co.', + '㏈' => 'dB', + '㏉' => 'Gy', + '㏊' => 'ha', + '㏋' => 'HP', + '㏌' => 'in', + '㏍' => 'KK', + '㏎' => 'KM', + '㏏' => 'kt', + '㏐' => 'lm', + '㏑' => 'ln', + '㏒' => 'log', + '㏓' => 'lx', + '㏔' => 'mb', + '㏕' => 'mil', + '㏖' => 'mol', + '㏗' => 'PH', + '㏘' => 'p.m.', + '㏙' => 'PPM', + '㏚' => 'PR', + '㏛' => 'sr', + '㏜' => 'Sv', + '㏝' => 'Wb', + '㏞' => 'V∕m', + '㏟' => 'A∕m', + '㏠' => '1日', + '㏡' => '2日', + '㏢' => '3日', + '㏣' => '4日', + '㏤' => '5日', + '㏥' => '6日', + '㏦' => '7日', + '㏧' => '8日', + '㏨' => '9日', + '㏩' => '10日', + '㏪' => '11日', + '㏫' => '12日', + '㏬' => '13日', + '㏭' => '14日', + '㏮' => '15日', + '㏯' => '16日', + '㏰' => '17日', + '㏱' => '18日', + '㏲' => '19日', + '㏳' => '20日', + '㏴' => '21日', + '㏵' => '22日', + '㏶' => '23日', + '㏷' => '24日', + '㏸' => '25日', + '㏹' => '26日', + '㏺' => '27日', + '㏻' => '28日', + '㏼' => '29日', + '㏽' => '30日', + '㏾' => '31日', + '㏿' => 'gal', + 'ꚜ' => 'ъ', + 'ꚝ' => 'ь', + 'ꝰ' => 'ꝯ', + 'ꟸ' => 'Ħ', + 'ꟹ' => 'œ', + 'ꭜ' => 'ꜧ', + 'ꭝ' => 'ꬷ', + 'ꭞ' => 'ɫ', + 'ꭟ' => 'ꭒ', + 'ꭩ' => 'ʍ', + 'ff' => 'ff', + 'fi' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'st', + 'st' => 'st', + 'ﬓ' => 'մն', + 'ﬔ' => 'մե', + 'ﬕ' => 'մի', + 'ﬖ' => 'վն', + 'ﬗ' => 'մխ', + 'ﬠ' => 'ע', + 'ﬡ' => 'א', + 'ﬢ' => 'ד', + 'ﬣ' => 'ה', + 'ﬤ' => 'כ', + 'ﬥ' => 'ל', + 'ﬦ' => 'ם', + 'ﬧ' => 'ר', + 'ﬨ' => 'ת', + '﬩' => '+', + 'ﭏ' => 'אל', + 'ﭐ' => 'ٱ', + 'ﭑ' => 'ٱ', + 'ﭒ' => 'ٻ', + 'ﭓ' => 'ٻ', + 'ﭔ' => 'ٻ', + 'ﭕ' => 'ٻ', + 'ﭖ' => 'پ', + 'ﭗ' => 'پ', + 'ﭘ' => 'پ', + 'ﭙ' => 'پ', + 'ﭚ' => 'ڀ', + 'ﭛ' => 'ڀ', + 'ﭜ' => 'ڀ', + 'ﭝ' => 'ڀ', + 'ﭞ' => 'ٺ', + 'ﭟ' => 'ٺ', + 'ﭠ' => 'ٺ', + 'ﭡ' => 'ٺ', + 'ﭢ' => 'ٿ', + 'ﭣ' => 'ٿ', + 'ﭤ' => 'ٿ', + 'ﭥ' => 'ٿ', + 'ﭦ' => 'ٹ', + 'ﭧ' => 'ٹ', + 'ﭨ' => 'ٹ', + 'ﭩ' => 'ٹ', + 'ﭪ' => 'ڤ', + 'ﭫ' => 'ڤ', + 'ﭬ' => 'ڤ', + 'ﭭ' => 'ڤ', + 'ﭮ' => 'ڦ', + 'ﭯ' => 'ڦ', + 'ﭰ' => 'ڦ', + 'ﭱ' => 'ڦ', + 'ﭲ' => 'ڄ', + 'ﭳ' => 'ڄ', + 'ﭴ' => 'ڄ', + 'ﭵ' => 'ڄ', + 'ﭶ' => 'ڃ', + 'ﭷ' => 'ڃ', + 'ﭸ' => 'ڃ', + 'ﭹ' => 'ڃ', + 'ﭺ' => 'چ', + 'ﭻ' => 'چ', + 'ﭼ' => 'چ', + 'ﭽ' => 'چ', + 'ﭾ' => 'ڇ', + 'ﭿ' => 'ڇ', + 'ﮀ' => 'ڇ', + 'ﮁ' => 'ڇ', + 'ﮂ' => 'ڍ', + 'ﮃ' => 'ڍ', + 'ﮄ' => 'ڌ', + 'ﮅ' => 'ڌ', + 'ﮆ' => 'ڎ', + 'ﮇ' => 'ڎ', + 'ﮈ' => 'ڈ', + 'ﮉ' => 'ڈ', + 'ﮊ' => 'ژ', + 'ﮋ' => 'ژ', + 'ﮌ' => 'ڑ', + 'ﮍ' => 'ڑ', + 'ﮎ' => 'ک', + 'ﮏ' => 'ک', + 'ﮐ' => 'ک', + 'ﮑ' => 'ک', + 'ﮒ' => 'گ', + 'ﮓ' => 'گ', + 'ﮔ' => 'گ', + 'ﮕ' => 'گ', + 'ﮖ' => 'ڳ', + 'ﮗ' => 'ڳ', + 'ﮘ' => 'ڳ', + 'ﮙ' => 'ڳ', + 'ﮚ' => 'ڱ', + 'ﮛ' => 'ڱ', + 'ﮜ' => 'ڱ', + 'ﮝ' => 'ڱ', + 'ﮞ' => 'ں', + 'ﮟ' => 'ں', + 'ﮠ' => 'ڻ', + 'ﮡ' => 'ڻ', + 'ﮢ' => 'ڻ', + 'ﮣ' => 'ڻ', + 'ﮤ' => 'ۀ', + 'ﮥ' => 'ۀ', + 'ﮦ' => 'ہ', + 'ﮧ' => 'ہ', + 'ﮨ' => 'ہ', + 'ﮩ' => 'ہ', + 'ﮪ' => 'ھ', + 'ﮫ' => 'ھ', + 'ﮬ' => 'ھ', + 'ﮭ' => 'ھ', + 'ﮮ' => 'ے', + 'ﮯ' => 'ے', + 'ﮰ' => 'ۓ', + 'ﮱ' => 'ۓ', + 'ﯓ' => 'ڭ', + 'ﯔ' => 'ڭ', + 'ﯕ' => 'ڭ', + 'ﯖ' => 'ڭ', + 'ﯗ' => 'ۇ', + 'ﯘ' => 'ۇ', + 'ﯙ' => 'ۆ', + 'ﯚ' => 'ۆ', + 'ﯛ' => 'ۈ', + 'ﯜ' => 'ۈ', + 'ﯝ' => 'ۇٴ', + 'ﯞ' => 'ۋ', + 'ﯟ' => 'ۋ', + 'ﯠ' => 'ۅ', + 'ﯡ' => 'ۅ', + 'ﯢ' => 'ۉ', + 'ﯣ' => 'ۉ', + 'ﯤ' => 'ې', + 'ﯥ' => 'ې', + 'ﯦ' => 'ې', + 'ﯧ' => 'ې', + 'ﯨ' => 'ى', + 'ﯩ' => 'ى', + 'ﯪ' => 'ئا', + 'ﯫ' => 'ئا', + 'ﯬ' => 'ئە', + 'ﯭ' => 'ئە', + 'ﯮ' => 'ئو', + 'ﯯ' => 'ئو', + 'ﯰ' => 'ئۇ', + 'ﯱ' => 'ئۇ', + 'ﯲ' => 'ئۆ', + 'ﯳ' => 'ئۆ', + 'ﯴ' => 'ئۈ', + 'ﯵ' => 'ئۈ', + 'ﯶ' => 'ئې', + 'ﯷ' => 'ئې', + 'ﯸ' => 'ئې', + 'ﯹ' => 'ئى', + 'ﯺ' => 'ئى', + 'ﯻ' => 'ئى', + 'ﯼ' => 'ی', + 'ﯽ' => 'ی', + 'ﯾ' => 'ی', + 'ﯿ' => 'ی', + 'ﰀ' => 'ئج', + 'ﰁ' => 'ئح', + 'ﰂ' => 'ئم', + 'ﰃ' => 'ئى', + 'ﰄ' => 'ئي', + 'ﰅ' => 'بج', + 'ﰆ' => 'بح', + 'ﰇ' => 'بخ', + 'ﰈ' => 'بم', + 'ﰉ' => 'بى', + 'ﰊ' => 'بي', + 'ﰋ' => 'تج', + 'ﰌ' => 'تح', + 'ﰍ' => 'تخ', + 'ﰎ' => 'تم', + 'ﰏ' => 'تى', + 'ﰐ' => 'تي', + 'ﰑ' => 'ثج', + 'ﰒ' => 'ثم', + 'ﰓ' => 'ثى', + 'ﰔ' => 'ثي', + 'ﰕ' => 'جح', + 'ﰖ' => 'جم', + 'ﰗ' => 'حج', + 'ﰘ' => 'حم', + 'ﰙ' => 'خج', + 'ﰚ' => 'خح', + 'ﰛ' => 'خم', + 'ﰜ' => 'سج', + 'ﰝ' => 'سح', + 'ﰞ' => 'سخ', + 'ﰟ' => 'سم', + 'ﰠ' => 'صح', + 'ﰡ' => 'صم', + 'ﰢ' => 'ضج', + 'ﰣ' => 'ضح', + 'ﰤ' => 'ضخ', + 'ﰥ' => 'ضم', + 'ﰦ' => 'طح', + 'ﰧ' => 'طم', + 'ﰨ' => 'ظم', + 'ﰩ' => 'عج', + 'ﰪ' => 'عم', + 'ﰫ' => 'غج', + 'ﰬ' => 'غم', + 'ﰭ' => 'فج', + 'ﰮ' => 'فح', + 'ﰯ' => 'فخ', + 'ﰰ' => 'فم', + 'ﰱ' => 'فى', + 'ﰲ' => 'في', + 'ﰳ' => 'قح', + 'ﰴ' => 'قم', + 'ﰵ' => 'قى', + 'ﰶ' => 'قي', + 'ﰷ' => 'كا', + 'ﰸ' => 'كج', + 'ﰹ' => 'كح', + 'ﰺ' => 'كخ', + 'ﰻ' => 'كل', + 'ﰼ' => 'كم', + 'ﰽ' => 'كى', + 'ﰾ' => 'كي', + 'ﰿ' => 'لج', + 'ﱀ' => 'لح', + 'ﱁ' => 'لخ', + 'ﱂ' => 'لم', + 'ﱃ' => 'لى', + 'ﱄ' => 'لي', + 'ﱅ' => 'مج', + 'ﱆ' => 'مح', + 'ﱇ' => 'مخ', + 'ﱈ' => 'مم', + 'ﱉ' => 'مى', + 'ﱊ' => 'مي', + 'ﱋ' => 'نج', + 'ﱌ' => 'نح', + 'ﱍ' => 'نخ', + 'ﱎ' => 'نم', + 'ﱏ' => 'نى', + 'ﱐ' => 'ني', + 'ﱑ' => 'هج', + 'ﱒ' => 'هم', + 'ﱓ' => 'هى', + 'ﱔ' => 'هي', + 'ﱕ' => 'يج', + 'ﱖ' => 'يح', + 'ﱗ' => 'يخ', + 'ﱘ' => 'يم', + 'ﱙ' => 'يى', + 'ﱚ' => 'يي', + 'ﱛ' => 'ذٰ', + 'ﱜ' => 'رٰ', + 'ﱝ' => 'ىٰ', + 'ﱞ' => ' ٌّ', + 'ﱟ' => ' ٍّ', + 'ﱠ' => ' َّ', + 'ﱡ' => ' ُّ', + 'ﱢ' => ' ِّ', + 'ﱣ' => ' ّٰ', + 'ﱤ' => 'ئر', + 'ﱥ' => 'ئز', + 'ﱦ' => 'ئم', + 'ﱧ' => 'ئن', + 'ﱨ' => 'ئى', + 'ﱩ' => 'ئي', + 'ﱪ' => 'بر', + 'ﱫ' => 'بز', + 'ﱬ' => 'بم', + 'ﱭ' => 'بن', + 'ﱮ' => 'بى', + 'ﱯ' => 'بي', + 'ﱰ' => 'تر', + 'ﱱ' => 'تز', + 'ﱲ' => 'تم', + 'ﱳ' => 'تن', + 'ﱴ' => 'تى', + 'ﱵ' => 'تي', + 'ﱶ' => 'ثر', + 'ﱷ' => 'ثز', + 'ﱸ' => 'ثم', + 'ﱹ' => 'ثن', + 'ﱺ' => 'ثى', + 'ﱻ' => 'ثي', + 'ﱼ' => 'فى', + 'ﱽ' => 'في', + 'ﱾ' => 'قى', + 'ﱿ' => 'قي', + 'ﲀ' => 'كا', + 'ﲁ' => 'كل', + 'ﲂ' => 'كم', + 'ﲃ' => 'كى', + 'ﲄ' => 'كي', + 'ﲅ' => 'لم', + 'ﲆ' => 'لى', + 'ﲇ' => 'لي', + 'ﲈ' => 'ما', + 'ﲉ' => 'مم', + 'ﲊ' => 'نر', + 'ﲋ' => 'نز', + 'ﲌ' => 'نم', + 'ﲍ' => 'نن', + 'ﲎ' => 'نى', + 'ﲏ' => 'ني', + 'ﲐ' => 'ىٰ', + 'ﲑ' => 'ير', + 'ﲒ' => 'يز', + 'ﲓ' => 'يم', + 'ﲔ' => 'ين', + 'ﲕ' => 'يى', + 'ﲖ' => 'يي', + 'ﲗ' => 'ئج', + 'ﲘ' => 'ئح', + 'ﲙ' => 'ئخ', + 'ﲚ' => 'ئم', + 'ﲛ' => 'ئه', + 'ﲜ' => 'بج', + 'ﲝ' => 'بح', + 'ﲞ' => 'بخ', + 'ﲟ' => 'بم', + 'ﲠ' => 'به', + 'ﲡ' => 'تج', + 'ﲢ' => 'تح', + 'ﲣ' => 'تخ', + 'ﲤ' => 'تم', + 'ﲥ' => 'ته', + 'ﲦ' => 'ثم', + 'ﲧ' => 'جح', + 'ﲨ' => 'جم', + 'ﲩ' => 'حج', + 'ﲪ' => 'حم', + 'ﲫ' => 'خج', + 'ﲬ' => 'خم', + 'ﲭ' => 'سج', + 'ﲮ' => 'سح', + 'ﲯ' => 'سخ', + 'ﲰ' => 'سم', + 'ﲱ' => 'صح', + 'ﲲ' => 'صخ', + 'ﲳ' => 'صم', + 'ﲴ' => 'ضج', + 'ﲵ' => 'ضح', + 'ﲶ' => 'ضخ', + 'ﲷ' => 'ضم', + 'ﲸ' => 'طح', + 'ﲹ' => 'ظم', + 'ﲺ' => 'عج', + 'ﲻ' => 'عم', + 'ﲼ' => 'غج', + 'ﲽ' => 'غم', + 'ﲾ' => 'فج', + 'ﲿ' => 'فح', + 'ﳀ' => 'فخ', + 'ﳁ' => 'فم', + 'ﳂ' => 'قح', + 'ﳃ' => 'قم', + 'ﳄ' => 'كج', + 'ﳅ' => 'كح', + 'ﳆ' => 'كخ', + 'ﳇ' => 'كل', + 'ﳈ' => 'كم', + 'ﳉ' => 'لج', + 'ﳊ' => 'لح', + 'ﳋ' => 'لخ', + 'ﳌ' => 'لم', + 'ﳍ' => 'له', + 'ﳎ' => 'مج', + 'ﳏ' => 'مح', + 'ﳐ' => 'مخ', + 'ﳑ' => 'مم', + 'ﳒ' => 'نج', + 'ﳓ' => 'نح', + 'ﳔ' => 'نخ', + 'ﳕ' => 'نم', + 'ﳖ' => 'نه', + 'ﳗ' => 'هج', + 'ﳘ' => 'هم', + 'ﳙ' => 'هٰ', + 'ﳚ' => 'يج', + 'ﳛ' => 'يح', + 'ﳜ' => 'يخ', + 'ﳝ' => 'يم', + 'ﳞ' => 'يه', + 'ﳟ' => 'ئم', + 'ﳠ' => 'ئه', + 'ﳡ' => 'بم', + 'ﳢ' => 'به', + 'ﳣ' => 'تم', + 'ﳤ' => 'ته', + 'ﳥ' => 'ثم', + 'ﳦ' => 'ثه', + 'ﳧ' => 'سم', + 'ﳨ' => 'سه', + 'ﳩ' => 'شم', + 'ﳪ' => 'شه', + 'ﳫ' => 'كل', + 'ﳬ' => 'كم', + 'ﳭ' => 'لم', + 'ﳮ' => 'نم', + 'ﳯ' => 'نه', + 'ﳰ' => 'يم', + 'ﳱ' => 'يه', + 'ﳲ' => 'ـَّ', + 'ﳳ' => 'ـُّ', + 'ﳴ' => 'ـِّ', + 'ﳵ' => 'طى', + 'ﳶ' => 'طي', + 'ﳷ' => 'عى', + 'ﳸ' => 'عي', + 'ﳹ' => 'غى', + 'ﳺ' => 'غي', + 'ﳻ' => 'سى', + 'ﳼ' => 'سي', + 'ﳽ' => 'شى', + 'ﳾ' => 'شي', + 'ﳿ' => 'حى', + 'ﴀ' => 'حي', + 'ﴁ' => 'جى', + 'ﴂ' => 'جي', + 'ﴃ' => 'خى', + 'ﴄ' => 'خي', + 'ﴅ' => 'صى', + 'ﴆ' => 'صي', + 'ﴇ' => 'ضى', + 'ﴈ' => 'ضي', + 'ﴉ' => 'شج', + 'ﴊ' => 'شح', + 'ﴋ' => 'شخ', + 'ﴌ' => 'شم', + 'ﴍ' => 'شر', + 'ﴎ' => 'سر', + 'ﴏ' => 'صر', + 'ﴐ' => 'ضر', + 'ﴑ' => 'طى', + 'ﴒ' => 'طي', + 'ﴓ' => 'عى', + 'ﴔ' => 'عي', + 'ﴕ' => 'غى', + 'ﴖ' => 'غي', + 'ﴗ' => 'سى', + 'ﴘ' => 'سي', + 'ﴙ' => 'شى', + 'ﴚ' => 'شي', + 'ﴛ' => 'حى', + 'ﴜ' => 'حي', + 'ﴝ' => 'جى', + 'ﴞ' => 'جي', + 'ﴟ' => 'خى', + 'ﴠ' => 'خي', + 'ﴡ' => 'صى', + 'ﴢ' => 'صي', + 'ﴣ' => 'ضى', + 'ﴤ' => 'ضي', + 'ﴥ' => 'شج', + 'ﴦ' => 'شح', + 'ﴧ' => 'شخ', + 'ﴨ' => 'شم', + 'ﴩ' => 'شر', + 'ﴪ' => 'سر', + 'ﴫ' => 'صر', + 'ﴬ' => 'ضر', + 'ﴭ' => 'شج', + 'ﴮ' => 'شح', + 'ﴯ' => 'شخ', + 'ﴰ' => 'شم', + 'ﴱ' => 'سه', + 'ﴲ' => 'شه', + 'ﴳ' => 'طم', + 'ﴴ' => 'سج', + 'ﴵ' => 'سح', + 'ﴶ' => 'سخ', + 'ﴷ' => 'شج', + 'ﴸ' => 'شح', + 'ﴹ' => 'شخ', + 'ﴺ' => 'طم', + 'ﴻ' => 'ظم', + 'ﴼ' => 'اً', + 'ﴽ' => 'اً', + 'ﵐ' => 'تجم', + 'ﵑ' => 'تحج', + 'ﵒ' => 'تحج', + 'ﵓ' => 'تحم', + 'ﵔ' => 'تخم', + 'ﵕ' => 'تمج', + 'ﵖ' => 'تمح', + 'ﵗ' => 'تمخ', + 'ﵘ' => 'جمح', + 'ﵙ' => 'جمح', + 'ﵚ' => 'حمي', + 'ﵛ' => 'حمى', + 'ﵜ' => 'سحج', + 'ﵝ' => 'سجح', + 'ﵞ' => 'سجى', + 'ﵟ' => 'سمح', + 'ﵠ' => 'سمح', + 'ﵡ' => 'سمج', + 'ﵢ' => 'سمم', + 'ﵣ' => 'سمم', + 'ﵤ' => 'صحح', + 'ﵥ' => 'صحح', + 'ﵦ' => 'صمم', + 'ﵧ' => 'شحم', + 'ﵨ' => 'شحم', + 'ﵩ' => 'شجي', + 'ﵪ' => 'شمخ', + 'ﵫ' => 'شمخ', + 'ﵬ' => 'شمم', + 'ﵭ' => 'شمم', + 'ﵮ' => 'ضحى', + 'ﵯ' => 'ضخم', + 'ﵰ' => 'ضخم', + 'ﵱ' => 'طمح', + 'ﵲ' => 'طمح', + 'ﵳ' => 'طمم', + 'ﵴ' => 'طمي', + 'ﵵ' => 'عجم', + 'ﵶ' => 'عمم', + 'ﵷ' => 'عمم', + 'ﵸ' => 'عمى', + 'ﵹ' => 'غمم', + 'ﵺ' => 'غمي', + 'ﵻ' => 'غمى', + 'ﵼ' => 'فخم', + 'ﵽ' => 'فخم', + 'ﵾ' => 'قمح', + 'ﵿ' => 'قمم', + 'ﶀ' => 'لحم', + 'ﶁ' => 'لحي', + 'ﶂ' => 'لحى', + 'ﶃ' => 'لجج', + 'ﶄ' => 'لجج', + 'ﶅ' => 'لخم', + 'ﶆ' => 'لخم', + 'ﶇ' => 'لمح', + 'ﶈ' => 'لمح', + 'ﶉ' => 'محج', + 'ﶊ' => 'محم', + 'ﶋ' => 'محي', + 'ﶌ' => 'مجح', + 'ﶍ' => 'مجم', + 'ﶎ' => 'مخج', + 'ﶏ' => 'مخم', + 'ﶒ' => 'مجخ', + 'ﶓ' => 'همج', + 'ﶔ' => 'همم', + 'ﶕ' => 'نحم', + 'ﶖ' => 'نحى', + 'ﶗ' => 'نجم', + 'ﶘ' => 'نجم', + 'ﶙ' => 'نجى', + 'ﶚ' => 'نمي', + 'ﶛ' => 'نمى', + 'ﶜ' => 'يمم', + 'ﶝ' => 'يمم', + 'ﶞ' => 'بخي', + 'ﶟ' => 'تجي', + 'ﶠ' => 'تجى', + 'ﶡ' => 'تخي', + 'ﶢ' => 'تخى', + 'ﶣ' => 'تمي', + 'ﶤ' => 'تمى', + 'ﶥ' => 'جمي', + 'ﶦ' => 'جحى', + 'ﶧ' => 'جمى', + 'ﶨ' => 'سخى', + 'ﶩ' => 'صحي', + 'ﶪ' => 'شحي', + 'ﶫ' => 'ضحي', + 'ﶬ' => 'لجي', + 'ﶭ' => 'لمي', + 'ﶮ' => 'يحي', + 'ﶯ' => 'يجي', + 'ﶰ' => 'يمي', + 'ﶱ' => 'ممي', + 'ﶲ' => 'قمي', + 'ﶳ' => 'نحي', + 'ﶴ' => 'قمح', + 'ﶵ' => 'لحم', + 'ﶶ' => 'عمي', + 'ﶷ' => 'كمي', + 'ﶸ' => 'نجح', + 'ﶹ' => 'مخي', + 'ﶺ' => 'لجم', + 'ﶻ' => 'كمم', + 'ﶼ' => 'لجم', + 'ﶽ' => 'نجح', + 'ﶾ' => 'جحي', + 'ﶿ' => 'حجي', + 'ﷀ' => 'مجي', + 'ﷁ' => 'فمي', + 'ﷂ' => 'بحي', + 'ﷃ' => 'كمم', + 'ﷄ' => 'عجم', + 'ﷅ' => 'صمم', + 'ﷆ' => 'سخي', + 'ﷇ' => 'نجي', + 'ﷰ' => 'صلے', + 'ﷱ' => 'قلے', + 'ﷲ' => 'الله', + 'ﷳ' => 'اكبر', + 'ﷴ' => 'محمد', + 'ﷵ' => 'صلعم', + 'ﷶ' => 'رسول', + 'ﷷ' => 'عليه', + 'ﷸ' => 'وسلم', + 'ﷹ' => 'صلى', + 'ﷺ' => 'صلى الله عليه وسلم', + 'ﷻ' => 'جل جلاله', + '﷼' => 'ریال', + '︐' => ',', + '︑' => '、', + '︒' => '。', + '︓' => ':', + '︔' => ';', + '︕' => '!', + '︖' => '?', + '︗' => '〖', + '︘' => '〗', + '︙' => '...', + '︰' => '..', + '︱' => '—', + '︲' => '–', + '︳' => '_', + '︴' => '_', + '︵' => '(', + '︶' => ')', + '︷' => '{', + '︸' => '}', + '︹' => '〔', + '︺' => '〕', + '︻' => '【', + '︼' => '】', + '︽' => '《', + '︾' => '》', + '︿' => '〈', + '﹀' => '〉', + '﹁' => '「', + '﹂' => '」', + '﹃' => '『', + '﹄' => '』', + '﹇' => '[', + '﹈' => ']', + '﹉' => ' ̅', + '﹊' => ' ̅', + '﹋' => ' ̅', + '﹌' => ' ̅', + '﹍' => '_', + '﹎' => '_', + '﹏' => '_', + '﹐' => ',', + '﹑' => '、', + '﹒' => '.', + '﹔' => ';', + '﹕' => ':', + '﹖' => '?', + '﹗' => '!', + '﹘' => '—', + '﹙' => '(', + '﹚' => ')', + '﹛' => '{', + '﹜' => '}', + '﹝' => '〔', + '﹞' => '〕', + '﹟' => '#', + '﹠' => '&', + '﹡' => '*', + '﹢' => '+', + '﹣' => '-', + '﹤' => '<', + '﹥' => '>', + '﹦' => '=', + '﹨' => '\\', + '﹩' => '$', + '﹪' => '%', + '﹫' => '@', + 'ﹰ' => ' ً', + 'ﹱ' => 'ـً', + 'ﹲ' => ' ٌ', + 'ﹴ' => ' ٍ', + 'ﹶ' => ' َ', + 'ﹷ' => 'ـَ', + 'ﹸ' => ' ُ', + 'ﹹ' => 'ـُ', + 'ﹺ' => ' ِ', + 'ﹻ' => 'ـِ', + 'ﹼ' => ' ّ', + 'ﹽ' => 'ـّ', + 'ﹾ' => ' ْ', + 'ﹿ' => 'ـْ', + 'ﺀ' => 'ء', + 'ﺁ' => 'آ', + 'ﺂ' => 'آ', + 'ﺃ' => 'أ', + 'ﺄ' => 'أ', + 'ﺅ' => 'ؤ', + 'ﺆ' => 'ؤ', + 'ﺇ' => 'إ', + 'ﺈ' => 'إ', + 'ﺉ' => 'ئ', + 'ﺊ' => 'ئ', + 'ﺋ' => 'ئ', + 'ﺌ' => 'ئ', + 'ﺍ' => 'ا', + 'ﺎ' => 'ا', + 'ﺏ' => 'ب', + 'ﺐ' => 'ب', + 'ﺑ' => 'ب', + 'ﺒ' => 'ب', + 'ﺓ' => 'ة', + 'ﺔ' => 'ة', + 'ﺕ' => 'ت', + 'ﺖ' => 'ت', + 'ﺗ' => 'ت', + 'ﺘ' => 'ت', + 'ﺙ' => 'ث', + 'ﺚ' => 'ث', + 'ﺛ' => 'ث', + 'ﺜ' => 'ث', + 'ﺝ' => 'ج', + 'ﺞ' => 'ج', + 'ﺟ' => 'ج', + 'ﺠ' => 'ج', + 'ﺡ' => 'ح', + 'ﺢ' => 'ح', + 'ﺣ' => 'ح', + 'ﺤ' => 'ح', + 'ﺥ' => 'خ', + 'ﺦ' => 'خ', + 'ﺧ' => 'خ', + 'ﺨ' => 'خ', + 'ﺩ' => 'د', + 'ﺪ' => 'د', + 'ﺫ' => 'ذ', + 'ﺬ' => 'ذ', + 'ﺭ' => 'ر', + 'ﺮ' => 'ر', + 'ﺯ' => 'ز', + 'ﺰ' => 'ز', + 'ﺱ' => 'س', + 'ﺲ' => 'س', + 'ﺳ' => 'س', + 'ﺴ' => 'س', + 'ﺵ' => 'ش', + 'ﺶ' => 'ش', + 'ﺷ' => 'ش', + 'ﺸ' => 'ش', + 'ﺹ' => 'ص', + 'ﺺ' => 'ص', + 'ﺻ' => 'ص', + 'ﺼ' => 'ص', + 'ﺽ' => 'ض', + 'ﺾ' => 'ض', + 'ﺿ' => 'ض', + 'ﻀ' => 'ض', + 'ﻁ' => 'ط', + 'ﻂ' => 'ط', + 'ﻃ' => 'ط', + 'ﻄ' => 'ط', + 'ﻅ' => 'ظ', + 'ﻆ' => 'ظ', + 'ﻇ' => 'ظ', + 'ﻈ' => 'ظ', + 'ﻉ' => 'ع', + 'ﻊ' => 'ع', + 'ﻋ' => 'ع', + 'ﻌ' => 'ع', + 'ﻍ' => 'غ', + 'ﻎ' => 'غ', + 'ﻏ' => 'غ', + 'ﻐ' => 'غ', + 'ﻑ' => 'ف', + 'ﻒ' => 'ف', + 'ﻓ' => 'ف', + 'ﻔ' => 'ف', + 'ﻕ' => 'ق', + 'ﻖ' => 'ق', + 'ﻗ' => 'ق', + 'ﻘ' => 'ق', + 'ﻙ' => 'ك', + 'ﻚ' => 'ك', + 'ﻛ' => 'ك', + 'ﻜ' => 'ك', + 'ﻝ' => 'ل', + 'ﻞ' => 'ل', + 'ﻟ' => 'ل', + 'ﻠ' => 'ل', + 'ﻡ' => 'م', + 'ﻢ' => 'م', + 'ﻣ' => 'م', + 'ﻤ' => 'م', + 'ﻥ' => 'ن', + 'ﻦ' => 'ن', + 'ﻧ' => 'ن', + 'ﻨ' => 'ن', + 'ﻩ' => 'ه', + 'ﻪ' => 'ه', + 'ﻫ' => 'ه', + 'ﻬ' => 'ه', + 'ﻭ' => 'و', + 'ﻮ' => 'و', + 'ﻯ' => 'ى', + 'ﻰ' => 'ى', + 'ﻱ' => 'ي', + 'ﻲ' => 'ي', + 'ﻳ' => 'ي', + 'ﻴ' => 'ي', + 'ﻵ' => 'لآ', + 'ﻶ' => 'لآ', + 'ﻷ' => 'لأ', + 'ﻸ' => 'لأ', + 'ﻹ' => 'لإ', + 'ﻺ' => 'لإ', + 'ﻻ' => 'لا', + 'ﻼ' => 'لا', + '!' => '!', + '"' => '"', + '#' => '#', + '$' => '$', + '%' => '%', + '&' => '&', + ''' => '\'', + '(' => '(', + ')' => ')', + '*' => '*', + '+' => '+', + ',' => ',', + '-' => '-', + '.' => '.', + '/' => '/', + '0' => '0', + '1' => '1', + '2' => '2', + '3' => '3', + '4' => '4', + '5' => '5', + '6' => '6', + '7' => '7', + '8' => '8', + '9' => '9', + ':' => ':', + ';' => ';', + '<' => '<', + '=' => '=', + '>' => '>', + '?' => '?', + '@' => '@', + 'A' => 'A', + 'B' => 'B', + 'C' => 'C', + 'D' => 'D', + 'E' => 'E', + 'F' => 'F', + 'G' => 'G', + 'H' => 'H', + 'I' => 'I', + 'J' => 'J', + 'K' => 'K', + 'L' => 'L', + 'M' => 'M', + 'N' => 'N', + 'O' => 'O', + 'P' => 'P', + 'Q' => 'Q', + 'R' => 'R', + 'S' => 'S', + 'T' => 'T', + 'U' => 'U', + 'V' => 'V', + 'W' => 'W', + 'X' => 'X', + 'Y' => 'Y', + 'Z' => 'Z', + '[' => '[', + '\' => '\\', + ']' => ']', + '^' => '^', + '_' => '_', + '`' => '`', + 'a' => 'a', + 'b' => 'b', + 'c' => 'c', + 'd' => 'd', + 'e' => 'e', + 'f' => 'f', + 'g' => 'g', + 'h' => 'h', + 'i' => 'i', + 'j' => 'j', + 'k' => 'k', + 'l' => 'l', + 'm' => 'm', + 'n' => 'n', + 'o' => 'o', + 'p' => 'p', + 'q' => 'q', + 'r' => 'r', + 's' => 's', + 't' => 't', + 'u' => 'u', + 'v' => 'v', + 'w' => 'w', + 'x' => 'x', + 'y' => 'y', + 'z' => 'z', + '{' => '{', + '|' => '|', + '}' => '}', + '~' => '~', + '⦅' => '⦅', + '⦆' => '⦆', + '。' => '。', + '「' => '「', + '」' => '」', + '、' => '、', + '・' => '・', + 'ヲ' => 'ヲ', + 'ァ' => 'ァ', + 'ィ' => 'ィ', + 'ゥ' => 'ゥ', + 'ェ' => 'ェ', + 'ォ' => 'ォ', + 'ャ' => 'ャ', + 'ュ' => 'ュ', + 'ョ' => 'ョ', + 'ッ' => 'ッ', + 'ー' => 'ー', + 'ア' => 'ア', + 'イ' => 'イ', + 'ウ' => 'ウ', + 'エ' => 'エ', + 'オ' => 'オ', + 'カ' => 'カ', + 'キ' => 'キ', + 'ク' => 'ク', + 'ケ' => 'ケ', + 'コ' => 'コ', + 'サ' => 'サ', + 'シ' => 'シ', + 'ス' => 'ス', + 'セ' => 'セ', + 'ソ' => 'ソ', + 'タ' => 'タ', + 'チ' => 'チ', + 'ツ' => 'ツ', + 'テ' => 'テ', + 'ト' => 'ト', + 'ナ' => 'ナ', + 'ニ' => 'ニ', + 'ヌ' => 'ヌ', + 'ネ' => 'ネ', + 'ノ' => 'ノ', + 'ハ' => 'ハ', + 'ヒ' => 'ヒ', + 'フ' => 'フ', + 'ヘ' => 'ヘ', + 'ホ' => 'ホ', + 'マ' => 'マ', + 'ミ' => 'ミ', + 'ム' => 'ム', + 'メ' => 'メ', + 'モ' => 'モ', + 'ヤ' => 'ヤ', + 'ユ' => 'ユ', + 'ヨ' => 'ヨ', + 'ラ' => 'ラ', + 'リ' => 'リ', + 'ル' => 'ル', + 'レ' => 'レ', + 'ロ' => 'ロ', + 'ワ' => 'ワ', + 'ン' => 'ン', + '゙' => '゙', + '゚' => '゚', + 'ᅠ' => 'ᅠ', + 'ᄀ' => 'ᄀ', + 'ᄁ' => 'ᄁ', + 'ᆪ' => 'ᆪ', + 'ᄂ' => 'ᄂ', + 'ᆬ' => 'ᆬ', + 'ᆭ' => 'ᆭ', + 'ᄃ' => 'ᄃ', + 'ᄄ' => 'ᄄ', + 'ᄅ' => 'ᄅ', + 'ᆰ' => 'ᆰ', + 'ᆱ' => 'ᆱ', + 'ᆲ' => 'ᆲ', + 'ᆳ' => 'ᆳ', + 'ᆴ' => 'ᆴ', + 'ᆵ' => 'ᆵ', + 'ᄚ' => 'ᄚ', + 'ᄆ' => 'ᄆ', + 'ᄇ' => 'ᄇ', + 'ᄈ' => 'ᄈ', + 'ᄡ' => 'ᄡ', + 'ᄉ' => 'ᄉ', + 'ᄊ' => 'ᄊ', + 'ᄋ' => 'ᄋ', + 'ᄌ' => 'ᄌ', + 'ᄍ' => 'ᄍ', + 'ᄎ' => 'ᄎ', + 'ᄏ' => 'ᄏ', + 'ᄐ' => 'ᄐ', + 'ᄑ' => 'ᄑ', + 'ᄒ' => 'ᄒ', + 'ᅡ' => 'ᅡ', + 'ᅢ' => 'ᅢ', + 'ᅣ' => 'ᅣ', + 'ᅤ' => 'ᅤ', + 'ᅥ' => 'ᅥ', + 'ᅦ' => 'ᅦ', + 'ᅧ' => 'ᅧ', + 'ᅨ' => 'ᅨ', + 'ᅩ' => 'ᅩ', + 'ᅪ' => 'ᅪ', + 'ᅫ' => 'ᅫ', + 'ᅬ' => 'ᅬ', + 'ᅭ' => 'ᅭ', + 'ᅮ' => 'ᅮ', + 'ᅯ' => 'ᅯ', + 'ᅰ' => 'ᅰ', + 'ᅱ' => 'ᅱ', + 'ᅲ' => 'ᅲ', + 'ᅳ' => 'ᅳ', + 'ᅴ' => 'ᅴ', + 'ᅵ' => 'ᅵ', + '¢' => '¢', + '£' => '£', + '¬' => '¬', + ' ̄' => ' ̄', + '¦' => '¦', + '¥' => '¥', + '₩' => '₩', + '│' => '│', + '←' => '←', + '↑' => '↑', + '→' => '→', + '↓' => '↓', + '■' => '■', + '○' => '○', + '𝐀' => 'A', + '𝐁' => 'B', + '𝐂' => 'C', + '𝐃' => 'D', + '𝐄' => 'E', + '𝐅' => 'F', + '𝐆' => 'G', + '𝐇' => 'H', + '𝐈' => 'I', + '𝐉' => 'J', + '𝐊' => 'K', + '𝐋' => 'L', + '𝐌' => 'M', + '𝐍' => 'N', + '𝐎' => 'O', + '𝐏' => 'P', + '𝐐' => 'Q', + '𝐑' => 'R', + '𝐒' => 'S', + '𝐓' => 'T', + '𝐔' => 'U', + '𝐕' => 'V', + '𝐖' => 'W', + '𝐗' => 'X', + '𝐘' => 'Y', + '𝐙' => 'Z', + '𝐚' => 'a', + '𝐛' => 'b', + '𝐜' => 'c', + '𝐝' => 'd', + '𝐞' => 'e', + '𝐟' => 'f', + '𝐠' => 'g', + '𝐡' => 'h', + '𝐢' => 'i', + '𝐣' => 'j', + '𝐤' => 'k', + '𝐥' => 'l', + '𝐦' => 'm', + '𝐧' => 'n', + '𝐨' => 'o', + '𝐩' => 'p', + '𝐪' => 'q', + '𝐫' => 'r', + '𝐬' => 's', + '𝐭' => 't', + '𝐮' => 'u', + '𝐯' => 'v', + '𝐰' => 'w', + '𝐱' => 'x', + '𝐲' => 'y', + '𝐳' => 'z', + '𝐴' => 'A', + '𝐵' => 'B', + '𝐶' => 'C', + '𝐷' => 'D', + '𝐸' => 'E', + '𝐹' => 'F', + '𝐺' => 'G', + '𝐻' => 'H', + '𝐼' => 'I', + '𝐽' => 'J', + '𝐾' => 'K', + '𝐿' => 'L', + '𝑀' => 'M', + '𝑁' => 'N', + '𝑂' => 'O', + '𝑃' => 'P', + '𝑄' => 'Q', + '𝑅' => 'R', + '𝑆' => 'S', + '𝑇' => 'T', + '𝑈' => 'U', + '𝑉' => 'V', + '𝑊' => 'W', + '𝑋' => 'X', + '𝑌' => 'Y', + '𝑍' => 'Z', + '𝑎' => 'a', + '𝑏' => 'b', + '𝑐' => 'c', + '𝑑' => 'd', + '𝑒' => 'e', + '𝑓' => 'f', + '𝑔' => 'g', + '𝑖' => 'i', + '𝑗' => 'j', + '𝑘' => 'k', + '𝑙' => 'l', + '𝑚' => 'm', + '𝑛' => 'n', + '𝑜' => 'o', + '𝑝' => 'p', + '𝑞' => 'q', + '𝑟' => 'r', + '𝑠' => 's', + '𝑡' => 't', + '𝑢' => 'u', + '𝑣' => 'v', + '𝑤' => 'w', + '𝑥' => 'x', + '𝑦' => 'y', + '𝑧' => 'z', + '𝑨' => 'A', + '𝑩' => 'B', + '𝑪' => 'C', + '𝑫' => 'D', + '𝑬' => 'E', + '𝑭' => 'F', + '𝑮' => 'G', + '𝑯' => 'H', + '𝑰' => 'I', + '𝑱' => 'J', + '𝑲' => 'K', + '𝑳' => 'L', + '𝑴' => 'M', + '𝑵' => 'N', + '𝑶' => 'O', + '𝑷' => 'P', + '𝑸' => 'Q', + '𝑹' => 'R', + '𝑺' => 'S', + '𝑻' => 'T', + '𝑼' => 'U', + '𝑽' => 'V', + '𝑾' => 'W', + '𝑿' => 'X', + '𝒀' => 'Y', + '𝒁' => 'Z', + '𝒂' => 'a', + '𝒃' => 'b', + '𝒄' => 'c', + '𝒅' => 'd', + '𝒆' => 'e', + '𝒇' => 'f', + '𝒈' => 'g', + '𝒉' => 'h', + '𝒊' => 'i', + '𝒋' => 'j', + '𝒌' => 'k', + '𝒍' => 'l', + '𝒎' => 'm', + '𝒏' => 'n', + '𝒐' => 'o', + '𝒑' => 'p', + '𝒒' => 'q', + '𝒓' => 'r', + '𝒔' => 's', + '𝒕' => 't', + '𝒖' => 'u', + '𝒗' => 'v', + '𝒘' => 'w', + '𝒙' => 'x', + '𝒚' => 'y', + '𝒛' => 'z', + '𝒜' => 'A', + '𝒞' => 'C', + '𝒟' => 'D', + '𝒢' => 'G', + '𝒥' => 'J', + '𝒦' => 'K', + '𝒩' => 'N', + '𝒪' => 'O', + '𝒫' => 'P', + '𝒬' => 'Q', + '𝒮' => 'S', + '𝒯' => 'T', + '𝒰' => 'U', + '𝒱' => 'V', + '𝒲' => 'W', + '𝒳' => 'X', + '𝒴' => 'Y', + '𝒵' => 'Z', + '𝒶' => 'a', + '𝒷' => 'b', + '𝒸' => 'c', + '𝒹' => 'd', + '𝒻' => 'f', + '𝒽' => 'h', + '𝒾' => 'i', + '𝒿' => 'j', + '𝓀' => 'k', + '𝓁' => 'l', + '𝓂' => 'm', + '𝓃' => 'n', + '𝓅' => 'p', + '𝓆' => 'q', + '𝓇' => 'r', + '𝓈' => 's', + '𝓉' => 't', + '𝓊' => 'u', + '𝓋' => 'v', + '𝓌' => 'w', + '𝓍' => 'x', + '𝓎' => 'y', + '𝓏' => 'z', + '𝓐' => 'A', + '𝓑' => 'B', + '𝓒' => 'C', + '𝓓' => 'D', + '𝓔' => 'E', + '𝓕' => 'F', + '𝓖' => 'G', + '𝓗' => 'H', + '𝓘' => 'I', + '𝓙' => 'J', + '𝓚' => 'K', + '𝓛' => 'L', + '𝓜' => 'M', + '𝓝' => 'N', + '𝓞' => 'O', + '𝓟' => 'P', + '𝓠' => 'Q', + '𝓡' => 'R', + '𝓢' => 'S', + '𝓣' => 'T', + '𝓤' => 'U', + '𝓥' => 'V', + '𝓦' => 'W', + '𝓧' => 'X', + '𝓨' => 'Y', + '𝓩' => 'Z', + '𝓪' => 'a', + '𝓫' => 'b', + '𝓬' => 'c', + '𝓭' => 'd', + '𝓮' => 'e', + '𝓯' => 'f', + '𝓰' => 'g', + '𝓱' => 'h', + '𝓲' => 'i', + '𝓳' => 'j', + '𝓴' => 'k', + '𝓵' => 'l', + '𝓶' => 'm', + '𝓷' => 'n', + '𝓸' => 'o', + '𝓹' => 'p', + '𝓺' => 'q', + '𝓻' => 'r', + '𝓼' => 's', + '𝓽' => 't', + '𝓾' => 'u', + '𝓿' => 'v', + '𝔀' => 'w', + '𝔁' => 'x', + '𝔂' => 'y', + '𝔃' => 'z', + '𝔄' => 'A', + '𝔅' => 'B', + '𝔇' => 'D', + '𝔈' => 'E', + '𝔉' => 'F', + '𝔊' => 'G', + '𝔍' => 'J', + '𝔎' => 'K', + '𝔏' => 'L', + '𝔐' => 'M', + '𝔑' => 'N', + '𝔒' => 'O', + '𝔓' => 'P', + '𝔔' => 'Q', + '𝔖' => 'S', + '𝔗' => 'T', + '𝔘' => 'U', + '𝔙' => 'V', + '𝔚' => 'W', + '𝔛' => 'X', + '𝔜' => 'Y', + '𝔞' => 'a', + '𝔟' => 'b', + '𝔠' => 'c', + '𝔡' => 'd', + '𝔢' => 'e', + '𝔣' => 'f', + '𝔤' => 'g', + '𝔥' => 'h', + '𝔦' => 'i', + '𝔧' => 'j', + '𝔨' => 'k', + '𝔩' => 'l', + '𝔪' => 'm', + '𝔫' => 'n', + '𝔬' => 'o', + '𝔭' => 'p', + '𝔮' => 'q', + '𝔯' => 'r', + '𝔰' => 's', + '𝔱' => 't', + '𝔲' => 'u', + '𝔳' => 'v', + '𝔴' => 'w', + '𝔵' => 'x', + '𝔶' => 'y', + '𝔷' => 'z', + '𝔸' => 'A', + '𝔹' => 'B', + '𝔻' => 'D', + '𝔼' => 'E', + '𝔽' => 'F', + '𝔾' => 'G', + '𝕀' => 'I', + '𝕁' => 'J', + '𝕂' => 'K', + '𝕃' => 'L', + '𝕄' => 'M', + '𝕆' => 'O', + '𝕊' => 'S', + '𝕋' => 'T', + '𝕌' => 'U', + '𝕍' => 'V', + '𝕎' => 'W', + '𝕏' => 'X', + '𝕐' => 'Y', + '𝕒' => 'a', + '𝕓' => 'b', + '𝕔' => 'c', + '𝕕' => 'd', + '𝕖' => 'e', + '𝕗' => 'f', + '𝕘' => 'g', + '𝕙' => 'h', + '𝕚' => 'i', + '𝕛' => 'j', + '𝕜' => 'k', + '𝕝' => 'l', + '𝕞' => 'm', + '𝕟' => 'n', + '𝕠' => 'o', + '𝕡' => 'p', + '𝕢' => 'q', + '𝕣' => 'r', + '𝕤' => 's', + '𝕥' => 't', + '𝕦' => 'u', + '𝕧' => 'v', + '𝕨' => 'w', + '𝕩' => 'x', + '𝕪' => 'y', + '𝕫' => 'z', + '𝕬' => 'A', + '𝕭' => 'B', + '𝕮' => 'C', + '𝕯' => 'D', + '𝕰' => 'E', + '𝕱' => 'F', + '𝕲' => 'G', + '𝕳' => 'H', + '𝕴' => 'I', + '𝕵' => 'J', + '𝕶' => 'K', + '𝕷' => 'L', + '𝕸' => 'M', + '𝕹' => 'N', + '𝕺' => 'O', + '𝕻' => 'P', + '𝕼' => 'Q', + '𝕽' => 'R', + '𝕾' => 'S', + '𝕿' => 'T', + '𝖀' => 'U', + '𝖁' => 'V', + '𝖂' => 'W', + '𝖃' => 'X', + '𝖄' => 'Y', + '𝖅' => 'Z', + '𝖆' => 'a', + '𝖇' => 'b', + '𝖈' => 'c', + '𝖉' => 'd', + '𝖊' => 'e', + '𝖋' => 'f', + '𝖌' => 'g', + '𝖍' => 'h', + '𝖎' => 'i', + '𝖏' => 'j', + '𝖐' => 'k', + '𝖑' => 'l', + '𝖒' => 'm', + '𝖓' => 'n', + '𝖔' => 'o', + '𝖕' => 'p', + '𝖖' => 'q', + '𝖗' => 'r', + '𝖘' => 's', + '𝖙' => 't', + '𝖚' => 'u', + '𝖛' => 'v', + '𝖜' => 'w', + '𝖝' => 'x', + '𝖞' => 'y', + '𝖟' => 'z', + '𝖠' => 'A', + '𝖡' => 'B', + '𝖢' => 'C', + '𝖣' => 'D', + '𝖤' => 'E', + '𝖥' => 'F', + '𝖦' => 'G', + '𝖧' => 'H', + '𝖨' => 'I', + '𝖩' => 'J', + '𝖪' => 'K', + '𝖫' => 'L', + '𝖬' => 'M', + '𝖭' => 'N', + '𝖮' => 'O', + '𝖯' => 'P', + '𝖰' => 'Q', + '𝖱' => 'R', + '𝖲' => 'S', + '𝖳' => 'T', + '𝖴' => 'U', + '𝖵' => 'V', + '𝖶' => 'W', + '𝖷' => 'X', + '𝖸' => 'Y', + '𝖹' => 'Z', + '𝖺' => 'a', + '𝖻' => 'b', + '𝖼' => 'c', + '𝖽' => 'd', + '𝖾' => 'e', + '𝖿' => 'f', + '𝗀' => 'g', + '𝗁' => 'h', + '𝗂' => 'i', + '𝗃' => 'j', + '𝗄' => 'k', + '𝗅' => 'l', + '𝗆' => 'm', + '𝗇' => 'n', + '𝗈' => 'o', + '𝗉' => 'p', + '𝗊' => 'q', + '𝗋' => 'r', + '𝗌' => 's', + '𝗍' => 't', + '𝗎' => 'u', + '𝗏' => 'v', + '𝗐' => 'w', + '𝗑' => 'x', + '𝗒' => 'y', + '𝗓' => 'z', + '𝗔' => 'A', + '𝗕' => 'B', + '𝗖' => 'C', + '𝗗' => 'D', + '𝗘' => 'E', + '𝗙' => 'F', + '𝗚' => 'G', + '𝗛' => 'H', + '𝗜' => 'I', + '𝗝' => 'J', + '𝗞' => 'K', + '𝗟' => 'L', + '𝗠' => 'M', + '𝗡' => 'N', + '𝗢' => 'O', + '𝗣' => 'P', + '𝗤' => 'Q', + '𝗥' => 'R', + '𝗦' => 'S', + '𝗧' => 'T', + '𝗨' => 'U', + '𝗩' => 'V', + '𝗪' => 'W', + '𝗫' => 'X', + '𝗬' => 'Y', + '𝗭' => 'Z', + '𝗮' => 'a', + '𝗯' => 'b', + '𝗰' => 'c', + '𝗱' => 'd', + '𝗲' => 'e', + '𝗳' => 'f', + '𝗴' => 'g', + '𝗵' => 'h', + '𝗶' => 'i', + '𝗷' => 'j', + '𝗸' => 'k', + '𝗹' => 'l', + '𝗺' => 'm', + '𝗻' => 'n', + '𝗼' => 'o', + '𝗽' => 'p', + '𝗾' => 'q', + '𝗿' => 'r', + '𝘀' => 's', + '𝘁' => 't', + '𝘂' => 'u', + '𝘃' => 'v', + '𝘄' => 'w', + '𝘅' => 'x', + '𝘆' => 'y', + '𝘇' => 'z', + '𝘈' => 'A', + '𝘉' => 'B', + '𝘊' => 'C', + '𝘋' => 'D', + '𝘌' => 'E', + '𝘍' => 'F', + '𝘎' => 'G', + '𝘏' => 'H', + '𝘐' => 'I', + '𝘑' => 'J', + '𝘒' => 'K', + '𝘓' => 'L', + '𝘔' => 'M', + '𝘕' => 'N', + '𝘖' => 'O', + '𝘗' => 'P', + '𝘘' => 'Q', + '𝘙' => 'R', + '𝘚' => 'S', + '𝘛' => 'T', + '𝘜' => 'U', + '𝘝' => 'V', + '𝘞' => 'W', + '𝘟' => 'X', + '𝘠' => 'Y', + '𝘡' => 'Z', + '𝘢' => 'a', + '𝘣' => 'b', + '𝘤' => 'c', + '𝘥' => 'd', + '𝘦' => 'e', + '𝘧' => 'f', + '𝘨' => 'g', + '𝘩' => 'h', + '𝘪' => 'i', + '𝘫' => 'j', + '𝘬' => 'k', + '𝘭' => 'l', + '𝘮' => 'm', + '𝘯' => 'n', + '𝘰' => 'o', + '𝘱' => 'p', + '𝘲' => 'q', + '𝘳' => 'r', + '𝘴' => 's', + '𝘵' => 't', + '𝘶' => 'u', + '𝘷' => 'v', + '𝘸' => 'w', + '𝘹' => 'x', + '𝘺' => 'y', + '𝘻' => 'z', + '𝘼' => 'A', + '𝘽' => 'B', + '𝘾' => 'C', + '𝘿' => 'D', + '𝙀' => 'E', + '𝙁' => 'F', + '𝙂' => 'G', + '𝙃' => 'H', + '𝙄' => 'I', + '𝙅' => 'J', + '𝙆' => 'K', + '𝙇' => 'L', + '𝙈' => 'M', + '𝙉' => 'N', + '𝙊' => 'O', + '𝙋' => 'P', + '𝙌' => 'Q', + '𝙍' => 'R', + '𝙎' => 'S', + '𝙏' => 'T', + '𝙐' => 'U', + '𝙑' => 'V', + '𝙒' => 'W', + '𝙓' => 'X', + '𝙔' => 'Y', + '𝙕' => 'Z', + '𝙖' => 'a', + '𝙗' => 'b', + '𝙘' => 'c', + '𝙙' => 'd', + '𝙚' => 'e', + '𝙛' => 'f', + '𝙜' => 'g', + '𝙝' => 'h', + '𝙞' => 'i', + '𝙟' => 'j', + '𝙠' => 'k', + '𝙡' => 'l', + '𝙢' => 'm', + '𝙣' => 'n', + '𝙤' => 'o', + '𝙥' => 'p', + '𝙦' => 'q', + '𝙧' => 'r', + '𝙨' => 's', + '𝙩' => 't', + '𝙪' => 'u', + '𝙫' => 'v', + '𝙬' => 'w', + '𝙭' => 'x', + '𝙮' => 'y', + '𝙯' => 'z', + '𝙰' => 'A', + '𝙱' => 'B', + '𝙲' => 'C', + '𝙳' => 'D', + '𝙴' => 'E', + '𝙵' => 'F', + '𝙶' => 'G', + '𝙷' => 'H', + '𝙸' => 'I', + '𝙹' => 'J', + '𝙺' => 'K', + '𝙻' => 'L', + '𝙼' => 'M', + '𝙽' => 'N', + '𝙾' => 'O', + '𝙿' => 'P', + '𝚀' => 'Q', + '𝚁' => 'R', + '𝚂' => 'S', + '𝚃' => 'T', + '𝚄' => 'U', + '𝚅' => 'V', + '𝚆' => 'W', + '𝚇' => 'X', + '𝚈' => 'Y', + '𝚉' => 'Z', + '𝚊' => 'a', + '𝚋' => 'b', + '𝚌' => 'c', + '𝚍' => 'd', + '𝚎' => 'e', + '𝚏' => 'f', + '𝚐' => 'g', + '𝚑' => 'h', + '𝚒' => 'i', + '𝚓' => 'j', + '𝚔' => 'k', + '𝚕' => 'l', + '𝚖' => 'm', + '𝚗' => 'n', + '𝚘' => 'o', + '𝚙' => 'p', + '𝚚' => 'q', + '𝚛' => 'r', + '𝚜' => 's', + '𝚝' => 't', + '𝚞' => 'u', + '𝚟' => 'v', + '𝚠' => 'w', + '𝚡' => 'x', + '𝚢' => 'y', + '𝚣' => 'z', + '𝚤' => 'ı', + '𝚥' => 'ȷ', + '𝚨' => 'Α', + '𝚩' => 'Β', + '𝚪' => 'Γ', + '𝚫' => 'Δ', + '𝚬' => 'Ε', + '𝚭' => 'Ζ', + '𝚮' => 'Η', + '𝚯' => 'Θ', + '𝚰' => 'Ι', + '𝚱' => 'Κ', + '𝚲' => 'Λ', + '𝚳' => 'Μ', + '𝚴' => 'Ν', + '𝚵' => 'Ξ', + '𝚶' => 'Ο', + '𝚷' => 'Π', + '𝚸' => 'Ρ', + '𝚹' => 'Θ', + '𝚺' => 'Σ', + '𝚻' => 'Τ', + '𝚼' => 'Υ', + '𝚽' => 'Φ', + '𝚾' => 'Χ', + '𝚿' => 'Ψ', + '𝛀' => 'Ω', + '𝛁' => '∇', + '𝛂' => 'α', + '𝛃' => 'β', + '𝛄' => 'γ', + '𝛅' => 'δ', + '𝛆' => 'ε', + '𝛇' => 'ζ', + '𝛈' => 'η', + '𝛉' => 'θ', + '𝛊' => 'ι', + '𝛋' => 'κ', + '𝛌' => 'λ', + '𝛍' => 'μ', + '𝛎' => 'ν', + '𝛏' => 'ξ', + '𝛐' => 'ο', + '𝛑' => 'π', + '𝛒' => 'ρ', + '𝛓' => 'ς', + '𝛔' => 'σ', + '𝛕' => 'τ', + '𝛖' => 'υ', + '𝛗' => 'φ', + '𝛘' => 'χ', + '𝛙' => 'ψ', + '𝛚' => 'ω', + '𝛛' => '∂', + '𝛜' => 'ε', + '𝛝' => 'θ', + '𝛞' => 'κ', + '𝛟' => 'φ', + '𝛠' => 'ρ', + '𝛡' => 'π', + '𝛢' => 'Α', + '𝛣' => 'Β', + '𝛤' => 'Γ', + '𝛥' => 'Δ', + '𝛦' => 'Ε', + '𝛧' => 'Ζ', + '𝛨' => 'Η', + '𝛩' => 'Θ', + '𝛪' => 'Ι', + '𝛫' => 'Κ', + '𝛬' => 'Λ', + '𝛭' => 'Μ', + '𝛮' => 'Ν', + '𝛯' => 'Ξ', + '𝛰' => 'Ο', + '𝛱' => 'Π', + '𝛲' => 'Ρ', + '𝛳' => 'Θ', + '𝛴' => 'Σ', + '𝛵' => 'Τ', + '𝛶' => 'Υ', + '𝛷' => 'Φ', + '𝛸' => 'Χ', + '𝛹' => 'Ψ', + '𝛺' => 'Ω', + '𝛻' => '∇', + '𝛼' => 'α', + '𝛽' => 'β', + '𝛾' => 'γ', + '𝛿' => 'δ', + '𝜀' => 'ε', + '𝜁' => 'ζ', + '𝜂' => 'η', + '𝜃' => 'θ', + '𝜄' => 'ι', + '𝜅' => 'κ', + '𝜆' => 'λ', + '𝜇' => 'μ', + '𝜈' => 'ν', + '𝜉' => 'ξ', + '𝜊' => 'ο', + '𝜋' => 'π', + '𝜌' => 'ρ', + '𝜍' => 'ς', + '𝜎' => 'σ', + '𝜏' => 'τ', + '𝜐' => 'υ', + '𝜑' => 'φ', + '𝜒' => 'χ', + '𝜓' => 'ψ', + '𝜔' => 'ω', + '𝜕' => '∂', + '𝜖' => 'ε', + '𝜗' => 'θ', + '𝜘' => 'κ', + '𝜙' => 'φ', + '𝜚' => 'ρ', + '𝜛' => 'π', + '𝜜' => 'Α', + '𝜝' => 'Β', + '𝜞' => 'Γ', + '𝜟' => 'Δ', + '𝜠' => 'Ε', + '𝜡' => 'Ζ', + '𝜢' => 'Η', + '𝜣' => 'Θ', + '𝜤' => 'Ι', + '𝜥' => 'Κ', + '𝜦' => 'Λ', + '𝜧' => 'Μ', + '𝜨' => 'Ν', + '𝜩' => 'Ξ', + '𝜪' => 'Ο', + '𝜫' => 'Π', + '𝜬' => 'Ρ', + '𝜭' => 'Θ', + '𝜮' => 'Σ', + '𝜯' => 'Τ', + '𝜰' => 'Υ', + '𝜱' => 'Φ', + '𝜲' => 'Χ', + '𝜳' => 'Ψ', + '𝜴' => 'Ω', + '𝜵' => '∇', + '𝜶' => 'α', + '𝜷' => 'β', + '𝜸' => 'γ', + '𝜹' => 'δ', + '𝜺' => 'ε', + '𝜻' => 'ζ', + '𝜼' => 'η', + '𝜽' => 'θ', + '𝜾' => 'ι', + '𝜿' => 'κ', + '𝝀' => 'λ', + '𝝁' => 'μ', + '𝝂' => 'ν', + '𝝃' => 'ξ', + '𝝄' => 'ο', + '𝝅' => 'π', + '𝝆' => 'ρ', + '𝝇' => 'ς', + '𝝈' => 'σ', + '𝝉' => 'τ', + '𝝊' => 'υ', + '𝝋' => 'φ', + '𝝌' => 'χ', + '𝝍' => 'ψ', + '𝝎' => 'ω', + '𝝏' => '∂', + '𝝐' => 'ε', + '𝝑' => 'θ', + '𝝒' => 'κ', + '𝝓' => 'φ', + '𝝔' => 'ρ', + '𝝕' => 'π', + '𝝖' => 'Α', + '𝝗' => 'Β', + '𝝘' => 'Γ', + '𝝙' => 'Δ', + '𝝚' => 'Ε', + '𝝛' => 'Ζ', + '𝝜' => 'Η', + '𝝝' => 'Θ', + '𝝞' => 'Ι', + '𝝟' => 'Κ', + '𝝠' => 'Λ', + '𝝡' => 'Μ', + '𝝢' => 'Ν', + '𝝣' => 'Ξ', + '𝝤' => 'Ο', + '𝝥' => 'Π', + '𝝦' => 'Ρ', + '𝝧' => 'Θ', + '𝝨' => 'Σ', + '𝝩' => 'Τ', + '𝝪' => 'Υ', + '𝝫' => 'Φ', + '𝝬' => 'Χ', + '𝝭' => 'Ψ', + '𝝮' => 'Ω', + '𝝯' => '∇', + '𝝰' => 'α', + '𝝱' => 'β', + '𝝲' => 'γ', + '𝝳' => 'δ', + '𝝴' => 'ε', + '𝝵' => 'ζ', + '𝝶' => 'η', + '𝝷' => 'θ', + '𝝸' => 'ι', + '𝝹' => 'κ', + '𝝺' => 'λ', + '𝝻' => 'μ', + '𝝼' => 'ν', + '𝝽' => 'ξ', + '𝝾' => 'ο', + '𝝿' => 'π', + '𝞀' => 'ρ', + '𝞁' => 'ς', + '𝞂' => 'σ', + '𝞃' => 'τ', + '𝞄' => 'υ', + '𝞅' => 'φ', + '𝞆' => 'χ', + '𝞇' => 'ψ', + '𝞈' => 'ω', + '𝞉' => '∂', + '𝞊' => 'ε', + '𝞋' => 'θ', + '𝞌' => 'κ', + '𝞍' => 'φ', + '𝞎' => 'ρ', + '𝞏' => 'π', + '𝞐' => 'Α', + '𝞑' => 'Β', + '𝞒' => 'Γ', + '𝞓' => 'Δ', + '𝞔' => 'Ε', + '𝞕' => 'Ζ', + '𝞖' => 'Η', + '𝞗' => 'Θ', + '𝞘' => 'Ι', + '𝞙' => 'Κ', + '𝞚' => 'Λ', + '𝞛' => 'Μ', + '𝞜' => 'Ν', + '𝞝' => 'Ξ', + '𝞞' => 'Ο', + '𝞟' => 'Π', + '𝞠' => 'Ρ', + '𝞡' => 'Θ', + '𝞢' => 'Σ', + '𝞣' => 'Τ', + '𝞤' => 'Υ', + '𝞥' => 'Φ', + '𝞦' => 'Χ', + '𝞧' => 'Ψ', + '𝞨' => 'Ω', + '𝞩' => '∇', + '𝞪' => 'α', + '𝞫' => 'β', + '𝞬' => 'γ', + '𝞭' => 'δ', + '𝞮' => 'ε', + '𝞯' => 'ζ', + '𝞰' => 'η', + '𝞱' => 'θ', + '𝞲' => 'ι', + '𝞳' => 'κ', + '𝞴' => 'λ', + '𝞵' => 'μ', + '𝞶' => 'ν', + '𝞷' => 'ξ', + '𝞸' => 'ο', + '𝞹' => 'π', + '𝞺' => 'ρ', + '𝞻' => 'ς', + '𝞼' => 'σ', + '𝞽' => 'τ', + '𝞾' => 'υ', + '𝞿' => 'φ', + '𝟀' => 'χ', + '𝟁' => 'ψ', + '𝟂' => 'ω', + '𝟃' => '∂', + '𝟄' => 'ε', + '𝟅' => 'θ', + '𝟆' => 'κ', + '𝟇' => 'φ', + '𝟈' => 'ρ', + '𝟉' => 'π', + '𝟊' => 'Ϝ', + '𝟋' => 'ϝ', + '𝟎' => '0', + '𝟏' => '1', + '𝟐' => '2', + '𝟑' => '3', + '𝟒' => '4', + '𝟓' => '5', + '𝟔' => '6', + '𝟕' => '7', + '𝟖' => '8', + '𝟗' => '9', + '𝟘' => '0', + '𝟙' => '1', + '𝟚' => '2', + '𝟛' => '3', + '𝟜' => '4', + '𝟝' => '5', + '𝟞' => '6', + '𝟟' => '7', + '𝟠' => '8', + '𝟡' => '9', + '𝟢' => '0', + '𝟣' => '1', + '𝟤' => '2', + '𝟥' => '3', + '𝟦' => '4', + '𝟧' => '5', + '𝟨' => '6', + '𝟩' => '7', + '𝟪' => '8', + '𝟫' => '9', + '𝟬' => '0', + '𝟭' => '1', + '𝟮' => '2', + '𝟯' => '3', + '𝟰' => '4', + '𝟱' => '5', + '𝟲' => '6', + '𝟳' => '7', + '𝟴' => '8', + '𝟵' => '9', + '𝟶' => '0', + '𝟷' => '1', + '𝟸' => '2', + '𝟹' => '3', + '𝟺' => '4', + '𝟻' => '5', + '𝟼' => '6', + '𝟽' => '7', + '𝟾' => '8', + '𝟿' => '9', + '𞸀' => 'ا', + '𞸁' => 'ب', + '𞸂' => 'ج', + '𞸃' => 'د', + '𞸅' => 'و', + '𞸆' => 'ز', + '𞸇' => 'ح', + '𞸈' => 'ط', + '𞸉' => 'ي', + '𞸊' => 'ك', + '𞸋' => 'ل', + '𞸌' => 'م', + '𞸍' => 'ن', + '𞸎' => 'س', + '𞸏' => 'ع', + '𞸐' => 'ف', + '𞸑' => 'ص', + '𞸒' => 'ق', + '𞸓' => 'ر', + '𞸔' => 'ش', + '𞸕' => 'ت', + '𞸖' => 'ث', + '𞸗' => 'خ', + '𞸘' => 'ذ', + '𞸙' => 'ض', + '𞸚' => 'ظ', + '𞸛' => 'غ', + '𞸜' => 'ٮ', + '𞸝' => 'ں', + '𞸞' => 'ڡ', + '𞸟' => 'ٯ', + '𞸡' => 'ب', + '𞸢' => 'ج', + '𞸤' => 'ه', + '𞸧' => 'ح', + '𞸩' => 'ي', + '𞸪' => 'ك', + '𞸫' => 'ل', + '𞸬' => 'م', + '𞸭' => 'ن', + '𞸮' => 'س', + '𞸯' => 'ع', + '𞸰' => 'ف', + '𞸱' => 'ص', + '𞸲' => 'ق', + '𞸴' => 'ش', + '𞸵' => 'ت', + '𞸶' => 'ث', + '𞸷' => 'خ', + '𞸹' => 'ض', + '𞸻' => 'غ', + '𞹂' => 'ج', + '𞹇' => 'ح', + '𞹉' => 'ي', + '𞹋' => 'ل', + '𞹍' => 'ن', + '𞹎' => 'س', + '𞹏' => 'ع', + '𞹑' => 'ص', + '𞹒' => 'ق', + '𞹔' => 'ش', + '𞹗' => 'خ', + '𞹙' => 'ض', + '𞹛' => 'غ', + '𞹝' => 'ں', + '𞹟' => 'ٯ', + '𞹡' => 'ب', + '𞹢' => 'ج', + '𞹤' => 'ه', + '𞹧' => 'ح', + '𞹨' => 'ط', + '𞹩' => 'ي', + '𞹪' => 'ك', + '𞹬' => 'م', + '𞹭' => 'ن', + '𞹮' => 'س', + '𞹯' => 'ع', + '𞹰' => 'ف', + '𞹱' => 'ص', + '𞹲' => 'ق', + '𞹴' => 'ش', + '𞹵' => 'ت', + '𞹶' => 'ث', + '𞹷' => 'خ', + '𞹹' => 'ض', + '𞹺' => 'ظ', + '𞹻' => 'غ', + '𞹼' => 'ٮ', + '𞹾' => 'ڡ', + '𞺀' => 'ا', + '𞺁' => 'ب', + '𞺂' => 'ج', + '𞺃' => 'د', + '𞺄' => 'ه', + '𞺅' => 'و', + '𞺆' => 'ز', + '𞺇' => 'ح', + '𞺈' => 'ط', + '𞺉' => 'ي', + '𞺋' => 'ل', + '𞺌' => 'م', + '𞺍' => 'ن', + '𞺎' => 'س', + '𞺏' => 'ع', + '𞺐' => 'ف', + '𞺑' => 'ص', + '𞺒' => 'ق', + '𞺓' => 'ر', + '𞺔' => 'ش', + '𞺕' => 'ت', + '𞺖' => 'ث', + '𞺗' => 'خ', + '𞺘' => 'ذ', + '𞺙' => 'ض', + '𞺚' => 'ظ', + '𞺛' => 'غ', + '𞺡' => 'ب', + '𞺢' => 'ج', + '𞺣' => 'د', + '𞺥' => 'و', + '𞺦' => 'ز', + '𞺧' => 'ح', + '𞺨' => 'ط', + '𞺩' => 'ي', + '𞺫' => 'ل', + '𞺬' => 'م', + '𞺭' => 'ن', + '𞺮' => 'س', + '𞺯' => 'ع', + '𞺰' => 'ف', + '𞺱' => 'ص', + '𞺲' => 'ق', + '𞺳' => 'ر', + '𞺴' => 'ش', + '𞺵' => 'ت', + '𞺶' => 'ث', + '𞺷' => 'خ', + '𞺸' => 'ذ', + '𞺹' => 'ض', + '𞺺' => 'ظ', + '𞺻' => 'غ', + '🄀' => '0.', + '🄁' => '0,', + '🄂' => '1,', + '🄃' => '2,', + '🄄' => '3,', + '🄅' => '4,', + '🄆' => '5,', + '🄇' => '6,', + '🄈' => '7,', + '🄉' => '8,', + '🄊' => '9,', + '🄐' => '(A)', + '🄑' => '(B)', + '🄒' => '(C)', + '🄓' => '(D)', + '🄔' => '(E)', + '🄕' => '(F)', + '🄖' => '(G)', + '🄗' => '(H)', + '🄘' => '(I)', + '🄙' => '(J)', + '🄚' => '(K)', + '🄛' => '(L)', + '🄜' => '(M)', + '🄝' => '(N)', + '🄞' => '(O)', + '🄟' => '(P)', + '🄠' => '(Q)', + '🄡' => '(R)', + '🄢' => '(S)', + '🄣' => '(T)', + '🄤' => '(U)', + '🄥' => '(V)', + '🄦' => '(W)', + '🄧' => '(X)', + '🄨' => '(Y)', + '🄩' => '(Z)', + '🄪' => '〔S〕', + '🄫' => 'C', + '🄬' => 'R', + '🄭' => 'CD', + '🄮' => 'WZ', + '🄰' => 'A', + '🄱' => 'B', + '🄲' => 'C', + '🄳' => 'D', + '🄴' => 'E', + '🄵' => 'F', + '🄶' => 'G', + '🄷' => 'H', + '🄸' => 'I', + '🄹' => 'J', + '🄺' => 'K', + '🄻' => 'L', + '🄼' => 'M', + '🄽' => 'N', + '🄾' => 'O', + '🄿' => 'P', + '🅀' => 'Q', + '🅁' => 'R', + '🅂' => 'S', + '🅃' => 'T', + '🅄' => 'U', + '🅅' => 'V', + '🅆' => 'W', + '🅇' => 'X', + '🅈' => 'Y', + '🅉' => 'Z', + '🅊' => 'HV', + '🅋' => 'MV', + '🅌' => 'SD', + '🅍' => 'SS', + '🅎' => 'PPV', + '🅏' => 'WC', + '🅪' => 'MC', + '🅫' => 'MD', + '🅬' => 'MR', + '🆐' => 'DJ', + '🈀' => 'ほか', + '🈁' => 'ココ', + '🈂' => 'サ', + '🈐' => '手', + '🈑' => '字', + '🈒' => '双', + '🈓' => 'デ', + '🈔' => '二', + '🈕' => '多', + '🈖' => '解', + '🈗' => '天', + '🈘' => '交', + '🈙' => '映', + '🈚' => '無', + '🈛' => '料', + '🈜' => '前', + '🈝' => '後', + '🈞' => '再', + '🈟' => '新', + '🈠' => '初', + '🈡' => '終', + '🈢' => '生', + '🈣' => '販', + '🈤' => '声', + '🈥' => '吹', + '🈦' => '演', + '🈧' => '投', + '🈨' => '捕', + '🈩' => '一', + '🈪' => '三', + '🈫' => '遊', + '🈬' => '左', + '🈭' => '中', + '🈮' => '右', + '🈯' => '指', + '🈰' => '走', + '🈱' => '打', + '🈲' => '禁', + '🈳' => '空', + '🈴' => '合', + '🈵' => '満', + '🈶' => '有', + '🈷' => '月', + '🈸' => '申', + '🈹' => '割', + '🈺' => '営', + '🈻' => '配', + '🉀' => '〔本〕', + '🉁' => '〔三〕', + '🉂' => '〔二〕', + '🉃' => '〔安〕', + '🉄' => '〔点〕', + '🉅' => '〔打〕', + '🉆' => '〔盗〕', + '🉇' => '〔勝〕', + '🉈' => '〔敗〕', + '🉐' => '得', + '🉑' => '可', + '🯰' => '0', + '🯱' => '1', + '🯲' => '2', + '🯳' => '3', + '🯴' => '4', + '🯵' => '5', + '🯶' => '6', + '🯷' => '7', + '🯸' => '8', + '🯹' => '9', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/bootstrap.php b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php new file mode 100644 index 00000000..bac4318c --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Normalizer as p; + +if (!function_exists('normalizer_is_normalized')) { + function normalizer_is_normalized($input, $form = p\Normalizer::NFC) { return p\Normalizer::isNormalized($input, $form); } +} +if (!function_exists('normalizer_normalize')) { + function normalizer_normalize($input, $form = p\Normalizer::NFC) { return p\Normalizer::normalize($input, $form); } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/composer.json b/vendor/symfony/polyfill-intl-normalizer/composer.json new file mode 100644 index 00000000..873abd3e --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -0,0 +1,39 @@ +{ + "name": "symfony/polyfill-intl-normalizer", + "type": "library", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "normalizer"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-php72/LICENSE b/vendor/symfony/polyfill-php72/LICENSE new file mode 100644 index 00000000..4cd8bdd3 --- /dev/null +++ b/vendor/symfony/polyfill-php72/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php new file mode 100644 index 00000000..1e36d5e6 --- /dev/null +++ b/vendor/symfony/polyfill-php72/Php72.php @@ -0,0 +1,217 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php72; + +/** + * @author Nicolas Grekas + * @author Dariusz Rumiński + * + * @internal + */ +final class Php72 +{ + private static $hashMask; + + public static function utf8_encode($s) + { + $s .= $s; + $len = \strlen($s); + + for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { + switch (true) { + case $s[$i] < "\x80": $s[$j] = $s[$i]; break; + case $s[$i] < "\xC0": $s[$j] = "\xC2"; $s[++$j] = $s[$i]; break; + default: $s[$j] = "\xC3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; + } + } + + return substr($s, 0, $j); + } + + public static function utf8_decode($s) + { + $s = (string) $s; + $len = \strlen($s); + + for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { + switch ($s[$i] & "\xF0") { + case "\xC0": + case "\xD0": + $c = (\ord($s[$i] & "\x1F") << 6) | \ord($s[++$i] & "\x3F"); + $s[$j] = $c < 256 ? \chr($c) : '?'; + break; + + case "\xF0": + ++$i; + // no break + + case "\xE0": + $s[$j] = '?'; + $i += 2; + break; + + default: + $s[$j] = $s[$i]; + } + } + + return substr($s, 0, $j); + } + + public static function php_os_family() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + return 'Windows'; + } + + $map = array( + 'Darwin' => 'Darwin', + 'DragonFly' => 'BSD', + 'FreeBSD' => 'BSD', + 'NetBSD' => 'BSD', + 'OpenBSD' => 'BSD', + 'Linux' => 'Linux', + 'SunOS' => 'Solaris', + ); + + return isset($map[PHP_OS]) ? $map[PHP_OS] : 'Unknown'; + } + + public static function spl_object_id($object) + { + if (null === self::$hashMask) { + self::initHashMask(); + } + if (null === $hash = spl_object_hash($object)) { + return; + } + + // On 32-bit systems, PHP_INT_SIZE is 4, + return self::$hashMask ^ hexdec(substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); + } + + public static function sapi_windows_vt100_support($stream, $enable = null) + { + if (!\is_resource($stream)) { + trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); + + return false; + } + + $meta = stream_get_meta_data($stream); + + if ('STDIO' !== $meta['stream_type']) { + trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', E_USER_WARNING); + + return false; + } + + // We cannot actually disable vt100 support if it is set + if (false === $enable || !self::stream_isatty($stream)) { + return false; + } + + // The native function does not apply to stdin + $meta = array_map('strtolower', $meta); + $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; + + return !$stdin + && (false !== getenv('ANSICON') + || 'ON' === getenv('ConEmuANSI') + || 'xterm' === getenv('TERM') + || 'Hyper' === getenv('TERM_PROGRAM')); + } + + public static function stream_isatty($stream) + { + if (!\is_resource($stream)) { + trigger_error('stream_isatty() expects parameter 1 to be resource, '.\gettype($stream).' given', E_USER_WARNING); + + return false; + } + + if ('\\' === \DIRECTORY_SEPARATOR) { + $stat = @fstat($stream); + // Check if formatted mode is S_IFCHR + return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; + } + + return \function_exists('posix_isatty') && @posix_isatty($stream); + } + + private static function initHashMask() + { + $obj = (object) array(); + self::$hashMask = -1; + + // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below + $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); + foreach (debug_backtrace(\PHP_VERSION_ID >= 50400 ? DEBUG_BACKTRACE_IGNORE_ARGS : false) as $frame) { + if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { + $frame['line'] = 0; + break; + } + } + if (!empty($frame['line'])) { + ob_start(); + debug_zval_dump($obj); + self::$hashMask = (int) substr(ob_get_clean(), 17); + } + + self::$hashMask ^= hexdec(substr(spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), (\PHP_INT_SIZE * 2 - 1))); + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if (null === $encoding) { + $s = mb_convert_encoding($s, 'UTF-8'); + } elseif ('UTF-8' !== $encoding) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } +} diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md new file mode 100644 index 00000000..59dec8a2 --- /dev/null +++ b/vendor/symfony/polyfill-php72/README.md @@ -0,0 +1,28 @@ +Symfony Polyfill / Php72 +======================== + +This component provides functions added to PHP 7.2 core: + +- [`spl_object_id`](https://php.net/spl_object_id) +- [`stream_isatty`](https://php.net/stream_isatty) + +On Windows only: + +- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) + +Moved to core since 7.2 (was in the optional XML extension earlier): + +- [`utf8_encode`](https://php.net/utf8_encode) +- [`utf8_decode`](https://php.net/utf8_decode) + +Also, it provides constants added to PHP 7.2: +- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) +- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php new file mode 100644 index 00000000..3154b2c3 --- /dev/null +++ b/vendor/symfony/polyfill-php72/bootstrap.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php72 as p; + +if (PHP_VERSION_ID >= 70200) { + return; +} + +if (!defined('PHP_FLOAT_DIG')) { + define('PHP_FLOAT_DIG', 15); +} +if (!defined('PHP_FLOAT_EPSILON')) { + define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); +} +if (!defined('PHP_FLOAT_MIN')) { + define('PHP_FLOAT_MIN', 2.2250738585072E-308); +} +if (!defined('PHP_FLOAT_MAX')) { + define('PHP_FLOAT_MAX', 1.7976931348623157E+308); +} +if (!defined('PHP_OS_FAMILY')) { + define('PHP_OS_FAMILY', p\Php72::php_os_family()); +} + +if ('\\' === DIRECTORY_SEPARATOR && !function_exists('sapi_windows_vt100_support')) { + function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } +} +if (!function_exists('stream_isatty')) { + function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } +} +if (!function_exists('utf8_encode')) { + function utf8_encode($string) { return p\Php72::utf8_encode($string); } +} +if (!function_exists('utf8_decode')) { + function utf8_decode($string) { return p\Php72::utf8_decode($string); } +} +if (!function_exists('spl_object_id')) { + function spl_object_id($object) { return p\Php72::spl_object_id($object); } +} +if (!function_exists('mb_ord')) { + function mb_ord($string, $encoding = null) { return p\Php72::mb_ord($string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr($codepoint, $encoding = null) { return p\Php72::mb_chr($codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } +} diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json new file mode 100644 index 00000000..994443a4 --- /dev/null +++ b/vendor/symfony/polyfill-php72/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/polyfill-php72", + "type": "library", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, + "files": [ "bootstrap.php" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.20-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/serializer/.gitignore b/vendor/symfony/serializer/.gitignore deleted file mode 100644 index c49a5d8d..00000000 --- a/vendor/symfony/serializer/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -vendor/ -composer.lock -phpunit.xml diff --git a/vendor/symfony/serializer/Annotation/DiscriminatorMap.php b/vendor/symfony/serializer/Annotation/DiscriminatorMap.php new file mode 100644 index 00000000..c1184a53 --- /dev/null +++ b/vendor/symfony/serializer/Annotation/DiscriminatorMap.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Annotation; + +use Symfony\Component\Serializer\Exception\InvalidArgumentException; + +/** + * Annotation class for @DiscriminatorMap(). + * + * @Annotation + * @Target({"CLASS"}) + * + * @author Samuel Roze + */ +class DiscriminatorMap +{ + /** + * @var string + */ + private $typeProperty; + + /** + * @var array + */ + private $mapping; + + /** + * @throws InvalidArgumentException + */ + public function __construct(array $data) + { + if (empty($data['typeProperty'])) { + throw new InvalidArgumentException(sprintf('Parameter "typeProperty" of annotation "%s" cannot be empty.', static::class)); + } + + if (empty($data['mapping'])) { + throw new InvalidArgumentException(sprintf('Parameter "mapping" of annotation "%s" cannot be empty.', static::class)); + } + + $this->typeProperty = $data['typeProperty']; + $this->mapping = $data['mapping']; + } + + public function getTypeProperty(): string + { + return $this->typeProperty; + } + + public function getMapping(): array + { + return $this->mapping; + } +} diff --git a/vendor/symfony/serializer/Annotation/Groups.php b/vendor/symfony/serializer/Annotation/Groups.php index 7a9b0bd2..4358a3e2 100644 --- a/vendor/symfony/serializer/Annotation/Groups.php +++ b/vendor/symfony/serializer/Annotation/Groups.php @@ -34,13 +34,13 @@ class Groups public function __construct(array $data) { if (!isset($data['value']) || !$data['value']) { - throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" cannot be empty.', \get_class($this))); + throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" cannot be empty.', static::class)); } $value = (array) $data['value']; foreach ($value as $group) { if (!\is_string($group)) { - throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" must be a string or an array of strings.', \get_class($this))); + throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" must be a string or an array of strings.', static::class)); } } diff --git a/vendor/symfony/serializer/Annotation/MaxDepth.php b/vendor/symfony/serializer/Annotation/MaxDepth.php index 1f41948d..9939fdab 100644 --- a/vendor/symfony/serializer/Annotation/MaxDepth.php +++ b/vendor/symfony/serializer/Annotation/MaxDepth.php @@ -31,11 +31,11 @@ class MaxDepth public function __construct(array $data) { if (!isset($data['value'])) { - throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" should be set.', get_class($this))); + throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" should be set.', static::class)); } - if (!is_int($data['value']) || $data['value'] <= 0) { - throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" must be a positive integer.', get_class($this))); + if (!\is_int($data['value']) || $data['value'] <= 0) { + throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" must be a positive integer.', static::class)); } $this->maxDepth = $data['value']; diff --git a/vendor/symfony/serializer/Annotation/SerializedName.php b/vendor/symfony/serializer/Annotation/SerializedName.php new file mode 100644 index 00000000..747c8c55 --- /dev/null +++ b/vendor/symfony/serializer/Annotation/SerializedName.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Annotation; + +use Symfony\Component\Serializer\Exception\InvalidArgumentException; + +/** + * Annotation class for @SerializedName(). + * + * @Annotation + * @Target({"PROPERTY", "METHOD"}) + * + * @author Fabien Bourigault + */ +final class SerializedName +{ + /** + * @var string + */ + private $serializedName; + + public function __construct(array $data) + { + if (!isset($data['value'])) { + throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" should be set.', static::class)); + } + + if (!\is_string($data['value']) || empty($data['value'])) { + throw new InvalidArgumentException(sprintf('Parameter of annotation "%s" must be a non-empty string.', static::class)); + } + + $this->serializedName = $data['value']; + } + + public function getSerializedName(): string + { + return $this->serializedName; + } +} diff --git a/vendor/symfony/serializer/CHANGELOG.md b/vendor/symfony/serializer/CHANGELOG.md index 450640d1..7f213186 100644 --- a/vendor/symfony/serializer/CHANGELOG.md +++ b/vendor/symfony/serializer/CHANGELOG.md @@ -1,6 +1,81 @@ CHANGELOG ========= +4.4.0 +----- + + * deprecated the `XmlEncoder::TYPE_CASE_ATTRIBUTES` constant, use `XmlEncoder::TYPE_CAST_ATTRIBUTES` instead + * added option to output a UTF-8 BOM in CSV encoder via `CsvEncoder::OUTPUT_UTF8_BOM_KEY` context option + * added `ProblemNormalizer` to normalize errors according to the API Problem spec (RFC 7807) + +4.3.0 +----- + + * added the list of constraint violations' parameters in `ConstraintViolationListNormalizer` + * added support for serializing `DateTimeZone` objects + * added a `deep_object_to_populate` context option to recursive denormalize on `object_to_populate` object. + +4.2.0 +----- + + * using the default context is the new recommended way to configure normalizers and encoders + * added a `skip_null_values` context option to not serialize properties with a `null` values + * `AbstractNormalizer::handleCircularReference` is now final and receives + two optional extra arguments: the format and the context + * added support for XML comment encoding (encoding `['#comment' => ' foo ']` results ``) + * added optional `int[] $encoderIgnoredNodeTypes` argument to `XmlEncoder::__construct` + to configure node types to be ignored during encoding + * added `AdvancedNameConverterInterface` to access the class, + the format and the context in a name converter + * the `AbstractNormalizer::handleCircularReference()` method will have two new `$format` + and `$context` arguments in version 5.0, not defining them is deprecated + * deprecated creating a `Serializer` with normalizers which do not implement + either `NormalizerInterface` or `DenormalizerInterface` + * deprecated creating a `Serializer` with normalizers which do not implement + either `NormalizerInterface` or `DenormalizerInterface` + * deprecated creating a `Serializer` with encoders which do not implement + either `EncoderInterface` or `DecoderInterface` + * added the optional `$objectClassResolver` argument in `AbstractObjectNormalizer` + and `ObjectNormalizer` constructor + * added `MetadataAwareNameConverter` to configure the serialized name of properties through metadata + * `YamlEncoder` now handles the `.yml` extension too + * `AbstractNormalizer::$circularReferenceLimit`, `AbstractNormalizer::$circularReferenceHandler`, + `AbstractNormalizer::$callbacks`, `AbstractNormalizer::$ignoredAttributes`, + `AbstractNormalizer::$camelizedAttributes`, `AbstractNormalizer::setCircularReferenceLimit()`, + `AbstractNormalizer::setCircularReferenceHandler()`, `AbstractNormalizer::setCallbacks()` and + `AbstractNormalizer::setIgnoredAttributes()` are deprecated, use the default context instead. + * `AbstractObjectNormalizer::$maxDepthHandler` and `AbstractObjectNormalizer::setMaxDepthHandler()` + are deprecated, use the default context instead. + * passing configuration options directly to the constructor of `CsvEncoder`, `JsonDecode` and + `XmlEncoder` is deprecated since Symfony 4.2, use the default context instead. + +4.1.0 +----- + + * added `CacheableSupportsMethodInterface` for normalizers and denormalizers that use + only the type and the format in their `supports*()` methods + * added `MissingConstructorArgumentsException` new exception for deserialization failure + of objects that needs data insertion in constructor + * added an optional `default_constructor_arguments` option of context to specify a default data in + case the object is not initializable by its constructor because of data missing + * added optional `bool $escapeFormulas = false` argument to `CsvEncoder::__construct` + * added `AbstractObjectNormalizer::setMaxDepthHandler` to set a handler to call when the configured + maximum depth is reached + * added optional `int[] $ignoredNodeTypes` argument to `XmlEncoder::__construct`. XML decoding now + ignores comment node types by default. + * added `ConstraintViolationListNormalizer` + +4.0.0 +----- + + * removed the `SerializerAwareEncoder` and `SerializerAwareNormalizer` classes, + use the `SerializerAwareTrait` instead + * removed the `Serializer::$normalizerCache` and `Serializer::$denormalizerCache` + properties + * added an optional `string $format = null` argument to `AbstractNormalizer::instantiateObject` + * added an optional `array $context = []` to `Serializer::supportsNormalization`, `Serializer::supportsDenormalization`, + `Serializer::supportsEncoding` and `Serializer::supportsDecoding` + 3.4.0 ----- @@ -9,7 +84,7 @@ CHANGELOG * added support for serializing `DateInterval` objects * added getter for extra attributes in `ExtraAttributesException` * improved `CsvEncoder` to handle variable nested structures - * CSV headers can be passed to the `CsvEncoder` via the `csv_headers` serialization context variable + * CSV headers can be passed to the `CsvEncoder` via the `csv_headers` serialization context variable * added `$context` when checking for encoding, decoding and normalizing in `Serializer` 3.3.0 @@ -70,7 +145,7 @@ CHANGELOG * added `$context` support for XMLEncoder. * [DEPRECATION] JsonEncode and JsonDecode where modified to throw - an exception if error found. No need for get*Error() functions + an exception if error found. No need for `get*Error()` functions 2.3.0 ----- diff --git a/vendor/symfony/serializer/DependencyInjection/SerializerPass.php b/vendor/symfony/serializer/DependencyInjection/SerializerPass.php index e6202b8b..155a6f00 100644 --- a/vendor/symfony/serializer/DependencyInjection/SerializerPass.php +++ b/vendor/symfony/serializer/DependencyInjection/SerializerPass.php @@ -11,9 +11,9 @@ namespace Symfony\Component\Serializer\DependencyInjection; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Exception\RuntimeException; /** @@ -31,7 +31,7 @@ class SerializerPass implements CompilerPassInterface private $normalizerTag; private $encoderTag; - public function __construct($serializerService = 'serializer', $normalizerTag = 'serializer.normalizer', $encoderTag = 'serializer.encoder') + public function __construct(string $serializerService = 'serializer', string $normalizerTag = 'serializer.normalizer', string $encoderTag = 'serializer.encoder') { $this->serializerService = $serializerService; $this->normalizerTag = $normalizerTag; diff --git a/vendor/symfony/serializer/Encoder/ChainDecoder.php b/vendor/symfony/serializer/Encoder/ChainDecoder.php index 7c967cfd..2a55d93a 100644 --- a/vendor/symfony/serializer/Encoder/ChainDecoder.php +++ b/vendor/symfony/serializer/Encoder/ChainDecoder.php @@ -20,14 +20,14 @@ * @author Johannes M. Schmitt * @author Lukas Kahwe Smith * - * @final since version 3.3. + * @final */ -class ChainDecoder implements DecoderInterface /*, ContextAwareDecoderInterface*/ +class ChainDecoder implements ContextAwareDecoderInterface { - protected $decoders = array(); - protected $decoderByFormat = array(); + protected $decoders = []; + protected $decoderByFormat = []; - public function __construct(array $decoders = array()) + public function __construct(array $decoders = []) { $this->decoders = $decoders; } @@ -35,7 +35,7 @@ public function __construct(array $decoders = array()) /** * {@inheritdoc} */ - final public function decode($data, $format, array $context = array()) + final public function decode($data, $format, array $context = []) { return $this->getDecoder($format, $context)->decode($data, $format, $context); } @@ -43,10 +43,8 @@ final public function decode($data, $format, array $context = array()) /** * {@inheritdoc} */ - public function supportsDecoding($format/*, array $context = array()*/) + public function supportsDecoding($format, array $context = []): bool { - $context = func_num_args() > 1 ? func_get_arg(1) : array(); - try { $this->getDecoder($format, $context); } catch (RuntimeException $e) { @@ -59,14 +57,9 @@ public function supportsDecoding($format/*, array $context = array()*/) /** * Gets the decoder supporting the format. * - * @param string $format - * @param array $context - * - * @return DecoderInterface - * * @throws RuntimeException if no decoder is found */ - private function getDecoder($format, array $context) + private function getDecoder(string $format, array $context): DecoderInterface { if (isset($this->decoderByFormat[$format]) && isset($this->decoders[$this->decoderByFormat[$format]]) diff --git a/vendor/symfony/serializer/Encoder/ChainEncoder.php b/vendor/symfony/serializer/Encoder/ChainEncoder.php index cfd8855b..b13333e8 100644 --- a/vendor/symfony/serializer/Encoder/ChainEncoder.php +++ b/vendor/symfony/serializer/Encoder/ChainEncoder.php @@ -20,14 +20,14 @@ * @author Johannes M. Schmitt * @author Lukas Kahwe Smith * - * @final since version 3.3. + * @final */ -class ChainEncoder implements EncoderInterface /*, ContextAwareEncoderInterface*/ +class ChainEncoder implements ContextAwareEncoderInterface { - protected $encoders = array(); - protected $encoderByFormat = array(); + protected $encoders = []; + protected $encoderByFormat = []; - public function __construct(array $encoders = array()) + public function __construct(array $encoders = []) { $this->encoders = $encoders; } @@ -35,7 +35,7 @@ public function __construct(array $encoders = array()) /** * {@inheritdoc} */ - final public function encode($data, $format, array $context = array()) + final public function encode($data, $format, array $context = []) { return $this->getEncoder($format, $context)->encode($data, $format, $context); } @@ -43,10 +43,8 @@ final public function encode($data, $format, array $context = array()) /** * {@inheritdoc} */ - public function supportsEncoding($format/*, array $context = array()*/) + public function supportsEncoding($format, array $context = []): bool { - $context = func_num_args() > 1 ? func_get_arg(1) : array(); - try { $this->getEncoder($format, $context); } catch (RuntimeException $e) { @@ -58,15 +56,9 @@ public function supportsEncoding($format/*, array $context = array()*/) /** * Checks whether the normalization is needed for the given format. - * - * @param string $format - * @param array $context - * - * @return bool */ - public function needsNormalization($format/*, array $context = array()*/) + public function needsNormalization(string $format, array $context = []): bool { - $context = func_num_args() > 1 ? func_get_arg(1) : array(); $encoder = $this->getEncoder($format, $context); if (!$encoder instanceof NormalizationAwareInterface) { @@ -83,14 +75,9 @@ public function needsNormalization($format/*, array $context = array()*/) /** * Gets the encoder supporting the format. * - * @param string $format - * @param array $context - * - * @return EncoderInterface - * * @throws RuntimeException if no encoder is found */ - private function getEncoder($format, array $context) + private function getEncoder(string $format, array $context): EncoderInterface { if (isset($this->encoderByFormat[$format]) && isset($this->encoders[$this->encoderByFormat[$format]]) diff --git a/vendor/symfony/serializer/Encoder/ContextAwareDecoderInterface.php b/vendor/symfony/serializer/Encoder/ContextAwareDecoderInterface.php index eefea0ec..5ef89d55 100644 --- a/vendor/symfony/serializer/Encoder/ContextAwareDecoderInterface.php +++ b/vendor/symfony/serializer/Encoder/ContextAwareDecoderInterface.php @@ -23,5 +23,5 @@ interface ContextAwareDecoderInterface extends DecoderInterface * * @param array $context options that decoders have access to */ - public function supportsDecoding($format, array $context = array()); + public function supportsDecoding($format, array $context = []); } diff --git a/vendor/symfony/serializer/Encoder/ContextAwareEncoderInterface.php b/vendor/symfony/serializer/Encoder/ContextAwareEncoderInterface.php index 0268df3d..a8893a80 100644 --- a/vendor/symfony/serializer/Encoder/ContextAwareEncoderInterface.php +++ b/vendor/symfony/serializer/Encoder/ContextAwareEncoderInterface.php @@ -23,5 +23,5 @@ interface ContextAwareEncoderInterface extends EncoderInterface * * @param array $context options that encoders have access to */ - public function supportsEncoding($format, array $context = array()); + public function supportsEncoding($format, array $context = []); } diff --git a/vendor/symfony/serializer/Encoder/CsvEncoder.php b/vendor/symfony/serializer/Encoder/CsvEncoder.php index cce2c14a..dfe3fbfc 100644 --- a/vendor/symfony/serializer/Encoder/CsvEncoder.php +++ b/vendor/symfony/serializer/Encoder/CsvEncoder.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Serializer\Encoder; use Symfony\Component\Serializer\Exception\InvalidArgumentException; +use Symfony\Component\Serializer\Exception\UnexpectedValueException; /** * Encodes CSV data. @@ -27,43 +28,67 @@ class CsvEncoder implements EncoderInterface, DecoderInterface const ESCAPE_CHAR_KEY = 'csv_escape_char'; const KEY_SEPARATOR_KEY = 'csv_key_separator'; const HEADERS_KEY = 'csv_headers'; - - private $delimiter; - private $enclosure; - private $escapeChar; - private $keySeparator; + const ESCAPE_FORMULAS_KEY = 'csv_escape_formulas'; + const AS_COLLECTION_KEY = 'as_collection'; + const NO_HEADERS_KEY = 'no_headers'; + const OUTPUT_UTF8_BOM_KEY = 'output_utf8_bom'; + + private const UTF8_BOM = "\xEF\xBB\xBF"; + + private $formulasStartCharacters = ['=', '-', '+', '@']; + private $defaultContext = [ + self::DELIMITER_KEY => ',', + self::ENCLOSURE_KEY => '"', + self::ESCAPE_CHAR_KEY => '', + self::ESCAPE_FORMULAS_KEY => false, + self::HEADERS_KEY => [], + self::KEY_SEPARATOR_KEY => '.', + self::NO_HEADERS_KEY => false, + self::AS_COLLECTION_KEY => false, + self::OUTPUT_UTF8_BOM_KEY => false, + ]; /** - * @param string $delimiter - * @param string $enclosure - * @param string $escapeChar - * @param string $keySeparator + * @param array $defaultContext */ - public function __construct($delimiter = ',', $enclosure = '"', $escapeChar = '\\', $keySeparator = '.') + public function __construct($defaultContext = [], string $enclosure = '"', string $escapeChar = '', string $keySeparator = '.', bool $escapeFormulas = false) { - $this->delimiter = $delimiter; - $this->enclosure = $enclosure; - $this->escapeChar = $escapeChar; - $this->keySeparator = $keySeparator; + if (!\is_array($defaultContext)) { + @trigger_error('Passing configuration options directly to the constructor is deprecated since Symfony 4.2, use the default context instead.', \E_USER_DEPRECATED); + + $defaultContext = [ + self::DELIMITER_KEY => (string) $defaultContext, + self::ENCLOSURE_KEY => $enclosure, + self::ESCAPE_CHAR_KEY => $escapeChar, + self::KEY_SEPARATOR_KEY => $keySeparator, + self::ESCAPE_FORMULAS_KEY => $escapeFormulas, + ]; + } + + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); + + if (\PHP_VERSION_ID < 70400 && '' === $this->defaultContext[self::ESCAPE_CHAR_KEY]) { + $this->defaultContext[self::ESCAPE_CHAR_KEY] = '\\'; + } } /** * {@inheritdoc} */ - public function encode($data, $format, array $context = array()) + public function encode($data, $format, array $context = []) { $handle = fopen('php://temp,', 'w+'); - if (!is_array($data)) { - $data = array(array($data)); + if (!is_iterable($data)) { + $data = [[$data]]; } elseif (empty($data)) { - $data = array(array()); + $data = [[]]; } else { // Sequential arrays of arrays are considered as collections $i = 0; foreach ($data as $key => $value) { - if ($i !== $key || !is_array($value)) { - $data = array($data); + if ($i !== $key || !\is_array($value)) { + $data = [$data]; break; } @@ -71,18 +96,20 @@ public function encode($data, $format, array $context = array()) } } - list($delimiter, $enclosure, $escapeChar, $keySeparator, $headers) = $this->getCsvOptions($context); + [$delimiter, $enclosure, $escapeChar, $keySeparator, $headers, $escapeFormulas, $outputBom] = $this->getCsvOptions($context); foreach ($data as &$value) { - $flattened = array(); - $this->flatten($value, $flattened, $keySeparator); + $flattened = []; + $this->flatten($value, $flattened, $keySeparator, '', $escapeFormulas); $value = $flattened; } unset($value); $headers = array_merge(array_values($headers), array_diff($this->extractHeaders($data), $headers)); - fputcsv($handle, $headers, $delimiter, $enclosure, $escapeChar); + if (!($context[self::NO_HEADERS_KEY] ?? $this->defaultContext[self::NO_HEADERS_KEY])) { + fputcsv($handle, $headers, $delimiter, $enclosure, $escapeChar); + } $headers = array_fill_keys($headers, ''); foreach ($data as $row) { @@ -93,6 +120,14 @@ public function encode($data, $format, array $context = array()) $value = stream_get_contents($handle); fclose($handle); + if ($outputBom) { + if (!preg_match('//u', $value)) { + throw new UnexpectedValueException('You are trying to add a UTF-8 BOM to a non UTF-8 text.'); + } + + $value = self::UTF8_BOM.$value; + } + return $value; } @@ -107,35 +142,46 @@ public function supportsEncoding($format) /** * {@inheritdoc} */ - public function decode($data, $format, array $context = array()) + public function decode($data, $format, array $context = []) { $handle = fopen('php://temp', 'r+'); fwrite($handle, $data); rewind($handle); + if (0 === strpos($data, self::UTF8_BOM)) { + fseek($handle, \strlen(self::UTF8_BOM)); + } + $headers = null; $nbHeaders = 0; - $headerCount = array(); - $result = array(); + $headerCount = []; + $result = []; - list($delimiter, $enclosure, $escapeChar, $keySeparator) = $this->getCsvOptions($context); + [$delimiter, $enclosure, $escapeChar, $keySeparator] = $this->getCsvOptions($context); while (false !== ($cols = fgetcsv($handle, 0, $delimiter, $enclosure, $escapeChar))) { - $nbCols = count($cols); + $nbCols = \count($cols); if (null === $headers) { $nbHeaders = $nbCols; - foreach ($cols as $col) { - $header = explode($keySeparator, $col); - $headers[] = $header; - $headerCount[] = count($header); - } + if ($context[self::NO_HEADERS_KEY] ?? $this->defaultContext[self::NO_HEADERS_KEY]) { + for ($i = 0; $i < $nbCols; ++$i) { + $headers[] = [$i]; + } + $headerCount = array_fill(0, $nbCols, 1); + } else { + foreach ($cols as $col) { + $header = explode($keySeparator, $col); + $headers[] = $header; + $headerCount[] = \count($header); + } - continue; + continue; + } } - $item = array(); + $item = []; for ($i = 0; ($i < $nbCols) && ($i < $nbHeaders); ++$i) { $depth = $headerCount[$i]; $arr = &$item; @@ -148,7 +194,7 @@ public function decode($data, $format, array $context = array()) } if (!isset($arr[$headers[$i][$j]])) { - $arr[$headers[$i][$j]] = array(); + $arr[$headers[$i][$j]] = []; } $arr = &$arr[$headers[$i][$j]]; @@ -159,10 +205,18 @@ public function decode($data, $format, array $context = array()) } fclose($handle); + if ($context[self::AS_COLLECTION_KEY] ?? $this->defaultContext[self::AS_COLLECTION_KEY]) { + return $result; + } + if (empty($result) || isset($result[1])) { return $result; } + if (!isset($context['as_collection'])) { + @trigger_error('Relying on the default value (false) of the "as_collection" option is deprecated since 4.2. You should set it to false explicitly instead as true will be the default value in 5.0.', \E_USER_DEPRECATED); + } + // If there is only one data line in the document, return it (the line), the result is not considered as a collection return $result[0]; } @@ -177,45 +231,47 @@ public function supportsDecoding($format) /** * Flattens an array and generates keys including the path. - * - * @param array $array - * @param array $result - * @param string $keySeparator - * @param string $parentKey */ - private function flatten(array $array, array &$result, $keySeparator, $parentKey = '') + private function flatten(iterable $array, array &$result, string $keySeparator, string $parentKey = '', bool $escapeFormulas = false) { foreach ($array as $key => $value) { - if (is_array($value)) { - $this->flatten($value, $result, $keySeparator, $parentKey.$key.$keySeparator); + if (is_iterable($value)) { + $this->flatten($value, $result, $keySeparator, $parentKey.$key.$keySeparator, $escapeFormulas); } else { - $result[$parentKey.$key] = $value; + if ($escapeFormulas && \in_array(substr((string) $value, 0, 1), $this->formulasStartCharacters, true)) { + $result[$parentKey.$key] = "\t".$value; + } else { + // Ensures an actual value is used when dealing with true and false + $result[$parentKey.$key] = false === $value ? 0 : (true === $value ? 1 : $value); + } } } } - private function getCsvOptions(array $context) + private function getCsvOptions(array $context): array { - $delimiter = isset($context[self::DELIMITER_KEY]) ? $context[self::DELIMITER_KEY] : $this->delimiter; - $enclosure = isset($context[self::ENCLOSURE_KEY]) ? $context[self::ENCLOSURE_KEY] : $this->enclosure; - $escapeChar = isset($context[self::ESCAPE_CHAR_KEY]) ? $context[self::ESCAPE_CHAR_KEY] : $this->escapeChar; - $keySeparator = isset($context[self::KEY_SEPARATOR_KEY]) ? $context[self::KEY_SEPARATOR_KEY] : $this->keySeparator; - $headers = isset($context[self::HEADERS_KEY]) ? $context[self::HEADERS_KEY] : array(); - - if (!is_array($headers)) { - throw new InvalidArgumentException(sprintf('The "%s" context variable must be an array or null, given "%s".', self::HEADERS_KEY, gettype($headers))); + $delimiter = $context[self::DELIMITER_KEY] ?? $this->defaultContext[self::DELIMITER_KEY]; + $enclosure = $context[self::ENCLOSURE_KEY] ?? $this->defaultContext[self::ENCLOSURE_KEY]; + $escapeChar = $context[self::ESCAPE_CHAR_KEY] ?? $this->defaultContext[self::ESCAPE_CHAR_KEY]; + $keySeparator = $context[self::KEY_SEPARATOR_KEY] ?? $this->defaultContext[self::KEY_SEPARATOR_KEY]; + $headers = $context[self::HEADERS_KEY] ?? $this->defaultContext[self::HEADERS_KEY]; + $escapeFormulas = $context[self::ESCAPE_FORMULAS_KEY] ?? $this->defaultContext[self::ESCAPE_FORMULAS_KEY]; + $outputBom = $context[self::OUTPUT_UTF8_BOM_KEY] ?? $this->defaultContext[self::OUTPUT_UTF8_BOM_KEY]; + + if (!\is_array($headers)) { + throw new InvalidArgumentException(sprintf('The "%s" context variable must be an array or null, given "%s".', self::HEADERS_KEY, \gettype($headers))); } - return array($delimiter, $enclosure, $escapeChar, $keySeparator, $headers); + return [$delimiter, $enclosure, $escapeChar, $keySeparator, $headers, $escapeFormulas, $outputBom]; } /** * @return string[] */ - private function extractHeaders(array $data) + private function extractHeaders(iterable $data): array { - $headers = array(); - $flippedHeaders = array(); + $headers = []; + $flippedHeaders = []; foreach ($data as $row) { $previousHeader = null; @@ -227,11 +283,11 @@ private function extractHeaders(array $data) } if (null === $previousHeader) { - $n = count($headers); + $n = \count($headers); } else { $n = $flippedHeaders[$previousHeader] + 1; - for ($j = count($headers); $j > $n; --$j) { + for ($j = \count($headers); $j > $n; --$j) { ++$flippedHeaders[$headers[$j] = $headers[$j - 1]]; } } diff --git a/vendor/symfony/serializer/Encoder/DecoderInterface.php b/vendor/symfony/serializer/Encoder/DecoderInterface.php index 0fa57809..9c5a6a43 100644 --- a/vendor/symfony/serializer/Encoder/DecoderInterface.php +++ b/vendor/symfony/serializer/Encoder/DecoderInterface.php @@ -14,8 +14,6 @@ use Symfony\Component\Serializer\Exception\UnexpectedValueException; /** - * Defines the interface of decoders. - * * @author Jordi Boggiano */ interface DecoderInterface @@ -36,7 +34,7 @@ interface DecoderInterface * * @throws UnexpectedValueException */ - public function decode($data, $format, array $context = array()); + public function decode($data, $format, array $context = []); /** * Checks whether the deserializer can decode from given format. diff --git a/vendor/symfony/serializer/Encoder/EncoderInterface.php b/vendor/symfony/serializer/Encoder/EncoderInterface.php index 077e4422..8e5ebbc1 100644 --- a/vendor/symfony/serializer/Encoder/EncoderInterface.php +++ b/vendor/symfony/serializer/Encoder/EncoderInterface.php @@ -14,8 +14,6 @@ use Symfony\Component\Serializer\Exception\UnexpectedValueException; /** - * Defines the interface of encoders. - * * @author Jordi Boggiano */ interface EncoderInterface @@ -31,7 +29,7 @@ interface EncoderInterface * * @throws UnexpectedValueException */ - public function encode($data, $format, array $context = array()); + public function encode($data, $format, array $context = []); /** * Checks whether the serializer can encode to given format. diff --git a/vendor/symfony/serializer/Encoder/JsonDecode.php b/vendor/symfony/serializer/Encoder/JsonDecode.php index bee1f7d4..1b3c9e9c 100644 --- a/vendor/symfony/serializer/Encoder/JsonDecode.php +++ b/vendor/symfony/serializer/Encoder/JsonDecode.php @@ -22,19 +22,41 @@ class JsonDecode implements DecoderInterface { protected $serializer; - private $associative; - private $recursionDepth; + /** + * True to return the result as an associative array, false for a nested stdClass hierarchy. + */ + const ASSOCIATIVE = 'json_decode_associative'; + + const OPTIONS = 'json_decode_options'; + + /** + * Specifies the recursion depth. + */ + const RECURSION_DEPTH = 'json_decode_recursion_depth'; + + private $defaultContext = [ + self::ASSOCIATIVE => false, + self::OPTIONS => 0, + self::RECURSION_DEPTH => 512, + ]; /** * Constructs a new JsonDecode instance. * - * @param bool $associative True to return the result associative array, false for a nested stdClass hierarchy - * @param int $depth Specifies the recursion depth + * @param array $defaultContext */ - public function __construct($associative = false, $depth = 512) + public function __construct($defaultContext = [], int $depth = 512) { - $this->associative = $associative; - $this->recursionDepth = (int) $depth; + if (!\is_array($defaultContext)) { + @trigger_error(sprintf('Using constructor parameters that are not a default context is deprecated since Symfony 4.2, use the "%s" and "%s" keys of the context instead.', self::ASSOCIATIVE, self::RECURSION_DEPTH), \E_USER_DEPRECATED); + + $defaultContext = [ + self::ASSOCIATIVE => (bool) $defaultContext, + self::RECURSION_DEPTH => $depth, + ]; + } + + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); } /** @@ -47,7 +69,7 @@ public function __construct($associative = false, $depth = 512) * The $context array is a simple key=>value array, with the following supported keys: * * json_decode_associative: boolean - * If true, returns the object as associative array. + * If true, returns the object as an associative array. * If false, returns the object as nested stdClass * If not specified, this method will use the default set in JsonDecode::__construct * @@ -56,25 +78,31 @@ public function __construct($associative = false, $depth = 512) * If not specified, this method will use the default set in JsonDecode::__construct * * json_decode_options: integer - * Specifies additional options as per documentation for json_decode. Only supported with PHP 5.4.0 and higher + * Specifies additional options as per documentation for json_decode * * @return mixed * * @throws NotEncodableValueException * - * @see http://php.net/json_decode json_decode + * @see https://php.net/json_decode */ - public function decode($data, $format, array $context = array()) + public function decode($data, $format, array $context = []) { - $context = $this->resolveContext($context); + $associative = $context[self::ASSOCIATIVE] ?? $this->defaultContext[self::ASSOCIATIVE]; + $recursionDepth = $context[self::RECURSION_DEPTH] ?? $this->defaultContext[self::RECURSION_DEPTH]; + $options = $context[self::OPTIONS] ?? $this->defaultContext[self::OPTIONS]; - $associative = $context['json_decode_associative']; - $recursionDepth = $context['json_decode_recursion_depth']; - $options = $context['json_decode_options']; + try { + $decodedData = json_decode($data, $associative, $recursionDepth, $options); + } catch (\JsonException $e) { + throw new NotEncodableValueException($e->getMessage(), 0, $e); + } - $decodedData = json_decode($data, $associative, $recursionDepth, $options); + if (\PHP_VERSION_ID >= 70300 && (\JSON_THROW_ON_ERROR & $options)) { + return $decodedData; + } - if (JSON_ERROR_NONE !== json_last_error()) { + if (\JSON_ERROR_NONE !== json_last_error()) { throw new NotEncodableValueException(json_last_error_msg()); } @@ -88,20 +116,4 @@ public function supportsDecoding($format) { return JsonEncoder::FORMAT === $format; } - - /** - * Merges the default options of the Json Decoder with the passed context. - * - * @return array - */ - private function resolveContext(array $context) - { - $defaultOptions = array( - 'json_decode_associative' => $this->associative, - 'json_decode_recursion_depth' => $this->recursionDepth, - 'json_decode_options' => 0, - ); - - return array_merge($defaultOptions, $context); - } } diff --git a/vendor/symfony/serializer/Encoder/JsonEncode.php b/vendor/symfony/serializer/Encoder/JsonEncode.php index ef084eea..d14e070c 100644 --- a/vendor/symfony/serializer/Encoder/JsonEncode.php +++ b/vendor/symfony/serializer/Encoder/JsonEncode.php @@ -20,11 +20,24 @@ */ class JsonEncode implements EncoderInterface { - private $options; + const OPTIONS = 'json_encode_options'; - public function __construct($bitmask = 0) + private $defaultContext = [ + self::OPTIONS => 0, + ]; + + /** + * @param array $defaultContext + */ + public function __construct($defaultContext = []) { - $this->options = $bitmask; + if (!\is_array($defaultContext)) { + @trigger_error(sprintf('Passing an integer as first parameter of the "%s()" method is deprecated since Symfony 4.2, use the "json_encode_options" key of the context instead.', __METHOD__), \E_USER_DEPRECATED); + + $this->defaultContext[self::OPTIONS] = (int) $defaultContext; + } else { + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); + } } /** @@ -32,13 +45,21 @@ public function __construct($bitmask = 0) * * {@inheritdoc} */ - public function encode($data, $format, array $context = array()) + public function encode($data, $format, array $context = []) { - $context = $this->resolveContext($context); + $options = $context[self::OPTIONS] ?? $this->defaultContext[self::OPTIONS]; + + try { + $encodedJson = json_encode($data, $options); + } catch (\JsonException $e) { + throw new NotEncodableValueException($e->getMessage(), 0, $e); + } - $encodedJson = json_encode($data, $context['json_encode_options']); + if (\PHP_VERSION_ID >= 70300 && (\JSON_THROW_ON_ERROR & $options)) { + return $encodedJson; + } - if (JSON_ERROR_NONE !== json_last_error() && (false === $encodedJson || !($context['json_encode_options'] & JSON_PARTIAL_OUTPUT_ON_ERROR))) { + if (\JSON_ERROR_NONE !== json_last_error() && (false === $encodedJson || !($options & \JSON_PARTIAL_OUTPUT_ON_ERROR))) { throw new NotEncodableValueException(json_last_error_msg()); } @@ -52,14 +73,4 @@ public function supportsEncoding($format) { return JsonEncoder::FORMAT === $format; } - - /** - * Merge default json encode options with context. - * - * @return array - */ - private function resolveContext(array $context = array()) - { - return array_merge(array('json_encode_options' => $this->options), $context); - } } diff --git a/vendor/symfony/serializer/Encoder/JsonEncoder.php b/vendor/symfony/serializer/Encoder/JsonEncoder.php index f4950cb3..8cb98acc 100644 --- a/vendor/symfony/serializer/Encoder/JsonEncoder.php +++ b/vendor/symfony/serializer/Encoder/JsonEncoder.php @@ -26,13 +26,13 @@ class JsonEncoder implements EncoderInterface, DecoderInterface public function __construct(JsonEncode $encodingImpl = null, JsonDecode $decodingImpl = null) { $this->encodingImpl = $encodingImpl ?: new JsonEncode(); - $this->decodingImpl = $decodingImpl ?: new JsonDecode(true); + $this->decodingImpl = $decodingImpl ?: new JsonDecode([JsonDecode::ASSOCIATIVE => true]); } /** * {@inheritdoc} */ - public function encode($data, $format, array $context = array()) + public function encode($data, $format, array $context = []) { return $this->encodingImpl->encode($data, self::FORMAT, $context); } @@ -40,7 +40,7 @@ public function encode($data, $format, array $context = array()) /** * {@inheritdoc} */ - public function decode($data, $format, array $context = array()) + public function decode($data, $format, array $context = []) { return $this->decodingImpl->decode($data, self::FORMAT, $context); } diff --git a/vendor/symfony/serializer/Encoder/SerializerAwareEncoder.php b/vendor/symfony/serializer/Encoder/SerializerAwareEncoder.php deleted file mode 100644 index 873af922..00000000 --- a/vendor/symfony/serializer/Encoder/SerializerAwareEncoder.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Encoder; - -use Symfony\Component\Serializer\SerializerAwareInterface; -use Symfony\Component\Serializer\SerializerAwareTrait; - -/** - * SerializerAware Encoder implementation. - * - * @author Jordi Boggiano - * - * @deprecated since version 3.2, to be removed in 4.0. Use the SerializerAwareTrait instead. - */ -abstract class SerializerAwareEncoder implements SerializerAwareInterface -{ - use SerializerAwareTrait; -} diff --git a/vendor/symfony/serializer/Encoder/XmlEncoder.php b/vendor/symfony/serializer/Encoder/XmlEncoder.php index 96578c6b..d288b78c 100644 --- a/vendor/symfony/serializer/Encoder/XmlEncoder.php +++ b/vendor/symfony/serializer/Encoder/XmlEncoder.php @@ -11,7 +11,10 @@ namespace Symfony\Component\Serializer\Encoder; +use Symfony\Component\Serializer\Exception\BadMethodCallException; use Symfony\Component\Serializer\Exception\NotEncodableValueException; +use Symfony\Component\Serializer\SerializerAwareInterface; +use Symfony\Component\Serializer\SerializerAwareTrait; /** * Encodes XML data. @@ -20,42 +23,89 @@ * @author John Wards * @author Fabian Vogler * @author Kévin Dunglas + * @author Dany Maillard */ -class XmlEncoder extends SerializerAwareEncoder implements EncoderInterface, DecoderInterface, NormalizationAwareInterface +class XmlEncoder implements EncoderInterface, DecoderInterface, NormalizationAwareInterface, SerializerAwareInterface { + use SerializerAwareTrait; + const FORMAT = 'xml'; + const AS_COLLECTION = 'as_collection'; + + /** + * An array of ignored XML node types while decoding, each one of the DOM Predefined XML_* constants. + */ + const DECODER_IGNORED_NODE_TYPES = 'decoder_ignored_node_types'; + + /** + * An array of ignored XML node types while encoding, each one of the DOM Predefined XML_* constants. + */ + const ENCODER_IGNORED_NODE_TYPES = 'encoder_ignored_node_types'; + const ENCODING = 'xml_encoding'; + const FORMAT_OUTPUT = 'xml_format_output'; + + /** + * A bit field of LIBXML_* constants. + */ + const LOAD_OPTIONS = 'load_options'; + const REMOVE_EMPTY_TAGS = 'remove_empty_tags'; + const ROOT_NODE_NAME = 'xml_root_node_name'; + const STANDALONE = 'xml_standalone'; + + /** @deprecated The constant TYPE_CASE_ATTRIBUTES is deprecated since version 4.4 and will be removed in version 5. Use TYPE_CAST_ATTRIBUTES instead. */ + const TYPE_CASE_ATTRIBUTES = 'xml_type_cast_attributes'; + const TYPE_CAST_ATTRIBUTES = 'xml_type_cast_attributes'; + const VERSION = 'xml_version'; + + private $defaultContext = [ + self::AS_COLLECTION => false, + self::DECODER_IGNORED_NODE_TYPES => [\XML_PI_NODE, \XML_COMMENT_NODE], + self::ENCODER_IGNORED_NODE_TYPES => [], + self::LOAD_OPTIONS => \LIBXML_NONET | \LIBXML_NOBLANKS, + self::REMOVE_EMPTY_TAGS => false, + self::ROOT_NODE_NAME => 'response', + self::TYPE_CAST_ATTRIBUTES => true, + ]; + /** * @var \DOMDocument */ private $dom; private $format; private $context; - private $rootNodeName = 'response'; - private $loadOptions; /** - * Construct new XmlEncoder and allow to change the root node element name. - * - * @param string $rootNodeName - * @param int|null $loadOptions A bit field of LIBXML_* constants + * @param array $defaultContext */ - public function __construct($rootNodeName = 'response', $loadOptions = null) + public function __construct($defaultContext = [], int $loadOptions = null, array $decoderIgnoredNodeTypes = [\XML_PI_NODE, \XML_COMMENT_NODE], array $encoderIgnoredNodeTypes = []) { - $this->rootNodeName = $rootNodeName; - $this->loadOptions = null !== $loadOptions ? $loadOptions : LIBXML_NONET | LIBXML_NOBLANKS; + if (!\is_array($defaultContext)) { + @trigger_error('Passing configuration options directly to the constructor is deprecated since Symfony 4.2, use the default context instead.', \E_USER_DEPRECATED); + + $defaultContext = [ + self::DECODER_IGNORED_NODE_TYPES => $decoderIgnoredNodeTypes, + self::ENCODER_IGNORED_NODE_TYPES => $encoderIgnoredNodeTypes, + self::LOAD_OPTIONS => $loadOptions ?? \LIBXML_NONET | \LIBXML_NOBLANKS, + self::ROOT_NODE_NAME => (string) $defaultContext, + ]; + } + + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); } /** * {@inheritdoc} */ - public function encode($data, $format, array $context = array()) + public function encode($data, $format, array $context = []) { + $encoderIgnoredNodeTypes = $context[self::ENCODER_IGNORED_NODE_TYPES] ?? $this->defaultContext[self::ENCODER_IGNORED_NODE_TYPES]; + $ignorePiNode = \in_array(\XML_PI_NODE, $encoderIgnoredNodeTypes, true); if ($data instanceof \DOMDocument) { - return $data->saveXML(); + return $data->saveXML($ignorePiNode ? $data->documentElement : null); } - $xmlRootNodeName = $this->resolveXmlRootName($context); + $xmlRootNodeName = $context[self::ROOT_NODE_NAME] ?? $this->defaultContext[self::ROOT_NODE_NAME]; $this->dom = $this->createDomDocument($context); $this->format = $format; @@ -69,27 +119,31 @@ public function encode($data, $format, array $context = array()) $this->appendNode($this->dom, $data, $xmlRootNodeName); } - return $this->dom->saveXML(); + return $this->dom->saveXML($ignorePiNode ? $this->dom->documentElement : null); } /** * {@inheritdoc} */ - public function decode($data, $format, array $context = array()) + public function decode($data, $format, array $context = []) { if ('' === trim($data)) { throw new NotEncodableValueException('Invalid XML data, it can not be empty.'); } $internalErrors = libxml_use_internal_errors(true); - $disableEntities = libxml_disable_entity_loader(true); + if (\LIBXML_VERSION < 20900) { + $disableEntities = libxml_disable_entity_loader(true); + } libxml_clear_errors(); $dom = new \DOMDocument(); - $dom->loadXML($data, $this->loadOptions); + $dom->loadXML($data, $context[self::LOAD_OPTIONS] ?? $this->defaultContext[self::LOAD_OPTIONS]); libxml_use_internal_errors($internalErrors); - libxml_disable_entity_loader($disableEntities); + if (\LIBXML_VERSION < 20900) { + libxml_disable_entity_loader($disableEntities); + } if ($error = libxml_get_last_error()) { libxml_clear_errors(); @@ -98,11 +152,12 @@ public function decode($data, $format, array $context = array()) } $rootNode = null; + $decoderIgnoredNodeTypes = $context[self::DECODER_IGNORED_NODE_TYPES] ?? $this->defaultContext[self::DECODER_IGNORED_NODE_TYPES]; foreach ($dom->childNodes as $child) { - if (XML_DOCUMENT_TYPE_NODE === $child->nodeType) { + if (\XML_DOCUMENT_TYPE_NODE === $child->nodeType) { throw new NotEncodableValueException('Document types are not allowed.'); } - if (!$rootNode && XML_PI_NODE !== $child->nodeType) { + if (!$rootNode && !\in_array($child->nodeType, $decoderIgnoredNodeTypes, true)) { $rootNode = $child; } } @@ -111,7 +166,7 @@ public function decode($data, $format, array $context = array()) if ($rootNode->hasChildNodes()) { $xpath = new \DOMXPath($dom); - $data = array(); + $data = []; foreach ($xpath->query('namespace::*', $dom->documentElement) as $nsNode) { $data['@'.$nsNode->nodeName] = $nsNode->nodeValue; } @@ -129,7 +184,7 @@ public function decode($data, $format, array $context = array()) return $rootNode->nodeValue; } - $data = array(); + $data = []; foreach ($rootNode->attributes as $attrKey => $attr) { $data['@'.$attrKey] = $attr->nodeValue; @@ -159,32 +214,34 @@ public function supportsDecoding($format) /** * Sets the root node name. * + * @deprecated since Symfony 4.2 + * * @param string $name Root node name */ public function setRootNodeName($name) { - $this->rootNodeName = $name; + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the context instead.', __METHOD__), \E_USER_DEPRECATED); + + $this->defaultContext[self::ROOT_NODE_NAME] = $name; } /** * Returns the root node name. * + * @deprecated since Symfony 4.2 + * * @return string */ public function getRootNodeName() { - return $this->rootNodeName; + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the context instead.', __METHOD__), \E_USER_DEPRECATED); + + return $this->defaultContext[self::ROOT_NODE_NAME]; } - /** - * @param \DOMNode $node - * @param string $val - * - * @return bool - */ - final protected function appendXMLString(\DOMNode $node, $val) + final protected function appendXMLString(\DOMNode $node, string $val): bool { - if (\strlen($val) > 0) { + if ('' !== $val) { $frag = $this->dom->createDocumentFragment(); $frag->appendXML($val); $node->appendChild($frag); @@ -195,13 +252,7 @@ final protected function appendXMLString(\DOMNode $node, $val) return false; } - /** - * @param \DOMNode $node - * @param string $val - * - * @return bool - */ - final protected function appendText(\DOMNode $node, $val) + final protected function appendText(\DOMNode $node, string $val): bool { $nodeText = $this->dom->createTextNode($val); $node->appendChild($nodeText); @@ -209,13 +260,7 @@ final protected function appendText(\DOMNode $node, $val) return true; } - /** - * @param \DOMNode $node - * @param string $val - * - * @return bool - */ - final protected function appendCData(\DOMNode $node, $val) + final protected function appendCData(\DOMNode $node, string $val): bool { $nodeText = $this->dom->createCDATASection($val); $node->appendChild($nodeText); @@ -224,12 +269,9 @@ final protected function appendCData(\DOMNode $node, $val) } /** - * @param \DOMNode $node * @param \DOMDocumentFragment $fragment - * - * @return bool */ - final protected function appendDocumentFragment(\DOMNode $node, $fragment) + final protected function appendDocumentFragment(\DOMNode $node, $fragment): bool { if ($fragment instanceof \DOMDocumentFragment) { $node->appendChild($fragment); @@ -240,14 +282,17 @@ final protected function appendDocumentFragment(\DOMNode $node, $fragment) return false; } + final protected function appendComment(\DOMNode $node, string $data): bool + { + $node->appendChild($this->dom->createComment($data)); + + return true; + } + /** * Checks the name is a valid xml element name. - * - * @param string $name - * - * @return bool */ - final protected function isElementNameValid($name) + final protected function isElementNameValid(string $name): bool { return $name && false === strpos($name, ' ') && @@ -259,7 +304,7 @@ final protected function isElementNameValid($name) * * @return array|string */ - private function parseXml(\DOMNode $node, array $context = array()) + private function parseXml(\DOMNode $node, array $context = []) { $data = $this->parseXmlAttributes($node, $context); @@ -290,26 +335,24 @@ private function parseXml(\DOMNode $node, array $context = array()) /** * Parse the input DOMNode attributes into an array. - * - * @return array */ - private function parseXmlAttributes(\DOMNode $node, array $context = array()) + private function parseXmlAttributes(\DOMNode $node, array $context = []): array { if (!$node->hasAttributes()) { - return array(); + return []; } - $data = array(); - $typeCastAttributes = $this->resolveXmlTypeCastAttributes($context); + $data = []; + $typeCastAttributes = (bool) ($context[self::TYPE_CAST_ATTRIBUTES] ?? $this->defaultContext[self::TYPE_CAST_ATTRIBUTES]); foreach ($node->attributes as $attr) { - if (!is_numeric($attr->nodeValue) || !$typeCastAttributes) { + if (!is_numeric($attr->nodeValue) || !$typeCastAttributes || (isset($attr->nodeValue[1]) && '0' === $attr->nodeValue[0] && '.' !== $attr->nodeValue[1])) { $data['@'.$attr->nodeName] = $attr->nodeValue; continue; } - if (false !== $val = filter_var($attr->nodeValue, FILTER_VALIDATE_INT)) { + if (false !== $val = filter_var($attr->nodeValue, \FILTER_VALIDATE_INT)) { $data['@'.$attr->nodeName] = $val; continue; @@ -326,38 +369,35 @@ private function parseXmlAttributes(\DOMNode $node, array $context = array()) * * @return array|string */ - private function parseXmlValue(\DOMNode $node, array $context = array()) + private function parseXmlValue(\DOMNode $node, array $context = []) { if (!$node->hasChildNodes()) { return $node->nodeValue; } - if (1 === $node->childNodes->length && \in_array($node->firstChild->nodeType, array(XML_TEXT_NODE, XML_CDATA_SECTION_NODE))) { + if (1 === $node->childNodes->length && \in_array($node->firstChild->nodeType, [\XML_TEXT_NODE, \XML_CDATA_SECTION_NODE])) { return $node->firstChild->nodeValue; } - $value = array(); - + $value = []; + $decoderIgnoredNodeTypes = $context[self::DECODER_IGNORED_NODE_TYPES] ?? $this->defaultContext[self::DECODER_IGNORED_NODE_TYPES]; foreach ($node->childNodes as $subnode) { - if (XML_PI_NODE === $subnode->nodeType) { + if (\in_array($subnode->nodeType, $decoderIgnoredNodeTypes, true)) { continue; } $val = $this->parseXml($subnode, $context); if ('item' === $subnode->nodeName && isset($val['@key'])) { - if (isset($val['#'])) { - $value[$val['@key']] = $val['#']; - } else { - $value[$val['@key']] = $val; - } + $value[$val['@key']] = $val['#'] ?? $val; } else { $value[$subnode->nodeName][] = $val; } } + $asCollection = $context[self::AS_COLLECTION] ?? $this->defaultContext[self::AS_COLLECTION]; foreach ($value as $key => $val) { - if (\is_array($val) && 1 === \count($val)) { + if (!$asCollection && \is_array($val) && 1 === \count($val)) { $value[$key] = current($val); } } @@ -368,19 +408,17 @@ private function parseXmlValue(\DOMNode $node, array $context = array()) /** * Parse the data and convert it to DOMElements. * - * @param \DOMNode $parentNode * @param array|object $data - * @param string|null $xmlRootNodeName - * - * @return bool * * @throws NotEncodableValueException */ - private function buildXml(\DOMNode $parentNode, $data, $xmlRootNodeName = null) + private function buildXml(\DOMNode $parentNode, $data, string $xmlRootNodeName = null): bool { $append = true; + $removeEmptyTags = $this->context[self::REMOVE_EMPTY_TAGS] ?? $this->defaultContext[self::REMOVE_EMPTY_TAGS] ?? false; + $encoderIgnoredNodeTypes = $this->context[self::ENCODER_IGNORED_NODE_TYPES] ?? $this->defaultContext[self::ENCODER_IGNORED_NODE_TYPES]; - if (\is_array($data) || ($data instanceof \Traversable && !$this->serializer->supportsNormalization($data, $this->format))) { + if (\is_array($data) || ($data instanceof \Traversable && (null === $this->serializer || !$this->serializer->supportsNormalization($data, $this->format)))) { foreach ($data as $key => $data) { //Ah this is the magic @ attribute types. if (0 === strpos($key, '@') && $this->isElementNameValid($attributeName = substr($key, 1))) { @@ -390,13 +428,17 @@ private function buildXml(\DOMNode $parentNode, $data, $xmlRootNodeName = null) $parentNode->setAttribute($attributeName, $data); } elseif ('#' === $key) { $append = $this->selectNodeType($parentNode, $data); + } elseif ('#comment' === $key) { + if (!\in_array(\XML_COMMENT_NODE, $encoderIgnoredNodeTypes, true)) { + $append = $this->appendComment($parentNode, $data); + } } elseif (\is_array($data) && false === is_numeric($key)) { // Is this array fully numeric keys? if (ctype_digit(implode('', array_keys($data)))) { /* * Create nodes to append to $parentNode based on the $key of this array * Produces 01 - * From array("item" => array(0,1));. + * From ["item" => [0,1]];. */ foreach ($data as $subData) { $append = $this->appendNode($parentNode, $subData, $key); @@ -406,7 +448,7 @@ private function buildXml(\DOMNode $parentNode, $data, $xmlRootNodeName = null) } } elseif (is_numeric($key) || !$this->isElementNameValid($key)) { $append = $this->appendNode($parentNode, $data, 'item', $key); - } elseif (null !== $data || !isset($this->context['remove_empty_tags']) || false === $this->context['remove_empty_tags']) { + } elseif (null !== $data || !$removeEmptyTags) { $append = $this->appendNode($parentNode, $data, $key); } } @@ -415,6 +457,10 @@ private function buildXml(\DOMNode $parentNode, $data, $xmlRootNodeName = null) } if (\is_object($data)) { + if (null === $this->serializer) { + throw new BadMethodCallException(sprintf('The serializer needs to be set to allow "%s()" to be used with object data.', __METHOD__)); + } + $data = $this->serializer->normalize($data, $this->format, $this->context); if (null !== $data && !is_scalar($data)) { return $this->buildXml($parentNode, $data, $xmlRootNodeName); @@ -431,20 +477,15 @@ private function buildXml(\DOMNode $parentNode, $data, $xmlRootNodeName = null) return $this->appendNode($parentNode, $data, 'data'); } - throw new NotEncodableValueException(sprintf('An unexpected value could not be serialized: %s', var_export($data, true))); + throw new NotEncodableValueException('An unexpected value could not be serialized: '.(!\is_resource($data) ? var_export($data, true) : sprintf('%s resource', get_resource_type($data)))); } /** * Selects the type of node to create and appends it to the parent. * - * @param \DOMNode $parentNode * @param array|object $data - * @param string $nodeName - * @param string $key - * - * @return bool */ - private function appendNode(\DOMNode $parentNode, $data, $nodeName, $key = null) + private function appendNode(\DOMNode $parentNode, $data, string $nodeName, string $key = null): bool { $node = $this->dom->createElement($nodeName); if (null !== $key) { @@ -461,12 +502,8 @@ private function appendNode(\DOMNode $parentNode, $data, $nodeName, $key = null) /** * Checks if a value contains any characters which would require CDATA wrapping. - * - * @param string $val - * - * @return bool */ - private function needsCdataWrapping($val) + private function needsCdataWrapping(string $val): bool { return 0 < preg_match('/[<>&]/', $val); } @@ -474,14 +511,9 @@ private function needsCdataWrapping($val) /** * Tests the value being passed and decide what sort of element to create. * - * @param \DOMNode $node - * @param mixed $val - * - * @return bool - * * @throws NotEncodableValueException */ - private function selectNodeType(\DOMNode $node, $val) + private function selectNodeType(\DOMNode $node, $val): bool { if (\is_array($val)) { return $this->buildXml($node, $val); @@ -490,7 +522,14 @@ private function selectNodeType(\DOMNode $node, $val) $node->appendChild($child); } elseif ($val instanceof \Traversable) { $this->buildXml($node, $val); + } elseif ($val instanceof \DOMNode) { + $child = $this->dom->importNode($val, true); + $node->appendChild($child); } elseif (\is_object($val)) { + if (null === $this->serializer) { + throw new BadMethodCallException(sprintf('The serializer needs to be set to allow "%s()" to be used with object data.', __METHOD__)); + } + return $this->selectNodeType($node, $this->serializer->normalize($val, $this->format, $this->context)); } elseif (is_numeric($val)) { return $this->appendText($node, (string) $val); @@ -500,65 +539,32 @@ private function selectNodeType(\DOMNode $node, $val) return $this->appendText($node, $val); } elseif (\is_bool($val)) { return $this->appendText($node, (int) $val); - } elseif ($val instanceof \DOMNode) { - $child = $this->dom->importNode($val, true); - $node->appendChild($child); } return true; } - /** - * Get real XML root node name, taking serializer options into account. - * - * @return string - */ - private function resolveXmlRootName(array $context = array()) - { - return isset($context['xml_root_node_name']) - ? $context['xml_root_node_name'] - : $this->rootNodeName; - } - - /** - * Get XML option for type casting attributes Defaults to true. - * - * @param array $context - * - * @return bool - */ - private function resolveXmlTypeCastAttributes(array $context = array()) - { - return isset($context['xml_type_cast_attributes']) - ? (bool) $context['xml_type_cast_attributes'] - : true; - } - /** * Create a DOM document, taking serializer options into account. - * - * @param array $context Options that the encoder has access to - * - * @return \DOMDocument */ - private function createDomDocument(array $context) + private function createDomDocument(array $context): \DOMDocument { $document = new \DOMDocument(); // Set an attribute on the DOM document specifying, as part of the XML declaration, - $xmlOptions = array( + $xmlOptions = [ // nicely formats output with indentation and extra space - 'xml_format_output' => 'formatOutput', + self::FORMAT_OUTPUT => 'formatOutput', // the version number of the document - 'xml_version' => 'xmlVersion', + self::VERSION => 'xmlVersion', // the encoding of the document - 'xml_encoding' => 'encoding', + self::ENCODING => 'encoding', // whether the document is standalone - 'xml_standalone' => 'xmlStandalone', - ); + self::STANDALONE => 'xmlStandalone', + ]; foreach ($xmlOptions as $xmlOption => $documentProperty) { - if (isset($context[$xmlOption])) { - $document->$documentProperty = $context[$xmlOption]; + if ($contextOption = $context[$xmlOption] ?? $this->defaultContext[$xmlOption] ?? false) { + $document->$documentProperty = $contextOption; } } diff --git a/vendor/symfony/serializer/Encoder/YamlEncoder.php b/vendor/symfony/serializer/Encoder/YamlEncoder.php index 3ac1af67..d17ba6b3 100644 --- a/vendor/symfony/serializer/Encoder/YamlEncoder.php +++ b/vendor/symfony/serializer/Encoder/YamlEncoder.php @@ -14,6 +14,7 @@ use Symfony\Component\Serializer\Exception\RuntimeException; use Symfony\Component\Yaml\Dumper; use Symfony\Component\Yaml\Parser; +use Symfony\Component\Yaml\Yaml; /** * Encodes YAML data. @@ -23,12 +24,15 @@ class YamlEncoder implements EncoderInterface, DecoderInterface { const FORMAT = 'yaml'; + private const ALTERNATIVE_FORMAT = 'yml'; + + public const PRESERVE_EMPTY_OBJECTS = 'preserve_empty_objects'; private $dumper; private $parser; - private $defaultContext = array('yaml_inline' => 0, 'yaml_indent' => 0, 'yaml_flags' => 0); + private $defaultContext = ['yaml_inline' => 0, 'yaml_indent' => 0, 'yaml_flags' => 0]; - public function __construct(Dumper $dumper = null, Parser $parser = null, array $defaultContext = array()) + public function __construct(Dumper $dumper = null, Parser $parser = null, array $defaultContext = []) { if (!class_exists(Dumper::class)) { throw new RuntimeException('The YamlEncoder class requires the "Yaml" component. Install "symfony/yaml" to use it.'); @@ -42,10 +46,14 @@ public function __construct(Dumper $dumper = null, Parser $parser = null, array /** * {@inheritdoc} */ - public function encode($data, $format, array $context = array()) + public function encode($data, $format, array $context = []) { $context = array_merge($this->defaultContext, $context); + if (isset($context[self::PRESERVE_EMPTY_OBJECTS])) { + $context['yaml_flags'] |= Yaml::DUMP_OBJECT_AS_MAP; + } + return $this->dumper->dump($data, $context['yaml_inline'], $context['yaml_indent'], $context['yaml_flags']); } @@ -54,13 +62,13 @@ public function encode($data, $format, array $context = array()) */ public function supportsEncoding($format) { - return self::FORMAT === $format; + return self::FORMAT === $format || self::ALTERNATIVE_FORMAT === $format; } /** * {@inheritdoc} */ - public function decode($data, $format, array $context = array()) + public function decode($data, $format, array $context = []) { $context = array_merge($this->defaultContext, $context); @@ -72,6 +80,6 @@ public function decode($data, $format, array $context = array()) */ public function supportsDecoding($format) { - return self::FORMAT === $format; + return self::FORMAT === $format || self::ALTERNATIVE_FORMAT === $format; } } diff --git a/vendor/symfony/serializer/Exception/ExceptionInterface.php b/vendor/symfony/serializer/Exception/ExceptionInterface.php index 99ed6324..859dcb46 100644 --- a/vendor/symfony/serializer/Exception/ExceptionInterface.php +++ b/vendor/symfony/serializer/Exception/ExceptionInterface.php @@ -16,6 +16,6 @@ * * @author Johannes M. Schmitt */ -interface ExceptionInterface +interface ExceptionInterface extends \Throwable { } diff --git a/vendor/symfony/serializer/Exception/ExtraAttributesException.php b/vendor/symfony/serializer/Exception/ExtraAttributesException.php index 74d87f87..b8fb86be 100644 --- a/vendor/symfony/serializer/Exception/ExtraAttributesException.php +++ b/vendor/symfony/serializer/Exception/ExtraAttributesException.php @@ -20,7 +20,7 @@ class ExtraAttributesException extends RuntimeException { private $extraAttributes; - public function __construct(array $extraAttributes, \Exception $previous = null) + public function __construct(array $extraAttributes, \Throwable $previous = null) { $msg = sprintf('Extra attributes are not allowed ("%s" are unknown).', implode('", "', $extraAttributes)); diff --git a/vendor/symfony/serializer/Tests/Fixtures/ProxyDummy.php b/vendor/symfony/serializer/Exception/MissingConstructorArgumentsException.php similarity index 59% rename from vendor/symfony/serializer/Tests/Fixtures/ProxyDummy.php rename to vendor/symfony/serializer/Exception/MissingConstructorArgumentsException.php index 040d376d..c433cbff 100644 --- a/vendor/symfony/serializer/Tests/Fixtures/ProxyDummy.php +++ b/vendor/symfony/serializer/Exception/MissingConstructorArgumentsException.php @@ -9,11 +9,11 @@ * file that was distributed with this source code. */ -namespace Symfony\Component\Serializer\Tests\Fixtures; +namespace Symfony\Component\Serializer\Exception; /** - * @author Kévin Dunglas + * @author Maxime VEBER */ -class ProxyDummy extends ToBeProxyfiedDummy +class MissingConstructorArgumentsException extends RuntimeException { } diff --git a/vendor/symfony/serializer/Extractor/ObjectPropertyListExtractor.php b/vendor/symfony/serializer/Extractor/ObjectPropertyListExtractor.php new file mode 100644 index 00000000..64d2ec29 --- /dev/null +++ b/vendor/symfony/serializer/Extractor/ObjectPropertyListExtractor.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Extractor; + +use Symfony\Component\PropertyInfo\PropertyListExtractorInterface; + +/** + * @author David Maicher + */ +final class ObjectPropertyListExtractor implements ObjectPropertyListExtractorInterface +{ + private $propertyListExtractor; + private $objectClassResolver; + + public function __construct(PropertyListExtractorInterface $propertyListExtractor, callable $objectClassResolver = null) + { + $this->propertyListExtractor = $propertyListExtractor; + $this->objectClassResolver = $objectClassResolver; + } + + /** + * {@inheritdoc} + */ + public function getProperties($object, array $context = []): ?array + { + $class = $this->objectClassResolver ? ($this->objectClassResolver)($object) : \get_class($object); + + return $this->propertyListExtractor->getProperties($class, $context); + } +} diff --git a/vendor/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php b/vendor/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php new file mode 100644 index 00000000..1dd9b8b9 --- /dev/null +++ b/vendor/symfony/serializer/Extractor/ObjectPropertyListExtractorInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Extractor; + +/** + * @author David Maicher + */ +interface ObjectPropertyListExtractorInterface +{ + /** + * Gets the list of properties available for the given object. + * + * @param object $object + * + * @return string[]|null + */ + public function getProperties($object, array $context = []): ?array; +} diff --git a/vendor/symfony/serializer/LICENSE b/vendor/symfony/serializer/LICENSE index 21d7fb9e..9e936ec0 100644 --- a/vendor/symfony/serializer/LICENSE +++ b/vendor/symfony/serializer/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2018 Fabien Potencier +Copyright (c) 2004-2020 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/serializer/Mapping/AttributeMetadata.php b/vendor/symfony/serializer/Mapping/AttributeMetadata.php index 9ad6e308..b466af93 100644 --- a/vendor/symfony/serializer/Mapping/AttributeMetadata.php +++ b/vendor/symfony/serializer/Mapping/AttributeMetadata.php @@ -30,7 +30,7 @@ class AttributeMetadata implements AttributeMetadataInterface * class' serialized representation. Do not access it. Use * {@link getGroups()} instead. */ - public $groups = array(); + public $groups = []; /** * @var int|null @@ -42,11 +42,15 @@ class AttributeMetadata implements AttributeMetadataInterface public $maxDepth; /** - * Constructs a metadata for the given attribute. + * @var string|null * - * @param string $name + * @internal This property is public in order to reduce the size of the + * class' serialized representation. Do not access it. Use + * {@link getSerializedName()} instead. */ - public function __construct($name) + public $serializedName; + + public function __construct(string $name) { $this->name = $name; } @@ -54,7 +58,7 @@ public function __construct($name) /** * {@inheritdoc} */ - public function getName() + public function getName(): string { return $this->name; } @@ -72,7 +76,7 @@ public function addGroup($group) /** * {@inheritdoc} */ - public function getGroups() + public function getGroups(): array { return $this->groups; } @@ -93,6 +97,22 @@ public function getMaxDepth() return $this->maxDepth; } + /** + * {@inheritdoc} + */ + public function setSerializedName(string $serializedName = null) + { + $this->serializedName = $serializedName; + } + + /** + * {@inheritdoc} + */ + public function getSerializedName(): ?string + { + return $this->serializedName; + } + /** * {@inheritdoc} */ @@ -106,6 +126,11 @@ public function merge(AttributeMetadataInterface $attributeMetadata) if (null === $this->maxDepth) { $this->maxDepth = $attributeMetadata->getMaxDepth(); } + + // Overwrite only if not defined + if (null === $this->serializedName) { + $this->serializedName = $attributeMetadata->getSerializedName(); + } } /** @@ -115,6 +140,6 @@ public function merge(AttributeMetadataInterface $attributeMetadata) */ public function __sleep() { - return array('name', 'groups', 'maxDepth'); + return ['name', 'groups', 'maxDepth', 'serializedName']; } } diff --git a/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php b/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php index 944a7b31..1df90b98 100644 --- a/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php +++ b/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php @@ -24,10 +24,8 @@ interface AttributeMetadataInterface { /** * Gets the attribute name. - * - * @return string */ - public function getName(); + public function getName(): string; /** * Adds this attribute to the given group. @@ -41,7 +39,7 @@ public function addGroup($group); * * @return string[] */ - public function getGroups(); + public function getGroups(): array; /** * Sets the serialization max depth for this attribute. @@ -57,8 +55,18 @@ public function setMaxDepth($maxDepth); */ public function getMaxDepth(); + /** + * Sets the serialization name for this attribute. + */ + public function setSerializedName(string $serializedName = null); + + /** + * Gets the serialization name for this attribute. + */ + public function getSerializedName(): ?string; + /** * Merges an {@see AttributeMetadataInterface} with in the current one. */ - public function merge(AttributeMetadataInterface $attributeMetadata); + public function merge(self $attributeMetadata); } diff --git a/vendor/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.php b/vendor/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.php new file mode 100644 index 00000000..23554ffd --- /dev/null +++ b/vendor/symfony/serializer/Mapping/ClassDiscriminatorFromClassMetadata.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Mapping; + +use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; + +/** + * @author Samuel Roze + */ +class ClassDiscriminatorFromClassMetadata implements ClassDiscriminatorResolverInterface +{ + /** + * @var ClassMetadataFactoryInterface + */ + private $classMetadataFactory; + private $mappingForMappedObjectCache = []; + + public function __construct(ClassMetadataFactoryInterface $classMetadataFactory) + { + $this->classMetadataFactory = $classMetadataFactory; + } + + /** + * {@inheritdoc} + */ + public function getMappingForClass(string $class): ?ClassDiscriminatorMapping + { + if ($this->classMetadataFactory->hasMetadataFor($class)) { + return $this->classMetadataFactory->getMetadataFor($class)->getClassDiscriminatorMapping(); + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function getMappingForMappedObject($object): ?ClassDiscriminatorMapping + { + if ($this->classMetadataFactory->hasMetadataFor($object)) { + $metadata = $this->classMetadataFactory->getMetadataFor($object); + + if (null !== $metadata->getClassDiscriminatorMapping()) { + return $metadata->getClassDiscriminatorMapping(); + } + } + + $cacheKey = \is_object($object) ? \get_class($object) : $object; + if (!\array_key_exists($cacheKey, $this->mappingForMappedObjectCache)) { + $this->mappingForMappedObjectCache[$cacheKey] = $this->resolveMappingForMappedObject($object); + } + + return $this->mappingForMappedObjectCache[$cacheKey]; + } + + /** + * {@inheritdoc} + */ + public function getTypeForMappedObject($object): ?string + { + if (null === $mapping = $this->getMappingForMappedObject($object)) { + return null; + } + + return $mapping->getMappedObjectType($object); + } + + private function resolveMappingForMappedObject($object) + { + $reflectionClass = new \ReflectionClass($object); + if ($parentClass = $reflectionClass->getParentClass()) { + return $this->getMappingForMappedObject($parentClass->getName()); + } + + foreach ($reflectionClass->getInterfaceNames() as $interfaceName) { + if (null !== ($interfaceMapping = $this->getMappingForMappedObject($interfaceName))) { + return $interfaceMapping; + } + } + + return null; + } +} diff --git a/vendor/symfony/serializer/Mapping/ClassDiscriminatorMapping.php b/vendor/symfony/serializer/Mapping/ClassDiscriminatorMapping.php new file mode 100644 index 00000000..0c314c7b --- /dev/null +++ b/vendor/symfony/serializer/Mapping/ClassDiscriminatorMapping.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Mapping; + +/** + * @author Samuel Roze + */ +class ClassDiscriminatorMapping +{ + private $typeProperty; + private $typesMapping; + + public function __construct(string $typeProperty, array $typesMapping = []) + { + $this->typeProperty = $typeProperty; + $this->typesMapping = $typesMapping; + + uasort($this->typesMapping, static function (string $a, string $b): int { + if (is_a($a, $b, true)) { + return -1; + } + + if (is_a($b, $a, true)) { + return 1; + } + + return 0; + }); + } + + public function getTypeProperty(): string + { + return $this->typeProperty; + } + + public function getClassForType(string $type): ?string + { + return $this->typesMapping[$type] ?? null; + } + + /** + * @param object|string $object + */ + public function getMappedObjectType($object): ?string + { + foreach ($this->typesMapping as $type => $typeClass) { + if (is_a($object, $typeClass)) { + return $type; + } + } + + return null; + } + + public function getTypesMapping(): array + { + return $this->typesMapping; + } +} diff --git a/vendor/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.php b/vendor/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.php new file mode 100644 index 00000000..22d76faf --- /dev/null +++ b/vendor/symfony/serializer/Mapping/ClassDiscriminatorResolverInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Mapping; + +/** + * Knows how to get the class discriminator mapping for classes and objects. + * + * @author Samuel Roze + */ +interface ClassDiscriminatorResolverInterface +{ + public function getMappingForClass(string $class): ?ClassDiscriminatorMapping; + + /** + * @param object|string $object + */ + public function getMappingForMappedObject($object): ?ClassDiscriminatorMapping; + + /** + * @param object|string $object + */ + public function getTypeForMappedObject($object): ?string; +} diff --git a/vendor/symfony/serializer/Mapping/ClassMetadata.php b/vendor/symfony/serializer/Mapping/ClassMetadata.php index 7858f74d..65b42ceb 100644 --- a/vendor/symfony/serializer/Mapping/ClassMetadata.php +++ b/vendor/symfony/serializer/Mapping/ClassMetadata.php @@ -32,7 +32,7 @@ class ClassMetadata implements ClassMetadataInterface * class' serialized representation. Do not access it. Use * {@link getAttributesMetadata()} instead. */ - public $attributesMetadata = array(); + public $attributesMetadata = []; /** * @var \ReflectionClass @@ -40,19 +40,27 @@ class ClassMetadata implements ClassMetadataInterface private $reflClass; /** - * Constructs a metadata for the given class. + * @var ClassDiscriminatorMapping|null * - * @param string $class + * @internal This property is public in order to reduce the size of the + * class' serialized representation. Do not access it. Use + * {@link getClassDiscriminatorMapping()} instead. + */ + public $classDiscriminatorMapping; + + /** + * Constructs a metadata for the given class. */ - public function __construct($class) + public function __construct(string $class, ClassDiscriminatorMapping $classDiscriminatorMapping = null) { $this->name = $class; + $this->classDiscriminatorMapping = $classDiscriminatorMapping; } /** * {@inheritdoc} */ - public function getName() + public function getName(): string { return $this->name; } @@ -68,7 +76,7 @@ public function addAttributeMetadata(AttributeMetadataInterface $attributeMetada /** * {@inheritdoc} */ - public function getAttributesMetadata() + public function getAttributesMetadata(): array { return $this->attributesMetadata; } @@ -90,7 +98,7 @@ public function merge(ClassMetadataInterface $classMetadata) /** * {@inheritdoc} */ - public function getReflectionClass() + public function getReflectionClass(): \ReflectionClass { if (!$this->reflClass) { $this->reflClass = new \ReflectionClass($this->getName()); @@ -99,6 +107,22 @@ public function getReflectionClass() return $this->reflClass; } + /** + * {@inheritdoc} + */ + public function getClassDiscriminatorMapping(): ?ClassDiscriminatorMapping + { + return $this->classDiscriminatorMapping; + } + + /** + * {@inheritdoc} + */ + public function setClassDiscriminatorMapping(ClassDiscriminatorMapping $mapping = null) + { + $this->classDiscriminatorMapping = $mapping; + } + /** * Returns the names of the properties that should be serialized. * @@ -106,9 +130,10 @@ public function getReflectionClass() */ public function __sleep() { - return array( + return [ 'name', 'attributesMetadata', - ); + 'classDiscriminatorMapping', + ]; } } diff --git a/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php b/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php index 3811e565..d8c3cc77 100644 --- a/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php +++ b/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php @@ -29,7 +29,7 @@ interface ClassMetadataInterface * * @return string The name of the backing class */ - public function getName(); + public function getName(): string; /** * Adds an {@link AttributeMetadataInterface}. @@ -41,17 +41,19 @@ public function addAttributeMetadata(AttributeMetadataInterface $attributeMetada * * @return AttributeMetadataInterface[] */ - public function getAttributesMetadata(); + public function getAttributesMetadata(): array; /** * Merges a {@link ClassMetadataInterface} in the current one. */ - public function merge(ClassMetadataInterface $classMetadata); + public function merge(self $classMetadata); /** * Returns a {@link \ReflectionClass} instance for this class. - * - * @return \ReflectionClass */ - public function getReflectionClass(); + public function getReflectionClass(): \ReflectionClass; + + public function getClassDiscriminatorMapping(): ?ClassDiscriminatorMapping; + + public function setClassDiscriminatorMapping(ClassDiscriminatorMapping $mapping = null); } diff --git a/vendor/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.php b/vendor/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.php index 0b904c14..081917c6 100644 --- a/vendor/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.php +++ b/vendor/symfony/serializer/Mapping/Factory/CacheClassMetadataFactory.php @@ -44,8 +44,7 @@ public function __construct(ClassMetadataFactoryInterface $decorated, CacheItemP public function getMetadataFor($value) { $class = $this->getClass($value); - // Key cannot contain backslashes according to PSR-6 - $key = strtr($class, '\\', '_'); + $key = rawurlencode(strtr($class, '\\', '_')); $item = $this->cacheItemPool->getItem($key); if ($item->isHit()) { diff --git a/vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php b/vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php index 294dfd9e..b55c070f 100644 --- a/vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php +++ b/vendor/symfony/serializer/Mapping/Factory/ClassMetadataFactory.php @@ -11,8 +11,6 @@ namespace Symfony\Component\Serializer\Mapping\Factory; -use Doctrine\Common\Cache\Cache; -use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Mapping\ClassMetadata; use Symfony\Component\Serializer\Mapping\Loader\LoaderInterface; @@ -26,17 +24,15 @@ class ClassMetadataFactory implements ClassMetadataFactoryInterface use ClassResolverTrait; private $loader; - private $cache; + + /** + * @var array + */ private $loadedClasses; - public function __construct(LoaderInterface $loader, Cache $cache = null) + public function __construct(LoaderInterface $loader) { $this->loader = $loader; - $this->cache = $cache; - - if (null !== $cache) { - @trigger_error(sprintf('Passing a Doctrine Cache instance as 2nd parameter of the "%s" constructor is deprecated since Symfony 3.1. This parameter will be removed in Symfony 4.0. Use the "%s" class instead.', __CLASS__, CacheClassMetadataFactory::class), E_USER_DEPRECATED); - } } /** @@ -50,10 +46,6 @@ public function getMetadataFor($value) return $this->loadedClasses[$class]; } - if ($this->cache && ($this->loadedClasses[$class] = $this->cache->fetch($class))) { - return $this->loadedClasses[$class]; - } - $classMetadata = new ClassMetadata($class); $this->loader->loadClassMetadata($classMetadata); @@ -69,10 +61,6 @@ public function getMetadataFor($value) $classMetadata->merge($this->getMetadataFor($interface->name)); } - if ($this->cache) { - $this->cache->save($class, $classMetadata); - } - return $this->loadedClasses[$class] = $classMetadata; } @@ -81,14 +69,6 @@ public function getMetadataFor($value) */ public function hasMetadataFor($value) { - try { - $this->getClass($value); - - return true; - } catch (InvalidArgumentException $invalidArgumentException) { - // Return false in case of exception - } - - return false; + return \is_object($value) || (\is_string($value) && (class_exists($value) || interface_exists($value, false))); } } diff --git a/vendor/symfony/serializer/Mapping/Factory/ClassResolverTrait.php b/vendor/symfony/serializer/Mapping/Factory/ClassResolverTrait.php index e93277a6..e5698d77 100644 --- a/vendor/symfony/serializer/Mapping/Factory/ClassResolverTrait.php +++ b/vendor/symfony/serializer/Mapping/Factory/ClassResolverTrait.php @@ -25,26 +25,24 @@ trait ClassResolverTrait /** * Gets a class name for a given class or instance. * - * @param mixed $value + * @param object|string $value * - * @return string - * - * @throws InvalidArgumentException If the class does not exists + * @throws InvalidArgumentException If the class does not exist */ - private function getClass($value) + private function getClass($value): string { - if (is_string($value)) { - if (!class_exists($value) && !interface_exists($value)) { + if (\is_string($value)) { + if (!class_exists($value) && !interface_exists($value, false)) { throw new InvalidArgumentException(sprintf('The class or interface "%s" does not exist.', $value)); } return ltrim($value, '\\'); } - if (!is_object($value)) { - throw new InvalidArgumentException(sprintf('Cannot create metadata for non-objects. Got: "%s"', gettype($value))); + if (!\is_object($value)) { + throw new InvalidArgumentException(sprintf('Cannot create metadata for non-objects. Got: "%s".', \gettype($value))); } - return get_class($value); + return \get_class($value); } } diff --git a/vendor/symfony/serializer/Mapping/Loader/AnnotationLoader.php b/vendor/symfony/serializer/Mapping/Loader/AnnotationLoader.php index 5527b5f7..bd9fab1c 100644 --- a/vendor/symfony/serializer/Mapping/Loader/AnnotationLoader.php +++ b/vendor/symfony/serializer/Mapping/Loader/AnnotationLoader.php @@ -12,10 +12,13 @@ namespace Symfony\Component\Serializer\Mapping\Loader; use Doctrine\Common\Annotations\Reader; +use Symfony\Component\Serializer\Annotation\DiscriminatorMap; use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\MaxDepth; +use Symfony\Component\Serializer\Annotation\SerializedName; use Symfony\Component\Serializer\Exception\MappingException; use Symfony\Component\Serializer\Mapping\AttributeMetadata; +use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping; use Symfony\Component\Serializer\Mapping\ClassMetadataInterface; /** @@ -43,6 +46,15 @@ public function loadClassMetadata(ClassMetadataInterface $classMetadata) $attributesMetadata = $classMetadata->getAttributesMetadata(); + foreach ($this->reader->getClassAnnotations($reflectionClass) as $annotation) { + if ($annotation instanceof DiscriminatorMap) { + $classMetadata->setClassDiscriminatorMapping(new ClassDiscriminatorMapping( + $annotation->getTypeProperty(), + $annotation->getMapping() + )); + } + } + foreach ($reflectionClass->getProperties() as $property) { if (!isset($attributesMetadata[$property->name])) { $attributesMetadata[$property->name] = new AttributeMetadata($property->name); @@ -57,6 +69,8 @@ public function loadClassMetadata(ClassMetadataInterface $classMetadata) } } elseif ($annotation instanceof MaxDepth) { $attributesMetadata[$property->name]->setMaxDepth($annotation->getMaxDepth()); + } elseif ($annotation instanceof SerializedName) { + $attributesMetadata[$property->name]->setSerializedName($annotation->getSerializedName()); } $loaded = true; @@ -96,6 +110,12 @@ public function loadClassMetadata(ClassMetadataInterface $classMetadata) } $attributeMetadata->setMaxDepth($annotation->getMaxDepth()); + } elseif ($annotation instanceof SerializedName) { + if (!$accessorOrMutator) { + throw new MappingException(sprintf('SerializedName on "%s::%s" cannot be added. SerializedName can only be added on methods beginning with "get", "is", "has" or "set".', $className, $method->name)); + } + + $attributeMetadata->setSerializedName($annotation->getSerializedName()); } $loaded = true; diff --git a/vendor/symfony/serializer/Mapping/Loader/FileLoader.php b/vendor/symfony/serializer/Mapping/Loader/FileLoader.php index d1b0dee9..f4947ef4 100644 --- a/vendor/symfony/serializer/Mapping/Loader/FileLoader.php +++ b/vendor/symfony/serializer/Mapping/Loader/FileLoader.php @@ -27,14 +27,14 @@ abstract class FileLoader implements LoaderInterface * * @throws MappingException if the mapping file does not exist or is not readable */ - public function __construct($file) + public function __construct(string $file) { if (!is_file($file)) { - throw new MappingException(sprintf('The mapping file %s does not exist', $file)); + throw new MappingException(sprintf('The mapping file "%s" does not exist.', $file)); } if (!is_readable($file)) { - throw new MappingException(sprintf('The mapping file %s is not readable', $file)); + throw new MappingException(sprintf('The mapping file "%s" is not readable.', $file)); } $this->file = $file; diff --git a/vendor/symfony/serializer/Mapping/Loader/LoaderChain.php b/vendor/symfony/serializer/Mapping/Loader/LoaderChain.php index 1890a9d8..f422f11c 100644 --- a/vendor/symfony/serializer/Mapping/Loader/LoaderChain.php +++ b/vendor/symfony/serializer/Mapping/Loader/LoaderChain.php @@ -40,7 +40,7 @@ public function __construct(array $loaders) { foreach ($loaders as $loader) { if (!$loader instanceof LoaderInterface) { - throw new MappingException(sprintf('Class %s is expected to implement LoaderInterface', \get_class($loader))); + throw new MappingException(sprintf('Class "%s" is expected to implement LoaderInterface.', \get_class($loader))); } } diff --git a/vendor/symfony/serializer/Mapping/Loader/XmlFileLoader.php b/vendor/symfony/serializer/Mapping/Loader/XmlFileLoader.php index 76d06432..cd329e91 100644 --- a/vendor/symfony/serializer/Mapping/Loader/XmlFileLoader.php +++ b/vendor/symfony/serializer/Mapping/Loader/XmlFileLoader.php @@ -14,6 +14,7 @@ use Symfony\Component\Config\Util\XmlUtils; use Symfony\Component\Serializer\Exception\MappingException; use Symfony\Component\Serializer\Mapping\AttributeMetadata; +use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping; use Symfony\Component\Serializer\Mapping\ClassMetadataInterface; /** @@ -65,6 +66,23 @@ public function loadClassMetadata(ClassMetadataInterface $classMetadata) if (isset($attribute['max-depth'])) { $attributeMetadata->setMaxDepth((int) $attribute['max-depth']); } + + if (isset($attribute['serialized-name'])) { + $attributeMetadata->setSerializedName((string) $attribute['serialized-name']); + } + } + + if (isset($xml->{'discriminator-map'})) { + $mapping = []; + foreach ($xml->{'discriminator-map'}->mapping as $element) { + $elementAttributes = $element->attributes(); + $mapping[(string) $elementAttributes->type] = (string) $elementAttributes->class; + } + + $classMetadata->setClassDiscriminatorMapping(new ClassDiscriminatorMapping( + (string) $xml->{'discriminator-map'}->attributes()->{'type-property'}, + $mapping + )); } return true; @@ -90,13 +108,9 @@ public function getMappedClasses() /** * Parses a XML File. * - * @param string $file Path of file - * - * @return \SimpleXMLElement - * * @throws MappingException */ - private function parseFile($file) + private function parseFile(string $file): \SimpleXMLElement { try { $dom = XmlUtils::loadFile($file, __DIR__.'/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd'); @@ -107,10 +121,10 @@ private function parseFile($file) return simplexml_import_dom($dom); } - private function getClassesFromXml() + private function getClassesFromXml(): array { $xml = $this->parseFile($this->file); - $classes = array(); + $classes = []; foreach ($xml->class as $class) { $classes[(string) $class['name']] = $class; diff --git a/vendor/symfony/serializer/Mapping/Loader/YamlFileLoader.php b/vendor/symfony/serializer/Mapping/Loader/YamlFileLoader.php index ca9d43e1..88333941 100644 --- a/vendor/symfony/serializer/Mapping/Loader/YamlFileLoader.php +++ b/vendor/symfony/serializer/Mapping/Loader/YamlFileLoader.php @@ -13,8 +13,10 @@ use Symfony\Component\Serializer\Exception\MappingException; use Symfony\Component\Serializer\Mapping\AttributeMetadata; +use Symfony\Component\Serializer\Mapping\ClassDiscriminatorMapping; use Symfony\Component\Serializer\Mapping\ClassMetadataInterface; use Symfony\Component\Yaml\Parser; +use Symfony\Component\Yaml\Yaml; /** * YAML File Loader. @@ -77,13 +79,36 @@ public function loadClassMetadata(ClassMetadataInterface $classMetadata) } if (isset($data['max_depth'])) { - if (!is_int($data['max_depth'])) { + if (!\is_int($data['max_depth'])) { throw new MappingException(sprintf('The "max_depth" value must be an integer in "%s" for the attribute "%s" of the class "%s".', $this->file, $attribute, $classMetadata->getName())); } $attributeMetadata->setMaxDepth($data['max_depth']); } + + if (isset($data['serialized_name'])) { + if (!\is_string($data['serialized_name']) || empty($data['serialized_name'])) { + throw new MappingException(sprintf('The "serialized_name" value must be a non-empty string in "%s" for the attribute "%s" of the class "%s".', $this->file, $attribute, $classMetadata->getName())); + } + + $attributeMetadata->setSerializedName($data['serialized_name']); + } + } + } + + if (isset($yaml['discriminator_map'])) { + if (!isset($yaml['discriminator_map']['type_property'])) { + throw new MappingException(sprintf('The "type_property" key must be set for the discriminator map of the class "%s" in "%s".', $classMetadata->getName(), $this->file)); } + + if (!isset($yaml['discriminator_map']['mapping'])) { + throw new MappingException(sprintf('The "mapping" key must be set for the discriminator map of the class "%s" in "%s".', $classMetadata->getName(), $this->file)); + } + + $classMetadata->setClassDiscriminatorMapping(new ClassDiscriminatorMapping( + $yaml['discriminator_map']['type_property'], + $yaml['discriminator_map']['mapping'] + )); } return true; @@ -103,7 +128,7 @@ public function getMappedClasses() return array_keys($this->classes); } - private function getClassesFromYaml() + private function getClassesFromYaml(): array { if (!stream_is_local($this->file)) { throw new MappingException(sprintf('This is not a local file "%s".', $this->file)); @@ -113,10 +138,10 @@ private function getClassesFromYaml() $this->yamlParser = new Parser(); } - $classes = $this->yamlParser->parseFile($this->file); + $classes = $this->yamlParser->parseFile($this->file, Yaml::PARSE_CONSTANT); if (empty($classes)) { - return array(); + return []; } if (!\is_array($classes)) { diff --git a/vendor/symfony/serializer/Mapping/Loader/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd b/vendor/symfony/serializer/Mapping/Loader/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd index afa8b921..5dfe1e37 100644 --- a/vendor/symfony/serializer/Mapping/Loader/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd +++ b/vendor/symfony/serializer/Mapping/Loader/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd @@ -8,7 +8,7 @@ @@ -37,10 +37,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/symfony/serializer/NameConverter/AdvancedNameConverterInterface.php b/vendor/symfony/serializer/NameConverter/AdvancedNameConverterInterface.php new file mode 100644 index 00000000..03abdf18 --- /dev/null +++ b/vendor/symfony/serializer/NameConverter/AdvancedNameConverterInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\NameConverter; + +/** + * Gives access to the class, the format and the context in the property name converters. + * + * @author Kévin Dunglas + */ +interface AdvancedNameConverterInterface extends NameConverterInterface +{ + /** + * {@inheritdoc} + */ + public function normalize($propertyName, string $class = null, string $format = null, array $context = []); + + /** + * {@inheritdoc} + */ + public function denormalize($propertyName, string $class = null, string $format = null, array $context = []); +} diff --git a/vendor/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php b/vendor/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php index 9c3f318e..2465f5b4 100644 --- a/vendor/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php +++ b/vendor/symfony/serializer/NameConverter/CamelCaseToSnakeCaseNameConverter.php @@ -22,10 +22,10 @@ class CamelCaseToSnakeCaseNameConverter implements NameConverterInterface private $lowerCamelCase; /** - * @param null|array $attributes The list of attributes to rename or null for all attributes + * @param array|null $attributes The list of attributes to rename or null for all attributes * @param bool $lowerCamelCase Use lowerCamelCase style */ - public function __construct(array $attributes = null, $lowerCamelCase = true) + public function __construct(array $attributes = null, bool $lowerCamelCase = true) { $this->attributes = $attributes; $this->lowerCamelCase = $lowerCamelCase; diff --git a/vendor/symfony/serializer/NameConverter/MetadataAwareNameConverter.php b/vendor/symfony/serializer/NameConverter/MetadataAwareNameConverter.php new file mode 100644 index 00000000..a3ffaa3d --- /dev/null +++ b/vendor/symfony/serializer/NameConverter/MetadataAwareNameConverter.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\NameConverter; + +use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; + +/** + * @author Fabien Bourigault + */ +final class MetadataAwareNameConverter implements AdvancedNameConverterInterface +{ + private $metadataFactory; + + /** + * @var NameConverterInterface|AdvancedNameConverterInterface|null + */ + private $fallbackNameConverter; + + private static $normalizeCache = []; + + private static $denormalizeCache = []; + + private static $attributesMetadataCache = []; + + public function __construct(ClassMetadataFactoryInterface $metadataFactory, NameConverterInterface $fallbackNameConverter = null) + { + $this->metadataFactory = $metadataFactory; + $this->fallbackNameConverter = $fallbackNameConverter; + } + + /** + * {@inheritdoc} + */ + public function normalize($propertyName, string $class = null, string $format = null, array $context = []): string + { + if (null === $class) { + return $this->normalizeFallback($propertyName, $class, $format, $context); + } + + if (!\array_key_exists($class, self::$normalizeCache) || !\array_key_exists($propertyName, self::$normalizeCache[$class])) { + self::$normalizeCache[$class][$propertyName] = $this->getCacheValueForNormalization($propertyName, $class); + } + + return self::$normalizeCache[$class][$propertyName] ?? $this->normalizeFallback($propertyName, $class, $format, $context); + } + + /** + * {@inheritdoc} + */ + public function denormalize($propertyName, string $class = null, string $format = null, array $context = []): string + { + if (null === $class) { + return $this->denormalizeFallback($propertyName, $class, $format, $context); + } + + $cacheKey = $this->getCacheKey($class, $context); + if (!\array_key_exists($cacheKey, self::$denormalizeCache) || !\array_key_exists($propertyName, self::$denormalizeCache[$cacheKey])) { + self::$denormalizeCache[$cacheKey][$propertyName] = $this->getCacheValueForDenormalization($propertyName, $class, $context); + } + + return self::$denormalizeCache[$cacheKey][$propertyName] ?? $this->denormalizeFallback($propertyName, $class, $format, $context); + } + + private function getCacheValueForNormalization(string $propertyName, string $class): ?string + { + if (!$this->metadataFactory->hasMetadataFor($class)) { + return null; + } + + $attributesMetadata = $this->metadataFactory->getMetadataFor($class)->getAttributesMetadata(); + if (!\array_key_exists($propertyName, $attributesMetadata)) { + return null; + } + + return $attributesMetadata[$propertyName]->getSerializedName() ?? null; + } + + private function normalizeFallback(string $propertyName, string $class = null, string $format = null, array $context = []): string + { + return $this->fallbackNameConverter ? $this->fallbackNameConverter->normalize($propertyName, $class, $format, $context) : $propertyName; + } + + private function getCacheValueForDenormalization(string $propertyName, string $class, array $context): ?string + { + $cacheKey = $this->getCacheKey($class, $context); + if (!\array_key_exists($cacheKey, self::$attributesMetadataCache)) { + self::$attributesMetadataCache[$cacheKey] = $this->getCacheValueForAttributesMetadata($class, $context); + } + + return self::$attributesMetadataCache[$cacheKey][$propertyName] ?? null; + } + + private function denormalizeFallback(string $propertyName, string $class = null, string $format = null, array $context = []): string + { + return $this->fallbackNameConverter ? $this->fallbackNameConverter->denormalize($propertyName, $class, $format, $context) : $propertyName; + } + + private function getCacheValueForAttributesMetadata(string $class, array $context): array + { + if (!$this->metadataFactory->hasMetadataFor($class)) { + return []; + } + + $classMetadata = $this->metadataFactory->getMetadataFor($class); + + $cache = []; + foreach ($classMetadata->getAttributesMetadata() as $name => $metadata) { + if (null === $metadata->getSerializedName()) { + continue; + } + + $groups = $metadata->getGroups(); + if (!$groups && ($context[AbstractNormalizer::GROUPS] ?? [])) { + continue; + } + if ($groups && !array_intersect($groups, (array) ($context[AbstractNormalizer::GROUPS] ?? []))) { + continue; + } + + $cache[$metadata->getSerializedName()] = $name; + } + + return $cache; + } + + private function getCacheKey(string $class, array $context): string + { + if (isset($context['cache_key'])) { + return $class.'-'.$context['cache_key']; + } + + return $class.md5(serialize($context[AbstractNormalizer::GROUPS] ?? [])); + } +} diff --git a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php index 74a13321..84d6db2e 100644 --- a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php @@ -14,34 +14,123 @@ use Symfony\Component\Serializer\Exception\CircularReferenceException; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\LogicException; +use Symfony\Component\Serializer\Exception\MissingConstructorArgumentsException; use Symfony\Component\Serializer\Exception\RuntimeException; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\Mapping\AttributeMetadataInterface; +use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\NameConverter\NameConverterInterface; use Symfony\Component\Serializer\SerializerAwareInterface; +use Symfony\Component\Serializer\SerializerAwareTrait; /** * Normalizer implementation. * * @author Kévin Dunglas */ -abstract class AbstractNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface +abstract class AbstractNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface, CacheableSupportsMethodInterface { use ObjectToPopulateTrait; + use SerializerAwareTrait; + + /* constants to configure the context */ + + /** + * How many loops of circular reference to allow while normalizing. + * + * The default value of 1 means that when we encounter the same object a + * second time, we consider that a circular reference. + * + * You can raise this value for special cases, e.g. in combination with the + * max depth setting of the object normalizer. + */ + public const CIRCULAR_REFERENCE_LIMIT = 'circular_reference_limit'; + + /** + * Instead of creating a new instance of an object, update the specified object. + * + * If you have a nested structure, child objects will be overwritten with + * new instances unless you set DEEP_OBJECT_TO_POPULATE to true. + */ + public const OBJECT_TO_POPULATE = 'object_to_populate'; + + /** + * Only (de)normalize attributes that are in the specified groups. + */ + public const GROUPS = 'groups'; - const CIRCULAR_REFERENCE_LIMIT = 'circular_reference_limit'; - const OBJECT_TO_POPULATE = 'object_to_populate'; - const GROUPS = 'groups'; - const ATTRIBUTES = 'attributes'; - const ALLOW_EXTRA_ATTRIBUTES = 'allow_extra_attributes'; + /** + * Limit (de)normalize to the specified names. + * + * For nested structures, this list needs to reflect the object tree. + */ + public const ATTRIBUTES = 'attributes'; /** - * @var int + * If ATTRIBUTES are specified, and the source has fields that are not part of that list, + * either ignore those attributes (true) or throw an ExtraAttributesException (false). + */ + public const ALLOW_EXTRA_ATTRIBUTES = 'allow_extra_attributes'; + + /** + * Hashmap of default values for constructor arguments. + * + * The names need to match the parameter names in the constructor arguments. + */ + public const DEFAULT_CONSTRUCTOR_ARGUMENTS = 'default_constructor_arguments'; + + /** + * Hashmap of field name => callable to normalize this field. + * + * The callable is called if the field is encountered with the arguments: + * + * - mixed $attributeValue value of this field + * - object $object the whole object being normalized + * - string $attributeName name of the attribute being normalized + * - string $format the requested format + * - array $context the serialization context + */ + public const CALLBACKS = 'callbacks'; + + /** + * Handler to call when a circular reference has been detected. + * + * If you specify no handler, a CircularReferenceException is thrown. + * + * The method will be called with ($object, $format, $context) and its + * return value is returned as the result of the normalize call. + */ + public const CIRCULAR_REFERENCE_HANDLER = 'circular_reference_handler'; + + /** + * Skip the specified attributes when normalizing an object tree. + * + * This list is applied to each element of nested structures. + * + * Note: The behaviour for nested structures is different from ATTRIBUTES + * for historical reason. Aligning the behaviour would be a BC break. + */ + public const IGNORED_ATTRIBUTES = 'ignored_attributes'; + + /** + * @internal + */ + protected const CIRCULAR_REFERENCE_LIMIT_COUNTERS = 'circular_reference_limit_counters'; + + protected $defaultContext = [ + self::ALLOW_EXTRA_ATTRIBUTES => true, + self::CIRCULAR_REFERENCE_LIMIT => 1, + self::IGNORED_ATTRIBUTES => [], + ]; + + /** + * @deprecated since Symfony 4.2 */ protected $circularReferenceLimit = 1; /** - * @var callable + * @deprecated since Symfony 4.2 + * + * @var callable|null */ protected $circularReferenceHandler; @@ -56,31 +145,50 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N protected $nameConverter; /** - * @var array + * @deprecated since Symfony 4.2 */ - protected $callbacks = array(); + protected $callbacks = []; /** - * @var array + * @deprecated since Symfony 4.2 */ - protected $ignoredAttributes = array(); + protected $ignoredAttributes = []; /** - * @var array + * @deprecated since Symfony 4.2 */ - protected $camelizedAttributes = array(); + protected $camelizedAttributes = []; /** * Sets the {@link ClassMetadataFactoryInterface} to use. */ - public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null) + public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, array $defaultContext = []) { $this->classMetadataFactory = $classMetadataFactory; $this->nameConverter = $nameConverter; + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); + + if (isset($this->defaultContext[self::CALLBACKS])) { + if (!\is_array($this->defaultContext[self::CALLBACKS])) { + throw new InvalidArgumentException(sprintf('The "%s" default context option must be an array of callables.', self::CALLBACKS)); + } + + foreach ($this->defaultContext[self::CALLBACKS] as $attribute => $callback) { + if (!\is_callable($callback)) { + throw new InvalidArgumentException(sprintf('Invalid callback found for attribute "%s" in the "%s" default context option.', $attribute, self::CALLBACKS)); + } + } + } + + if (isset($this->defaultContext[self::CIRCULAR_REFERENCE_HANDLER]) && !\is_callable($this->defaultContext[self::CIRCULAR_REFERENCE_HANDLER])) { + throw new InvalidArgumentException(sprintf('Invalid callback found in the "%s" default context option.', self::CIRCULAR_REFERENCE_HANDLER)); + } } /** - * Set circular reference limit. + * Sets circular reference limit. + * + * @deprecated since Symfony 4.2 * * @param int $circularReferenceLimit Limit of iterations for the same object * @@ -88,27 +196,33 @@ public function __construct(ClassMetadataFactoryInterface $classMetadataFactory */ public function setCircularReferenceLimit($circularReferenceLimit) { - $this->circularReferenceLimit = $circularReferenceLimit; + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the "circular_reference_limit" key of the context instead.', __METHOD__), \E_USER_DEPRECATED); + + $this->defaultContext[self::CIRCULAR_REFERENCE_LIMIT] = $this->circularReferenceLimit = $circularReferenceLimit; return $this; } /** - * Set circular reference handler. + * Sets circular reference handler. * - * @param callable $circularReferenceHandler + * @deprecated since Symfony 4.2 * * @return self */ public function setCircularReferenceHandler(callable $circularReferenceHandler) { - $this->circularReferenceHandler = $circularReferenceHandler; + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the "circular_reference_handler" key of the context instead.', __METHOD__), \E_USER_DEPRECATED); + + $this->defaultContext[self::CIRCULAR_REFERENCE_HANDLER] = $this->circularReferenceHandler = $circularReferenceHandler; return $this; } /** - * Set normalization callbacks. + * Sets normalization callbacks. + * + * @deprecated since Symfony 4.2 * * @param callable[] $callbacks Help normalize the result * @@ -118,31 +232,42 @@ public function setCircularReferenceHandler(callable $circularReferenceHandler) */ public function setCallbacks(array $callbacks) { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the "callbacks" key of the context instead.', __METHOD__), \E_USER_DEPRECATED); + foreach ($callbacks as $attribute => $callback) { if (!\is_callable($callback)) { - throw new InvalidArgumentException(sprintf( - 'The given callback for attribute "%s" is not callable.', - $attribute - )); + throw new InvalidArgumentException(sprintf('The given callback for attribute "%s" is not callable.', $attribute)); } } - $this->callbacks = $callbacks; + $this->defaultContext[self::CALLBACKS] = $this->callbacks = $callbacks; return $this; } /** - * Set ignored attributes for normalization and denormalization. + * Sets ignored attributes for normalization and denormalization. + * + * @deprecated since Symfony 4.2 * * @return self */ public function setIgnoredAttributes(array $ignoredAttributes) { - $this->ignoredAttributes = $ignoredAttributes; + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the "ignored_attributes" key of the context instead.', __METHOD__), \E_USER_DEPRECATED); + + $this->defaultContext[self::IGNORED_ATTRIBUTES] = $this->ignoredAttributes = $ignoredAttributes; return $this; } + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return false; + } + /** * Detects if the configured circular reference limit is reached. * @@ -157,16 +282,17 @@ protected function isCircularReference($object, &$context) { $objectHash = spl_object_hash($object); - if (isset($context[static::CIRCULAR_REFERENCE_LIMIT][$objectHash])) { - if ($context[static::CIRCULAR_REFERENCE_LIMIT][$objectHash] >= $this->circularReferenceLimit) { - unset($context[static::CIRCULAR_REFERENCE_LIMIT][$objectHash]); + $circularReferenceLimit = $context[self::CIRCULAR_REFERENCE_LIMIT] ?? $this->defaultContext[self::CIRCULAR_REFERENCE_LIMIT] ?? $this->circularReferenceLimit; + if (isset($context[self::CIRCULAR_REFERENCE_LIMIT_COUNTERS][$objectHash])) { + if ($context[self::CIRCULAR_REFERENCE_LIMIT_COUNTERS][$objectHash] >= $circularReferenceLimit) { + unset($context[self::CIRCULAR_REFERENCE_LIMIT_COUNTERS][$objectHash]); return true; } - ++$context[static::CIRCULAR_REFERENCE_LIMIT][$objectHash]; + ++$context[self::CIRCULAR_REFERENCE_LIMIT_COUNTERS][$objectHash]; } else { - $context[static::CIRCULAR_REFERENCE_LIMIT][$objectHash] = 1; + $context[self::CIRCULAR_REFERENCE_LIMIT_COUNTERS][$objectHash] = 1; } return false; @@ -178,44 +304,60 @@ protected function isCircularReference($object, &$context) * If a circular reference handler is set, it will be called. Otherwise, a * {@class CircularReferenceException} will be thrown. * - * @param object $object + * @final since Symfony 4.2 + * + * @param object $object + * @param string|null $format + * @param array $context * * @return mixed * * @throws CircularReferenceException */ - protected function handleCircularReference($object) + protected function handleCircularReference($object/*, string $format = null, array $context = []*/) { - if ($this->circularReferenceHandler) { - return \call_user_func($this->circularReferenceHandler, $object); + if (\func_num_args() < 2 && __CLASS__ !== static::class && __CLASS__ !== (new \ReflectionMethod($this, __FUNCTION__))->getDeclaringClass()->getName() && !$this instanceof \PHPUnit\Framework\MockObject\MockObject && !$this instanceof \Prophecy\Prophecy\ProphecySubjectInterface && !$this instanceof \Mockery\MockInterface) { + @trigger_error(sprintf('The "%s()" method will have two new "string $format = null" and "array $context = []" arguments in version 5.0, not defining it is deprecated since Symfony 4.2.', __METHOD__), \E_USER_DEPRECATED); + } + $format = \func_num_args() > 1 ? func_get_arg(1) : null; + $context = \func_num_args() > 2 ? func_get_arg(2) : []; + + $circularReferenceHandler = $context[self::CIRCULAR_REFERENCE_HANDLER] ?? $this->defaultContext[self::CIRCULAR_REFERENCE_HANDLER] ?? $this->circularReferenceHandler; + if ($circularReferenceHandler) { + return $circularReferenceHandler($object, $format, $context); } - throw new CircularReferenceException(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d)', \get_class($object), $this->circularReferenceLimit)); + throw new CircularReferenceException(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d).', \get_class($object), $context[self::CIRCULAR_REFERENCE_LIMIT] ?? $this->defaultContext[self::CIRCULAR_REFERENCE_LIMIT] ?? $this->circularReferenceLimit)); } /** * Gets attributes to normalize using groups. * * @param string|object $classOrObject - * @param array $context * @param bool $attributesAsString If false, return an array of {@link AttributeMetadataInterface} * + * @throws LogicException if the 'allow_extra_attributes' context variable is false and no class metadata factory is provided + * * @return string[]|AttributeMetadataInterface[]|bool */ protected function getAllowedAttributes($classOrObject, array $context, $attributesAsString = false) { + $allowExtraAttributes = $context[self::ALLOW_EXTRA_ATTRIBUTES] ?? $this->defaultContext[self::ALLOW_EXTRA_ATTRIBUTES]; if (!$this->classMetadataFactory) { + if (!$allowExtraAttributes) { + throw new LogicException(sprintf('A class metadata factory must be provided in the constructor when setting "%s" to false.', self::ALLOW_EXTRA_ATTRIBUTES)); + } + return false; } - $groups = false; - if (isset($context[static::GROUPS]) && \is_array($context[static::GROUPS])) { - $groups = $context[static::GROUPS]; - } elseif (!isset($context[static::ALLOW_EXTRA_ATTRIBUTES]) || $context[static::ALLOW_EXTRA_ATTRIBUTES]) { + $tmpGroups = $context[self::GROUPS] ?? $this->defaultContext[self::GROUPS] ?? null; + $groups = (\is_array($tmpGroups) || is_scalar($tmpGroups)) ? (array) $tmpGroups : false; + if (false === $groups && $allowExtraAttributes) { return false; } - $allowedAttributes = array(); + $allowedAttributes = []; foreach ($this->classMetadataFactory->getMetadataFor($classOrObject)->getAttributesMetadata() as $attributeMetadata) { $name = $attributeMetadata->getName(); @@ -236,23 +378,24 @@ protected function getAllowedAttributes($classOrObject, array $context, $attribu * @param object|string $classOrObject * @param string $attribute * @param string|null $format - * @param array $context * * @return bool */ - protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = array()) + protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = []) { - if (in_array($attribute, $this->ignoredAttributes)) { + $ignoredAttributes = $context[self::IGNORED_ATTRIBUTES] ?? $this->defaultContext[self::IGNORED_ATTRIBUTES] ?? $this->ignoredAttributes; + if (\in_array($attribute, $ignoredAttributes)) { return false; } - if (isset($context[self::ATTRIBUTES][$attribute])) { + $attributes = $context[self::ATTRIBUTES] ?? $this->defaultContext[self::ATTRIBUTES] ?? null; + if (isset($attributes[$attribute])) { // Nested attributes return true; } - if (isset($context[self::ATTRIBUTES]) && is_array($context[self::ATTRIBUTES])) { - return in_array($attribute, $context[self::ATTRIBUTES], true); + if (\is_array($attributes)) { + return \in_array($attribute, $attributes, true); } return true; @@ -275,11 +418,8 @@ protected function prepareForDenormalization($data) * Returns the method to use to construct an object. This method must be either * the object constructor or static. * - * @param array $data - * @param string $class - * @param array $context - * @param \ReflectionClass $reflectionClass - * @param array|bool $allowedAttributes + * @param string $class + * @param array|bool $allowedAttributes * * @return \ReflectionMethod|null */ @@ -296,84 +436,73 @@ protected function getConstructor(array &$data, $class, array &$context, \Reflec * is removed from the context before being returned to avoid side effects * when recursively normalizing an object graph. * - * @param array $data - * @param string $class - * @param array $context - * @param \ReflectionClass $reflectionClass - * @param array|bool $allowedAttributes - * @param string|null $format + * @param string $class + * @param array|bool $allowedAttributes * * @return object * * @throws RuntimeException + * @throws MissingConstructorArgumentsException */ - protected function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes/*, string $format = null*/) + protected function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes, string $format = null) { - if (\func_num_args() >= 6) { - $format = \func_get_arg(5); - } else { - if (__CLASS__ !== \get_class($this)) { - $r = new \ReflectionMethod($this, __FUNCTION__); - if (__CLASS__ !== $r->getDeclaringClass()->getName()) { - @trigger_error(sprintf('Method %s::%s() will have a 6th `string $format = null` argument in version 4.0. Not defining it is deprecated since Symfony 3.2.', get_class($this), __FUNCTION__), E_USER_DEPRECATED); - } - } - - $format = null; - } - - if (null !== $object = $this->extractObjectToPopulate($class, $context, static::OBJECT_TO_POPULATE)) { - unset($context[static::OBJECT_TO_POPULATE]); + if (null !== $object = $this->extractObjectToPopulate($class, $context, self::OBJECT_TO_POPULATE)) { + unset($context[self::OBJECT_TO_POPULATE]); return $object; } + // clean up even if no match + unset($context[static::OBJECT_TO_POPULATE]); $constructor = $this->getConstructor($data, $class, $context, $reflectionClass, $allowedAttributes); if ($constructor) { + if (true !== $constructor->isPublic()) { + return $reflectionClass->newInstanceWithoutConstructor(); + } + $constructorParameters = $constructor->getParameters(); - $params = array(); + $params = []; foreach ($constructorParameters as $constructorParameter) { $paramName = $constructorParameter->name; - $key = $this->nameConverter ? $this->nameConverter->normalize($paramName) : $paramName; + $key = $this->nameConverter ? $this->nameConverter->normalize($paramName, $class, $format, $context) : $paramName; $allowed = false === $allowedAttributes || \in_array($paramName, $allowedAttributes); $ignored = !$this->isAllowedAttribute($class, $paramName, $format, $context); - if (method_exists($constructorParameter, 'isVariadic') && $constructorParameter->isVariadic()) { - if ($allowed && !$ignored && (isset($data[$key]) || array_key_exists($key, $data))) { + if ($constructorParameter->isVariadic()) { + if ($allowed && !$ignored && (isset($data[$key]) || \array_key_exists($key, $data))) { if (!\is_array($data[$paramName])) { - throw new RuntimeException(sprintf('Cannot create an instance of %s from serialized data because the variadic parameter %s can only accept an array.', $class, $constructorParameter->name)); + throw new RuntimeException(sprintf('Cannot create an instance of "%s" from serialized data because the variadic parameter "%s" can only accept an array.', $class, $constructorParameter->name)); + } + + $variadicParameters = []; + foreach ($data[$paramName] as $parameterData) { + $variadicParameters[] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $context, $format); } - $params = array_merge($params, $data[$paramName]); + $params = array_merge($params, $variadicParameters); + unset($data[$key]); } - } elseif ($allowed && !$ignored && (isset($data[$key]) || array_key_exists($key, $data))) { + } elseif ($allowed && !$ignored && (isset($data[$key]) || \array_key_exists($key, $data))) { $parameterData = $data[$key]; - try { - if (null !== $constructorParameter->getClass()) { - if (!$this->serializer instanceof DenormalizerInterface) { - throw new LogicException(sprintf('Cannot create an instance of %s from serialized data because the serializer inject in "%s" is not a denormalizer', $constructorParameter->getClass(), static::class)); - } - $parameterClass = $constructorParameter->getClass()->getName(); - $parameterData = $this->serializer->denormalize($parameterData, $parameterClass, $format, $this->createChildContext($context, $paramName)); - } - } catch (\ReflectionException $e) { - throw new RuntimeException(sprintf('Could not determine the class of the parameter "%s".', $key), 0, $e); + if (null === $parameterData && $constructorParameter->allowsNull()) { + $params[] = null; + // Don't run set for a parameter passed to the constructor + unset($data[$key]); + continue; } // Don't run set for a parameter passed to the constructor - $params[] = $parameterData; + $params[] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $context, $format); unset($data[$key]); + } elseif (\array_key_exists($key, $context[static::DEFAULT_CONSTRUCTOR_ARGUMENTS][$class] ?? [])) { + $params[] = $context[static::DEFAULT_CONSTRUCTOR_ARGUMENTS][$class][$key]; + } elseif (\array_key_exists($key, $this->defaultContext[self::DEFAULT_CONSTRUCTOR_ARGUMENTS][$class] ?? [])) { + $params[] = $this->defaultContext[self::DEFAULT_CONSTRUCTOR_ARGUMENTS][$class][$key]; } elseif ($constructorParameter->isDefaultValueAvailable()) { $params[] = $constructorParameter->getDefaultValue(); } else { - throw new RuntimeException( - sprintf( - 'Cannot create an instance of %s from serialized data because its constructor requires parameter "%s" to be present.', - $class, - $constructorParameter->name - ) - ); + throw new MissingConstructorArgumentsException(sprintf('Cannot create an instance of "%s" from serialized data because its constructor requires parameter "%s" to be present.', $class, $constructorParameter->name)); } } @@ -388,15 +517,44 @@ protected function instantiateObject(array &$data, $class, array &$context, \Ref } /** - * @param array $parentContext - * @param string $attribute - * - * @return array + * @internal + */ + protected function denormalizeParameter(\ReflectionClass $class, \ReflectionParameter $parameter, $parameterName, $parameterData, array $context, $format = null) + { + try { + if (($parameterType = $parameter->getType()) instanceof \ReflectionNamedType && !$parameterType->isBuiltin()) { + $parameterClass = $parameterType->getName(); + new \ReflectionClass($parameterClass); // throws a \ReflectionException if the class doesn't exist + + if (!$this->serializer instanceof DenormalizerInterface) { + throw new LogicException(sprintf('Cannot create an instance of "%s" from serialized data because the serializer inject in "%s" is not a denormalizer.', $parameterClass, static::class)); + } + + return $this->serializer->denormalize($parameterData, $parameterClass, $format, $this->createChildContext($context, $parameterName, $format)); + } + } catch (\ReflectionException $e) { + throw new RuntimeException(sprintf('Could not determine the class of the parameter "%s".', $parameterName), 0, $e); + } catch (MissingConstructorArgumentsException $e) { + if (!$parameter->getType()->allowsNull()) { + throw $e; + } + + return null; + } + + return $parameterData; + } + + /** + * @param string $attribute Attribute name * * @internal */ - protected function createChildContext(array $parentContext, $attribute) + protected function createChildContext(array $parentContext, $attribute/*, ?string $format */): array { + if (\func_num_args() < 3) { + @trigger_error(sprintf('Method "%s::%s()" will have a third "?string $format" argument in version 5.0; not defining it is deprecated since Symfony 4.3.', static::class, __FUNCTION__), \E_USER_DEPRECATED); + } if (isset($parentContext[self::ATTRIBUTES][$attribute])) { $parentContext[self::ATTRIBUTES] = $parentContext[self::ATTRIBUTES][$attribute]; } else { diff --git a/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php b/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php index 08fbc5fa..a02eec65 100644 --- a/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php @@ -12,13 +12,17 @@ namespace Symfony\Component\Serializer\Normalizer; use Symfony\Component\PropertyAccess\Exception\InvalidArgumentException; +use Symfony\Component\PropertyAccess\Exception\NoSuchPropertyException; +use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; +use Symfony\Component\PropertyInfo\Type; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Exception\ExtraAttributesException; use Symfony\Component\Serializer\Exception\LogicException; use Symfony\Component\Serializer\Exception\NotNormalizableValueException; -use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; -use Symfony\Component\PropertyInfo\Type; +use Symfony\Component\Serializer\Exception\RuntimeException; use Symfony\Component\Serializer\Mapping\AttributeMetadataInterface; +use Symfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata; +use Symfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\NameConverter\NameConverterInterface; @@ -29,20 +33,97 @@ */ abstract class AbstractObjectNormalizer extends AbstractNormalizer { - const ENABLE_MAX_DEPTH = 'enable_max_depth'; - const DEPTH_KEY_PATTERN = 'depth_%s::%s'; - const ALLOW_EXTRA_ATTRIBUTES = 'allow_extra_attributes'; - const DISABLE_TYPE_ENFORCEMENT = 'disable_type_enforcement'; + /** + * Set to true to respect the max depth metadata on fields. + */ + public const ENABLE_MAX_DEPTH = 'enable_max_depth'; + + /** + * How to track the current depth in the context. + */ + public const DEPTH_KEY_PATTERN = 'depth_%s::%s'; + + /** + * While denormalizing, we can verify that types match. + * + * You can disable this by setting this flag to true. + */ + public const DISABLE_TYPE_ENFORCEMENT = 'disable_type_enforcement'; + + /** + * Flag to control whether fields with the value `null` should be output + * when normalizing or omitted. + */ + public const SKIP_NULL_VALUES = 'skip_null_values'; + + /** + * Callback to allow to set a value for an attribute when the max depth has + * been reached. + * + * If no callback is given, the attribute is skipped. If a callable is + * given, its return value is used (even if null). + * + * The arguments are: + * + * - mixed $attributeValue value of this field + * - object $object the whole object being normalized + * - string $attributeName name of the attribute being normalized + * - string $format the requested format + * - array $context the serialization context + */ + public const MAX_DEPTH_HANDLER = 'max_depth_handler'; + + /** + * Specify which context key are not relevant to determine which attributes + * of an object to (de)normalize. + */ + public const EXCLUDE_FROM_CACHE_KEY = 'exclude_from_cache_key'; + + /** + * Flag to tell the denormalizer to also populate existing objects on + * attributes of the main object. + * + * Setting this to true is only useful if you also specify the root object + * in OBJECT_TO_POPULATE. + */ + public const DEEP_OBJECT_TO_POPULATE = 'deep_object_to_populate'; + + public const PRESERVE_EMPTY_OBJECTS = 'preserve_empty_objects'; private $propertyTypeExtractor; - private $attributesCache = array(); - private $cache = array(); + private $typesCache = []; + private $attributesCache = []; - public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null) + /** + * @deprecated since Symfony 4.2 + * + * @var callable|null + */ + private $maxDepthHandler; + private $objectClassResolver; + + /** + * @var ClassDiscriminatorResolverInterface|null + */ + protected $classDiscriminatorResolver; + + public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null, array $defaultContext = []) { - parent::__construct($classMetadataFactory, $nameConverter); + parent::__construct($classMetadataFactory, $nameConverter, $defaultContext); + + if (isset($this->defaultContext[self::MAX_DEPTH_HANDLER]) && !\is_callable($this->defaultContext[self::MAX_DEPTH_HANDLER])) { + throw new InvalidArgumentException(sprintf('The "%s" given in the default context is not callable.', self::MAX_DEPTH_HANDLER)); + } + + $this->defaultContext[self::EXCLUDE_FROM_CACHE_KEY] = array_merge($this->defaultContext[self::EXCLUDE_FROM_CACHE_KEY] ?? [], [self::CIRCULAR_REFERENCE_LIMIT_COUNTERS]); $this->propertyTypeExtractor = $propertyTypeExtractor; + + if (null === $classDiscriminatorResolver && null !== $classMetadataFactory) { + $classDiscriminatorResolver = new ClassDiscriminatorFromClassMetadata($classMetadataFactory); + } + $this->classDiscriminatorResolver = $classDiscriminatorResolver; + $this->objectClassResolver = $objectClassResolver; } /** @@ -56,63 +137,118 @@ public function supportsNormalization($data, $format = null) /** * {@inheritdoc} */ - public function normalize($object, $format = null, array $context = array()) + public function normalize($object, $format = null, array $context = []) { if (!isset($context['cache_key'])) { $context['cache_key'] = $this->getCacheKey($format, $context); } + if (isset($context[self::CALLBACKS])) { + if (!\is_array($context[self::CALLBACKS])) { + throw new InvalidArgumentException(sprintf('The "%s" context option must be an array of callables.', self::CALLBACKS)); + } + + foreach ($context[self::CALLBACKS] as $attribute => $callback) { + if (!\is_callable($callback)) { + throw new InvalidArgumentException(sprintf('Invalid callback found for attribute "%s" in the "%s" context option.', $attribute, self::CALLBACKS)); + } + } + } + if ($this->isCircularReference($object, $context)) { - return $this->handleCircularReference($object); + return $this->handleCircularReference($object, $format, $context); } - $data = array(); - $stack = array(); + $data = []; + $stack = []; $attributes = $this->getAttributes($object, $format, $context); - $class = get_class($object); + $class = $this->objectClassResolver ? ($this->objectClassResolver)($object) : \get_class($object); $attributesMetadata = $this->classMetadataFactory ? $this->classMetadataFactory->getMetadataFor($class)->getAttributesMetadata() : null; + if (isset($context[self::MAX_DEPTH_HANDLER])) { + $maxDepthHandler = $context[self::MAX_DEPTH_HANDLER]; + if (!\is_callable($maxDepthHandler)) { + throw new InvalidArgumentException(sprintf('The "%s" given in the context is not callable.', self::MAX_DEPTH_HANDLER)); + } + } else { + // already validated in constructor resp by type declaration of setMaxDepthHandler + $maxDepthHandler = $this->defaultContext[self::MAX_DEPTH_HANDLER] ?? $this->maxDepthHandler; + } foreach ($attributes as $attribute) { - if (null !== $attributesMetadata && $this->isMaxDepthReached($attributesMetadata, $class, $attribute, $context)) { + $maxDepthReached = false; + if (null !== $attributesMetadata && ($maxDepthReached = $this->isMaxDepthReached($attributesMetadata, $class, $attribute, $context)) && !$maxDepthHandler) { continue; } $attributeValue = $this->getAttributeValue($object, $attribute, $format, $context); + if ($maxDepthReached) { + $attributeValue = $maxDepthHandler($attributeValue, $object, $attribute, $format, $context); + } - if (isset($this->callbacks[$attribute])) { - $attributeValue = call_user_func($this->callbacks[$attribute], $attributeValue); + /** + * @var callable|null + */ + $callback = $context[self::CALLBACKS][$attribute] ?? $this->defaultContext[self::CALLBACKS][$attribute] ?? $this->callbacks[$attribute] ?? null; + if ($callback) { + $attributeValue = $callback($attributeValue, $object, $attribute, $format, $context); } if (null !== $attributeValue && !is_scalar($attributeValue)) { $stack[$attribute] = $attributeValue; } - $data = $this->updateData($data, $attribute, $attributeValue); + $data = $this->updateData($data, $attribute, $attributeValue, $class, $format, $context); } foreach ($stack as $attribute => $attributeValue) { if (!$this->serializer instanceof NormalizerInterface) { - throw new LogicException(sprintf('Cannot normalize attribute "%s" because the injected serializer is not a normalizer', $attribute)); + throw new LogicException(sprintf('Cannot normalize attribute "%s" because the injected serializer is not a normalizer.', $attribute)); } - $data = $this->updateData($data, $attribute, $this->serializer->normalize($attributeValue, $format, $this->createChildContext($context, $attribute))); + $data = $this->updateData($data, $attribute, $this->serializer->normalize($attributeValue, $format, $this->createChildContext($context, $attribute, $format)), $class, $format, $context); + } + + if (isset($context[self::PRESERVE_EMPTY_OBJECTS]) && !\count($data)) { + return new \ArrayObject(); } return $data; } + /** + * {@inheritdoc} + */ + protected function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes, string $format = null) + { + if ($this->classDiscriminatorResolver && $mapping = $this->classDiscriminatorResolver->getMappingForClass($class)) { + if (!isset($data[$mapping->getTypeProperty()])) { + throw new RuntimeException(sprintf('Type property "%s" not found for the abstract object "%s".', $mapping->getTypeProperty(), $class)); + } + + $type = $data[$mapping->getTypeProperty()]; + if (null === ($mappedClass = $mapping->getClassForType($type))) { + throw new RuntimeException(sprintf('The type "%s" has no mapped class for the abstract object "%s".', $type, $class)); + } + + if ($mappedClass !== $class) { + return $this->instantiateObject($data, $mappedClass, $context, new \ReflectionClass($mappedClass), $allowedAttributes, $format); + } + } + + return parent::instantiateObject($data, $class, $context, $reflectionClass, $allowedAttributes, $format); + } + /** * Gets and caches attributes for the given object, format and context. * * @param object $object * @param string|null $format - * @param array $context * * @return string[] */ - protected function getAttributes($object, $format = null, array $context) + protected function getAttributes($object, $format, array $context) { - $class = get_class($object); + $class = $this->objectClassResolver ? ($this->objectClassResolver)($object) : \get_class($object); $key = $class.'-'.$context['cache_key']; if (isset($this->attributesCache[$key])) { @@ -129,15 +265,17 @@ protected function getAttributes($object, $format = null, array $context) return $allowedAttributes; } - if (isset($context['attributes'])) { - return $this->extractAttributes($object, $format, $context); + $attributes = $this->extractAttributes($object, $format, $context); + + if ($this->classDiscriminatorResolver && $mapping = $this->classDiscriminatorResolver->getMappingForMappedObject($object)) { + array_unshift($attributes, $mapping->getTypeProperty()); } - if (isset($this->attributesCache[$class])) { - return $this->attributesCache[$class]; + if ($context['cache_key']) { + $this->attributesCache[$key] = $attributes; } - return $this->attributesCache[$class] = $this->extractAttributes($object, $format, $context); + return $attributes; } /** @@ -145,11 +283,10 @@ protected function getAttributes($object, $format = null, array $context) * * @param object $object * @param string|null $format - * @param array $context * * @return string[] */ - abstract protected function extractAttributes($object, $format = null, array $context = array()); + abstract protected function extractAttributes($object, $format = null, array $context = []); /** * Gets the attribute value. @@ -157,54 +294,73 @@ abstract protected function extractAttributes($object, $format = null, array $co * @param object $object * @param string $attribute * @param string|null $format - * @param array $context * * @return mixed */ - abstract protected function getAttributeValue($object, $attribute, $format = null, array $context = array()); + abstract protected function getAttributeValue($object, $attribute, $format = null, array $context = []); + + /** + * Sets a handler function that will be called when the max depth is reached. + * + * @deprecated since Symfony 4.2 + */ + public function setMaxDepthHandler(?callable $handler): void + { + @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the "max_depth_handler" key of the context instead.', __METHOD__), \E_USER_DEPRECATED); + + $this->maxDepthHandler = $handler; + } /** * {@inheritdoc} */ public function supportsDenormalization($data, $type, $format = null) { - return isset($this->cache[$type]) ? $this->cache[$type] : $this->cache[$type] = class_exists($type); + return class_exists($type) || (interface_exists($type, false) && $this->classDiscriminatorResolver && null !== $this->classDiscriminatorResolver->getMappingForClass($type)); } /** * {@inheritdoc} */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { if (!isset($context['cache_key'])) { $context['cache_key'] = $this->getCacheKey($format, $context); } - $allowedAttributes = $this->getAllowedAttributes($class, $context, true); + $allowedAttributes = $this->getAllowedAttributes($type, $context, true); $normalizedData = $this->prepareForDenormalization($data); - $extraAttributes = array(); + $extraAttributes = []; - $reflectionClass = new \ReflectionClass($class); - $object = $this->instantiateObject($normalizedData, $class, $context, $reflectionClass, $allowedAttributes, $format); + $reflectionClass = new \ReflectionClass($type); + $object = $this->instantiateObject($normalizedData, $type, $context, $reflectionClass, $allowedAttributes, $format); + $resolvedClass = $this->objectClassResolver ? ($this->objectClassResolver)($object) : \get_class($object); foreach ($normalizedData as $attribute => $value) { if ($this->nameConverter) { - $attribute = $this->nameConverter->denormalize($attribute); + $attribute = $this->nameConverter->denormalize($attribute, $resolvedClass, $format, $context); } - if ((false !== $allowedAttributes && !in_array($attribute, $allowedAttributes)) || !$this->isAllowedAttribute($class, $attribute, $format, $context)) { - if (isset($context[self::ALLOW_EXTRA_ATTRIBUTES]) && !$context[self::ALLOW_EXTRA_ATTRIBUTES]) { + if ((false !== $allowedAttributes && !\in_array($attribute, $allowedAttributes)) || !$this->isAllowedAttribute($resolvedClass, $attribute, $format, $context)) { + if (!($context[self::ALLOW_EXTRA_ATTRIBUTES] ?? $this->defaultContext[self::ALLOW_EXTRA_ATTRIBUTES])) { $extraAttributes[] = $attribute; } continue; } - $value = $this->validateAndDenormalize($class, $attribute, $value, $format, $context); + if ($context[self::DEEP_OBJECT_TO_POPULATE] ?? $this->defaultContext[self::DEEP_OBJECT_TO_POPULATE] ?? false) { + try { + $context[self::OBJECT_TO_POPULATE] = $this->getAttributeValue($object, $attribute, $format, $context); + } catch (NoSuchPropertyException $e) { + } + } + + $value = $this->validateAndDenormalize($resolvedClass, $attribute, $value, $format, $context); try { $this->setAttributeValue($object, $attribute, $value, $format, $context); } catch (InvalidArgumentException $e) { - throw new NotNormalizableValueException($e->getMessage(), $e->getCode(), $e); + throw new NotNormalizableValueException(sprintf('Failed to denormalize attribute "%s" value for class "%s": '.$e->getMessage(), $attribute, $type), $e->getCode(), $e); } } @@ -222,43 +378,66 @@ public function denormalize($data, $class, $format = null, array $context = arra * @param string $attribute * @param mixed $value * @param string|null $format - * @param array $context */ - abstract protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()); + abstract protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = []); /** * Validates the submitted data and denormalizes it. * - * @param string $currentClass - * @param string $attribute - * @param mixed $data - * @param string|null $format - * @param array $context + * @param mixed $data * * @return mixed * * @throws NotNormalizableValueException * @throws LogicException */ - private function validateAndDenormalize($currentClass, $attribute, $data, $format, array $context) + private function validateAndDenormalize(string $currentClass, string $attribute, $data, ?string $format, array $context) { - if (null === $this->propertyTypeExtractor || null === $types = $this->propertyTypeExtractor->getTypes($currentClass, $attribute)) { + if (null === $types = $this->getTypes($currentClass, $attribute)) { return $data; } - $expectedTypes = array(); + $expectedTypes = []; foreach ($types as $type) { if (null === $data && $type->isNullable()) { - return; + return null; + } + + $collectionValueType = $type->isCollection() ? $type->getCollectionValueType() : null; + + // Fix a collection that contains the only one element + // This is special to xml format only + if ('xml' === $format && null !== $collectionValueType && (!\is_array($data) || !\is_int(key($data)))) { + $data = [$data]; } - if ($type->isCollection() && null !== ($collectionValueType = $type->getCollectionValueType()) && Type::BUILTIN_TYPE_OBJECT === $collectionValueType->getBuiltinType()) { + if (null !== $collectionValueType && Type::BUILTIN_TYPE_OBJECT === $collectionValueType->getBuiltinType()) { $builtinType = Type::BUILTIN_TYPE_OBJECT; $class = $collectionValueType->getClassName().'[]'; if (null !== $collectionKeyType = $type->getCollectionKeyType()) { $context['key_type'] = $collectionKeyType; } + } elseif ($type->isCollection() && null !== ($collectionValueType = $type->getCollectionValueType()) && Type::BUILTIN_TYPE_ARRAY === $collectionValueType->getBuiltinType()) { + // get inner type for any nested array + $innerType = $collectionValueType; + + // note that it will break for any other builtinType + $dimensions = '[]'; + while (null !== $innerType->getCollectionValueType() && Type::BUILTIN_TYPE_ARRAY === $innerType->getBuiltinType()) { + $dimensions .= '[]'; + $innerType = $innerType->getCollectionValueType(); + } + + if (null !== $innerType->getClassName()) { + // the builtinType is the inner one and the class is the class followed by []...[] + $builtinType = $innerType->getBuiltinType(); + $class = $innerType->getClassName().$dimensions; + } else { + // default fallback (keep it as array) + $builtinType = $type->getBuiltinType(); + $class = $type->getClassName(); + } } else { $builtinType = $type->getBuiltinType(); $class = $type->getClassName(); @@ -268,10 +447,10 @@ private function validateAndDenormalize($currentClass, $attribute, $data, $forma if (Type::BUILTIN_TYPE_OBJECT === $builtinType) { if (!$this->serializer instanceof DenormalizerInterface) { - throw new LogicException(sprintf('Cannot denormalize attribute "%s" for class "%s" because injected serializer is not a denormalizer', $attribute, $class)); + throw new LogicException(sprintf('Cannot denormalize attribute "%s" for class "%s" because injected serializer is not a denormalizer.', $attribute, $class)); } - $childContext = $this->createChildContext($context, $attribute); + $childContext = $this->createChildContext($context, $attribute, $format); if ($this->serializer->supportsDenormalization($data, $class, $format, $childContext)) { return $this->serializer->denormalize($data, $class, $format, $childContext); } @@ -283,35 +462,84 @@ private function validateAndDenormalize($currentClass, $attribute, $data, $forma // PHP's json_decode automatically converts Numbers without a decimal part to integers. // To circumvent this behavior, integers are converted to floats when denormalizing JSON based formats and when // a float is expected. - if (Type::BUILTIN_TYPE_FLOAT === $builtinType && is_int($data) && false !== strpos($format, JsonEncoder::FORMAT)) { + if (Type::BUILTIN_TYPE_FLOAT === $builtinType && \is_int($data) && false !== strpos($format, JsonEncoder::FORMAT)) { return (float) $data; } - if (call_user_func('is_'.$builtinType, $data)) { + if (('is_'.$builtinType)($data)) { return $data; } } - if (!empty($context[self::DISABLE_TYPE_ENFORCEMENT])) { + if ($context[self::DISABLE_TYPE_ENFORCEMENT] ?? $this->defaultContext[self::DISABLE_TYPE_ENFORCEMENT] ?? false) { return $data; } - throw new NotNormalizableValueException(sprintf('The type of the "%s" attribute for class "%s" must be one of "%s" ("%s" given).', $attribute, $currentClass, implode('", "', array_keys($expectedTypes)), gettype($data))); + throw new NotNormalizableValueException(sprintf('The type of the "%s" attribute for class "%s" must be one of "%s" ("%s" given).', $attribute, $currentClass, implode('", "', array_keys($expectedTypes)), \gettype($data))); + } + + /** + * @internal + */ + protected function denormalizeParameter(\ReflectionClass $class, \ReflectionParameter $parameter, $parameterName, $parameterData, array $context, $format = null) + { + if ($parameter->isVariadic() || null === $this->propertyTypeExtractor || null === $this->propertyTypeExtractor->getTypes($class->getName(), $parameterName)) { + return parent::denormalizeParameter($class, $parameter, $parameterName, $parameterData, $context, $format); + } + + return $this->validateAndDenormalize($class->getName(), $parameterName, $parameterData, $format, $context); + } + + /** + * @return Type[]|null + */ + private function getTypes(string $currentClass, string $attribute): ?array + { + if (null === $this->propertyTypeExtractor) { + return null; + } + + $key = $currentClass.'::'.$attribute; + if (isset($this->typesCache[$key])) { + return false === $this->typesCache[$key] ? null : $this->typesCache[$key]; + } + + if (null !== $types = $this->propertyTypeExtractor->getTypes($currentClass, $attribute)) { + return $this->typesCache[$key] = $types; + } + + if (null !== $this->classDiscriminatorResolver && null !== $discriminatorMapping = $this->classDiscriminatorResolver->getMappingForClass($currentClass)) { + if ($discriminatorMapping->getTypeProperty() === $attribute) { + return $this->typesCache[$key] = [ + new Type(Type::BUILTIN_TYPE_STRING), + ]; + } + + foreach ($discriminatorMapping->getTypesMapping() as $mappedClass) { + if (null !== $types = $this->propertyTypeExtractor->getTypes($mappedClass, $attribute)) { + return $this->typesCache[$key] = $types; + } + } + } + + $this->typesCache[$key] = false; + + return null; } /** * Sets an attribute and apply the name converter if necessary. * - * @param array $data - * @param string $attribute - * @param mixed $attributeValue - * - * @return array + * @param mixed $attributeValue */ - private function updateData(array $data, $attribute, $attributeValue) + private function updateData(array $data, string $attribute, $attributeValue, string $class, ?string $format, array $context): array { + if (null === $attributeValue && ($context[self::SKIP_NULL_VALUES] ?? $this->defaultContext[self::SKIP_NULL_VALUES] ?? false)) { + return $data; + } + if ($this->nameConverter) { - $attribute = $this->nameConverter->normalize($attribute); + $attribute = $this->nameConverter->normalize($attribute, $class, $format, $context); } $data[$attribute] = $attributeValue; @@ -323,23 +551,19 @@ private function updateData(array $data, $attribute, $attributeValue) * Is the max depth reached for the given attribute? * * @param AttributeMetadataInterface[] $attributesMetadata - * @param string $class - * @param string $attribute - * @param array $context - * - * @return bool */ - private function isMaxDepthReached(array $attributesMetadata, $class, $attribute, array &$context) + private function isMaxDepthReached(array $attributesMetadata, string $class, string $attribute, array &$context): bool { + $enableMaxDepth = $context[self::ENABLE_MAX_DEPTH] ?? $this->defaultContext[self::ENABLE_MAX_DEPTH] ?? false; if ( - !isset($context[static::ENABLE_MAX_DEPTH]) || + !$enableMaxDepth || !isset($attributesMetadata[$attribute]) || null === $maxDepth = $attributesMetadata[$attribute]->getMaxDepth() ) { return false; } - $key = sprintf(static::DEPTH_KEY_PATTERN, $class, $attribute); + $key = sprintf(self::DEPTH_KEY_PATTERN, $class, $attribute); if (!isset($context[$key])) { $context[$key] = 1; @@ -356,17 +580,53 @@ private function isMaxDepthReached(array $attributesMetadata, $class, $attribute } /** - * Gets the cache key to use. + * Overwritten to update the cache key for the child. + * + * We must not mix up the attribute cache between parent and children. + * + * {@inheritdoc} * * @param string|null $format - * @param array $context + * + * @internal + */ + protected function createChildContext(array $parentContext, $attribute/*, ?string $format */): array + { + if (\func_num_args() >= 3) { + $format = func_get_arg(2); + } else { + @trigger_error(sprintf('Method "%s::%s()" will have a third "?string $format" argument in version 5.0; not defining it is deprecated since Symfony 4.3.', static::class, __FUNCTION__), \E_USER_DEPRECATED); + $format = null; + } + + $context = parent::createChildContext($parentContext, $attribute, $format); + $context['cache_key'] = $this->getCacheKey($format, $context); + + return $context; + } + + /** + * Builds the cache key for the attributes cache. + * + * The key must be different for every option in the context that could change which attributes should be handled. * * @return bool|string */ - private function getCacheKey($format, array $context) + private function getCacheKey(?string $format, array $context) { + foreach ($context[self::EXCLUDE_FROM_CACHE_KEY] ?? $this->defaultContext[self::EXCLUDE_FROM_CACHE_KEY] as $key) { + unset($context[$key]); + } + unset($context[self::EXCLUDE_FROM_CACHE_KEY]); + unset($context[self::OBJECT_TO_POPULATE]); + unset($context['cache_key']); // avoid artificially different keys + try { - return md5($format.serialize($context)); + return md5($format.serialize([ + 'context' => $context, + 'ignored' => $this->ignoredAttributes, + 'camelized' => $this->camelizedAttributes, + ])); } catch (\Exception $exception) { // The context cannot be serialized, skip the cache return false; diff --git a/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php b/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php index 60ba68be..65b1c2e8 100644 --- a/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php +++ b/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php @@ -22,9 +22,9 @@ * * @author Alexander M. Turek * - * @final since version 3.3. + * @final */ -class ArrayDenormalizer implements DenormalizerInterface, SerializerAwareInterface +class ArrayDenormalizer implements ContextAwareDenormalizerInterface, SerializerAwareInterface, CacheableSupportsMethodInterface { /** * @var SerializerInterface|DenormalizerInterface @@ -35,29 +35,31 @@ class ArrayDenormalizer implements DenormalizerInterface, SerializerAwareInterfa * {@inheritdoc} * * @throws NotNormalizableValueException + * + * @return array */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { if (null === $this->serializer) { throw new BadMethodCallException('Please set a serializer before calling denormalize()!'); } - if (!is_array($data)) { - throw new InvalidArgumentException('Data expected to be an array, '.gettype($data).' given.'); + if (!\is_array($data)) { + throw new InvalidArgumentException('Data expected to be an array, '.\gettype($data).' given.'); } - if ('[]' !== substr($class, -2)) { - throw new InvalidArgumentException('Unsupported class: '.$class); + if ('[]' !== substr($type, -2)) { + throw new InvalidArgumentException('Unsupported class: '.$type); } $serializer = $this->serializer; - $class = substr($class, 0, -2); + $type = substr($type, 0, -2); $builtinType = isset($context['key_type']) ? $context['key_type']->getBuiltinType() : null; foreach ($data as $key => $value) { - if (null !== $builtinType && !call_user_func('is_'.$builtinType, $key)) { - throw new NotNormalizableValueException(sprintf('The type of the key "%s" must be "%s" ("%s" given).', $key, $builtinType, gettype($key))); + if (null !== $builtinType && !('is_'.$builtinType)($key)) { + throw new NotNormalizableValueException(sprintf('The type of the key "%s" must be "%s" ("%s" given).', $key, $builtinType, \gettype($key))); } - $data[$key] = $serializer->denormalize($value, $class, $format, $context); + $data[$key] = $serializer->denormalize($value, $type, $format, $context); } return $data; @@ -66,9 +68,11 @@ public function denormalize($data, $class, $format = null, array $context = arra /** * {@inheritdoc} */ - public function supportsDenormalization($data, $type, $format = null/*, array $context = array()*/) + public function supportsDenormalization($data, $type, $format = null, array $context = []): bool { - $context = \func_num_args() > 3 ? func_get_arg(3) : array(); + if (null === $this->serializer) { + throw new BadMethodCallException(sprintf('The serializer needs to be set to allow "%s()" to be used.', __METHOD__)); + } return '[]' === substr($type, -2) && $this->serializer->supportsDenormalization($data, substr($type, 0, -2), $format, $context); @@ -85,4 +89,12 @@ public function setSerializer(SerializerInterface $serializer) $this->serializer = $serializer; } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return $this->serializer instanceof CacheableSupportsMethodInterface && $this->serializer->hasCacheableSupportsMethod(); + } } diff --git a/vendor/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php b/vendor/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php new file mode 100644 index 00000000..3a55f653 --- /dev/null +++ b/vendor/symfony/serializer/Normalizer/CacheableSupportsMethodInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +/** + * Marker interface for normalizers and denormalizers that use + * only the type and the format in their supports*() methods. + * + * By implementing this interface, the return value of the + * supports*() methods will be cached by type and format. + * + * @author Kévin Dunglas + */ +interface CacheableSupportsMethodInterface +{ + public function hasCacheableSupportsMethod(): bool; +} diff --git a/vendor/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.php b/vendor/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.php new file mode 100644 index 00000000..81a5416f --- /dev/null +++ b/vendor/symfony/serializer/Normalizer/ConstraintViolationListNormalizer.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +use Symfony\Component\Serializer\NameConverter\NameConverterInterface; +use Symfony\Component\Validator\ConstraintViolationListInterface; + +/** + * A normalizer that normalizes a ConstraintViolationListInterface instance. + * + * This Normalizer implements RFC7807 {@link https://tools.ietf.org/html/rfc7807}. + * + * @author Grégoire Pineau + * @author Kévin Dunglas + */ +class ConstraintViolationListNormalizer implements NormalizerInterface, CacheableSupportsMethodInterface +{ + const INSTANCE = 'instance'; + const STATUS = 'status'; + const TITLE = 'title'; + const TYPE = 'type'; + + private $defaultContext; + private $nameConverter; + + public function __construct($defaultContext = [], NameConverterInterface $nameConverter = null) + { + $this->defaultContext = $defaultContext; + $this->nameConverter = $nameConverter; + } + + /** + * {@inheritdoc} + * + * @return array + */ + public function normalize($object, $format = null, array $context = []) + { + $violations = []; + $messages = []; + foreach ($object as $violation) { + $propertyPath = $this->nameConverter ? $this->nameConverter->normalize($violation->getPropertyPath(), null, $format, $context) : $violation->getPropertyPath(); + + $violationEntry = [ + 'propertyPath' => $propertyPath, + 'title' => $violation->getMessage(), + 'parameters' => $violation->getParameters(), + ]; + if (null !== $code = $violation->getCode()) { + $violationEntry['type'] = sprintf('urn:uuid:%s', $code); + } + + $violations[] = $violationEntry; + + $prefix = $propertyPath ? sprintf('%s: ', $propertyPath) : ''; + $messages[] = $prefix.$violation->getMessage(); + } + + $result = [ + 'type' => $context[self::TYPE] ?? $this->defaultContext[self::TYPE] ?? 'https://symfony.com/errors/validation', + 'title' => $context[self::TITLE] ?? $this->defaultContext[self::TITLE] ?? 'Validation Failed', + ]; + if (null !== $status = ($context[self::STATUS] ?? $this->defaultContext[self::STATUS] ?? null)) { + $result['status'] = $status; + } + if ($messages) { + $result['detail'] = implode("\n", $messages); + } + if (null !== $instance = ($context[self::INSTANCE] ?? $this->defaultContext[self::INSTANCE] ?? null)) { + $result['instance'] = $instance; + } + + return $result + ['violations' => $violations]; + } + + /** + * {@inheritdoc} + */ + public function supportsNormalization($data, $format = null) + { + return $data instanceof ConstraintViolationListInterface; + } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; + } +} diff --git a/vendor/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php b/vendor/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php index f0bb48c5..4e68dae1 100644 --- a/vendor/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php +++ b/vendor/symfony/serializer/Normalizer/ContextAwareDenormalizerInterface.php @@ -23,5 +23,5 @@ interface ContextAwareDenormalizerInterface extends DenormalizerInterface * * @param array $context options that denormalizers have access to */ - public function supportsDenormalization($data, $type, $format = null, array $context = array()); + public function supportsDenormalization($data, $type, $format = null, array $context = []); } diff --git a/vendor/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.php b/vendor/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.php index b6ab05b7..c278b7de 100644 --- a/vendor/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.php +++ b/vendor/symfony/serializer/Normalizer/ContextAwareNormalizerInterface.php @@ -23,5 +23,5 @@ interface ContextAwareNormalizerInterface extends NormalizerInterface * * @param array $context options that normalizers have access to */ - public function supportsNormalization($data, $format = null, array $context = array()); + public function supportsNormalization($data, $format = null, array $context = []); } diff --git a/vendor/symfony/serializer/Normalizer/CustomNormalizer.php b/vendor/symfony/serializer/Normalizer/CustomNormalizer.php index 6a15d8da..43d1c217 100644 --- a/vendor/symfony/serializer/Normalizer/CustomNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/CustomNormalizer.php @@ -17,17 +17,15 @@ /** * @author Jordi Boggiano */ -class CustomNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface +class CustomNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface, CacheableSupportsMethodInterface { use ObjectToPopulateTrait; use SerializerAwareTrait; - private $cache = array(); - /** * {@inheritdoc} */ - public function normalize($object, $format = null, array $context = array()) + public function normalize($object, $format = null, array $context = []) { return $object->normalize($this->serializer, $format, $context); } @@ -35,9 +33,9 @@ public function normalize($object, $format = null, array $context = array()) /** * {@inheritdoc} */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { - $object = $this->extractObjectToPopulate($class, $context) ?: new $class(); + $object = $this->extractObjectToPopulate($type, $context) ?: new $type(); $object->denormalize($this->serializer, $data, $format, $context); return $object; @@ -67,14 +65,14 @@ public function supportsNormalization($data, $format = null) */ public function supportsDenormalization($data, $type, $format = null) { - if (isset($this->cache[$type])) { - return $this->cache[$type]; - } - - if (!class_exists($type)) { - return $this->cache[$type] = false; - } + return is_subclass_of($type, DenormalizableInterface::class); + } - return $this->cache[$type] = is_subclass_of($type, 'Symfony\Component\Serializer\Normalizer\DenormalizableInterface'); + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; } } diff --git a/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php b/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php index 995bdf14..4646d6ce 100644 --- a/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php @@ -13,7 +13,9 @@ use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; -use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface as DeprecatedMimeTypeGuesserInterface; +use Symfony\Component\Mime\MimeTypeGuesserInterface; +use Symfony\Component\Mime\MimeTypes; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\NotNormalizableValueException; @@ -23,23 +25,35 @@ * * @author Kévin Dunglas */ -class DataUriNormalizer implements NormalizerInterface, DenormalizerInterface +class DataUriNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface { - private static $supportedTypes = array( + private static $supportedTypes = [ \SplFileInfo::class => true, \SplFileObject::class => true, File::class => true, - ); + ]; /** - * @var MimeTypeGuesserInterface + * @var MimeTypeGuesserInterface|null */ private $mimeTypeGuesser; - public function __construct(MimeTypeGuesserInterface $mimeTypeGuesser = null) + /** + * @param MimeTypeGuesserInterface|null $mimeTypeGuesser + */ + public function __construct($mimeTypeGuesser = null) { - if (null === $mimeTypeGuesser && class_exists('Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser')) { - $mimeTypeGuesser = MimeTypeGuesser::getInstance(); + if ($mimeTypeGuesser instanceof DeprecatedMimeTypeGuesserInterface) { + @trigger_error(sprintf('Passing a %s to "%s()" is deprecated since Symfony 4.3, pass a "%s" instead.', DeprecatedMimeTypeGuesserInterface::class, __METHOD__, MimeTypeGuesserInterface::class), \E_USER_DEPRECATED); + } elseif (null === $mimeTypeGuesser) { + if (class_exists(MimeTypes::class)) { + $mimeTypeGuesser = MimeTypes::getDefault(); + } elseif (class_exists(MimeTypeGuesser::class)) { + @trigger_error(sprintf('Passing null to "%s()" to use a default MIME type guesser without Symfony Mime installed is deprecated since Symfony 4.3. Try running "composer require symfony/mime".', __METHOD__), \E_USER_DEPRECATED); + $mimeTypeGuesser = MimeTypeGuesser::getInstance(); + } + } elseif (!$mimeTypeGuesser instanceof MimeTypes) { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be an instance of "%s" or null, "%s" given.', __METHOD__, MimeTypes::class, \is_object($mimeTypeGuesser) ? \get_class($mimeTypeGuesser) : \gettype($mimeTypeGuesser))); } $this->mimeTypeGuesser = $mimeTypeGuesser; @@ -47,8 +61,10 @@ public function __construct(MimeTypeGuesserInterface $mimeTypeGuesser = null) /** * {@inheritdoc} + * + * @return string */ - public function normalize($object, $format = null, array $context = array()) + public function normalize($object, $format = null, array $context = []) { if (!$object instanceof \SplFileInfo) { throw new InvalidArgumentException('The object must be an instance of "\SplFileInfo".'); @@ -88,15 +104,17 @@ public function supportsNormalization($data, $format = null) * * @throws InvalidArgumentException * @throws NotNormalizableValueException + * + * @return \SplFileInfo */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { if (!preg_match('/^data:([a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}\/[a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}(;[a-z0-9\-]+\=[a-z0-9\-]+)?)?(;base64)?,[a-z0-9\!\$\&\\\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i', $data)) { throw new NotNormalizableValueException('The provided "data:" URI is not valid.'); } try { - switch ($class) { + switch ($type) { case 'Symfony\Component\HttpFoundation\File\File': return new File($data, false); @@ -108,7 +126,7 @@ public function denormalize($data, $class, $format = null, array $context = arra throw new NotNormalizableValueException($exception->getMessage(), $exception->getCode(), $exception); } - throw new InvalidArgumentException(sprintf('The class parameter "%s" is not supported. It must be one of "SplFileInfo", "SplFileObject" or "Symfony\Component\HttpFoundation\File\File".', $class)); + throw new InvalidArgumentException(sprintf('The class parameter "%s" is not supported. It must be one of "SplFileInfo", "SplFileObject" or "Symfony\Component\HttpFoundation\File\File".', $type)); } /** @@ -119,20 +137,28 @@ public function supportsDenormalization($data, $type, $format = null) return isset(self::$supportedTypes[$type]); } + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; + } + /** * Gets the mime type of the object. Defaults to application/octet-stream. - * - * @param \SplFileInfo $object - * - * @return string */ - private function getMimeType(\SplFileInfo $object) + private function getMimeType(\SplFileInfo $object): string { if ($object instanceof File) { return $object->getMimeType(); } - if ($this->mimeTypeGuesser && $mimeType = $this->mimeTypeGuesser->guess($object->getPathname())) { + if ($this->mimeTypeGuesser instanceof DeprecatedMimeTypeGuesserInterface && $mimeType = $this->mimeTypeGuesser->guess($object->getPathname())) { + return $mimeType; + } + + if ($this->mimeTypeGuesser && $mimeType = $this->mimeTypeGuesser->guessMimeType($object->getPathname())) { return $mimeType; } @@ -141,12 +167,8 @@ private function getMimeType(\SplFileInfo $object) /** * Returns the \SplFileObject instance associated with the given \SplFileInfo instance. - * - * @param \SplFileInfo $object - * - * @return \SplFileObject */ - private function extractSplFileObject(\SplFileInfo $object) + private function extractSplFileObject(\SplFileInfo $object): \SplFileObject { if ($object instanceof \SplFileObject) { return $object; diff --git a/vendor/symfony/serializer/Normalizer/DateIntervalNormalizer.php b/vendor/symfony/serializer/Normalizer/DateIntervalNormalizer.php index f3c663c6..31cadaa8 100644 --- a/vendor/symfony/serializer/Normalizer/DateIntervalNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/DateIntervalNormalizer.php @@ -20,34 +20,42 @@ * * @author Jérôme Parmentier */ -class DateIntervalNormalizer implements NormalizerInterface, DenormalizerInterface +class DateIntervalNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface { const FORMAT_KEY = 'dateinterval_format'; - private $format; + private $defaultContext = [ + self::FORMAT_KEY => '%rP%yY%mM%dDT%hH%iM%sS', + ]; /** - * @param string $format + * @param array $defaultContext */ - public function __construct($format = 'P%yY%mM%dDT%hH%iM%sS') + public function __construct($defaultContext = []) { - $this->format = $format; + if (!\is_array($defaultContext)) { + @trigger_error(sprintf('The "format" parameter is deprecated since Symfony 4.2, use the "%s" key of the context instead.', self::FORMAT_KEY), \E_USER_DEPRECATED); + + $defaultContext = [self::FORMAT_KEY => (string) $defaultContext]; + } + + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); } /** * {@inheritdoc} * * @throws InvalidArgumentException + * + * @return string */ - public function normalize($object, $format = null, array $context = array()) + public function normalize($object, $format = null, array $context = []) { if (!$object instanceof \DateInterval) { throw new InvalidArgumentException('The object must be an instance of "\DateInterval".'); } - $dateIntervalFormat = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : $this->format; - - return $object->format($dateIntervalFormat); + return $object->format($context[self::FORMAT_KEY] ?? $this->defaultContext[self::FORMAT_KEY]); } /** @@ -58,30 +66,62 @@ public function supportsNormalization($data, $format = null) return $data instanceof \DateInterval; } + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; + } + /** * {@inheritdoc} * * @throws InvalidArgumentException * @throws UnexpectedValueException + * + * @return \DateInterval */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { - if (!is_string($data)) { - throw new InvalidArgumentException(sprintf('Data expected to be a string, %s given.', gettype($data))); + if (!\is_string($data)) { + throw new InvalidArgumentException(sprintf('Data expected to be a string, "%s" given.', \gettype($data))); } if (!$this->isISO8601($data)) { throw new UnexpectedValueException('Expected a valid ISO 8601 interval string.'); } - $dateIntervalFormat = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : $this->format; - - $valuePattern = '/^'.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?P<$1>\d+)$2', $dateIntervalFormat).'$/'; + $dateIntervalFormat = $context[self::FORMAT_KEY] ?? $this->defaultContext[self::FORMAT_KEY]; + + $signPattern = ''; + switch (substr($dateIntervalFormat, 0, 2)) { + case '%R': + $signPattern = '[-+]'; + $dateIntervalFormat = substr($dateIntervalFormat, 2); + break; + case '%r': + $signPattern = '-?'; + $dateIntervalFormat = substr($dateIntervalFormat, 2); + break; + } + $valuePattern = '/^'.$signPattern.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?P<$1>\d+)$2', $dateIntervalFormat).'$/'; if (!preg_match($valuePattern, $data)) { throw new UnexpectedValueException(sprintf('Value "%s" contains intervals not accepted by format "%s".', $data, $dateIntervalFormat)); } try { + if ('-' === $data[0]) { + $interval = new \DateInterval(substr($data, 1)); + $interval->invert = 1; + + return $interval; + } + + if ('+' === $data[0]) { + return new \DateInterval(substr($data, 1)); + } + return new \DateInterval($data); } catch (\Exception $e) { throw new UnexpectedValueException($e->getMessage(), $e->getCode(), $e); @@ -96,8 +136,8 @@ public function supportsDenormalization($data, $type, $format = null) return \DateInterval::class === $type; } - private function isISO8601($string) + private function isISO8601(string $string): bool { - return preg_match('/^P(?=\w*(?:\d|%\w))(?:\d+Y|%[yY]Y)?(?:\d+M|%[mM]M)?(?:(?:\d+D|%[dD]D)|(?:\d+W|%[wW]W))?(?:T(?:\d+H|[hH]H)?(?:\d+M|[iI]M)?(?:\d+S|[sS]S)?)?$/', $string); + return preg_match('/^[\-+]?P(?=\w*(?:\d|%\w))(?:\d+Y|%[yY]Y)?(?:\d+M|%[mM]M)?(?:(?:\d+D|%[dD]D)|(?:\d+W|%[wW]W))?(?:T(?:\d+H|[hH]H)?(?:\d+M|[iI]M)?(?:\d+S|[sS]S)?)?$/', $string); } } diff --git a/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php b/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php index aedd84a3..996700cf 100644 --- a/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/DateTimeNormalizer.php @@ -20,49 +20,61 @@ * * @author Kévin Dunglas */ -class DateTimeNormalizer implements NormalizerInterface, DenormalizerInterface +class DateTimeNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface { const FORMAT_KEY = 'datetime_format'; const TIMEZONE_KEY = 'datetime_timezone'; - private $format; - private $timezone; + private $defaultContext; - private static $supportedTypes = array( + private static $supportedTypes = [ \DateTimeInterface::class => true, \DateTimeImmutable::class => true, \DateTime::class => true, - ); + ]; /** - * @param string $format - * @param \DateTimeZone|null $timezone + * @param array $defaultContext */ - public function __construct($format = \DateTime::RFC3339, \DateTimeZone $timezone = null) + public function __construct($defaultContext = [], \DateTimeZone $timezone = null) { - $this->format = $format; - $this->timezone = $timezone; + $this->defaultContext = [ + self::FORMAT_KEY => \DateTime::RFC3339, + self::TIMEZONE_KEY => null, + ]; + + if (!\is_array($defaultContext)) { + @trigger_error('Passing configuration options directly to the constructor is deprecated since Symfony 4.2, use the default context instead.', \E_USER_DEPRECATED); + + $defaultContext = [self::FORMAT_KEY => (string) $defaultContext]; + $defaultContext[self::TIMEZONE_KEY] = $timezone; + } + + $this->defaultContext = array_merge($this->defaultContext, $defaultContext); } /** * {@inheritdoc} * * @throws InvalidArgumentException + * + * @return string */ - public function normalize($object, $format = null, array $context = array()) + public function normalize($object, $format = null, array $context = []) { if (!$object instanceof \DateTimeInterface) { throw new InvalidArgumentException('The object must implement the "\DateTimeInterface".'); } - $format = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : $this->format; + $dateTimeFormat = $context[self::FORMAT_KEY] ?? $this->defaultContext[self::FORMAT_KEY]; $timezone = $this->getTimezone($context); if (null !== $timezone) { - $object = (new \DateTimeImmutable('@'.$object->getTimestamp()))->setTimezone($timezone); + $object = clone $object; + $object = $object->setTimezone($timezone); } - return $object->format($format); + return $object->format($dateTimeFormat); } /** @@ -77,10 +89,12 @@ public function supportsNormalization($data, $format = null) * {@inheritdoc} * * @throws NotNormalizableValueException + * + * @return \DateTimeInterface */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { - $dateTimeFormat = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : null; + $dateTimeFormat = $context[self::FORMAT_KEY] ?? null; $timezone = $this->getTimezone($context); if ('' === $data || null === $data) { @@ -88,30 +102,19 @@ public function denormalize($data, $class, $format = null, array $context = arra } if (null !== $dateTimeFormat) { - if (null === $timezone && PHP_VERSION_ID < 70000) { - // https://bugs.php.net/bug.php?id=68669 - $object = \DateTime::class === $class ? \DateTime::createFromFormat($dateTimeFormat, $data) : \DateTimeImmutable::createFromFormat($dateTimeFormat, $data); - } else { - $object = \DateTime::class === $class ? \DateTime::createFromFormat($dateTimeFormat, $data, $timezone) : \DateTimeImmutable::createFromFormat($dateTimeFormat, $data, $timezone); - } + $object = \DateTime::class === $type ? \DateTime::createFromFormat($dateTimeFormat, $data, $timezone) : \DateTimeImmutable::createFromFormat($dateTimeFormat, $data, $timezone); if (false !== $object) { return $object; } - $dateTimeErrors = \DateTime::class === $class ? \DateTime::getLastErrors() : \DateTimeImmutable::getLastErrors(); + $dateTimeErrors = \DateTime::class === $type ? \DateTime::getLastErrors() : \DateTimeImmutable::getLastErrors(); - throw new NotNormalizableValueException(sprintf( - 'Parsing datetime string "%s" using format "%s" resulted in %d errors:'."\n".'%s', - $data, - $dateTimeFormat, - $dateTimeErrors['error_count'], - implode("\n", $this->formatDateTimeErrors($dateTimeErrors['errors'])) - )); + throw new NotNormalizableValueException(sprintf('Parsing datetime string "%s" using format "%s" resulted in %d errors: ', $data, $dateTimeFormat, $dateTimeErrors['error_count'])."\n".implode("\n", $this->formatDateTimeErrors($dateTimeErrors['errors']))); } try { - return \DateTime::class === $class ? new \DateTime($data, $timezone) : new \DateTimeImmutable($data, $timezone); + return \DateTime::class === $type ? new \DateTime($data, $timezone) : new \DateTimeImmutable($data, $timezone); } catch (\Exception $e) { throw new NotNormalizableValueException($e->getMessage(), $e->getCode(), $e); } @@ -125,14 +128,22 @@ public function supportsDenormalization($data, $type, $format = null) return isset(self::$supportedTypes[$type]); } + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; + } + /** * Formats datetime errors. * * @return string[] */ - private function formatDateTimeErrors(array $errors) + private function formatDateTimeErrors(array $errors): array { - $formattedErrors = array(); + $formattedErrors = []; foreach ($errors as $pos => $message) { $formattedErrors[] = sprintf('at position %d: %s', $pos, $message); @@ -141,9 +152,9 @@ private function formatDateTimeErrors(array $errors) return $formattedErrors; } - private function getTimezone(array $context) + private function getTimezone(array $context): ?\DateTimeZone { - $dateTimeZone = array_key_exists(self::TIMEZONE_KEY, $context) ? $context[self::TIMEZONE_KEY] : $this->timezone; + $dateTimeZone = $context[self::TIMEZONE_KEY] ?? $this->defaultContext[self::TIMEZONE_KEY]; if (null === $dateTimeZone) { return null; diff --git a/vendor/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php b/vendor/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php new file mode 100644 index 00000000..10803932 --- /dev/null +++ b/vendor/symfony/serializer/Normalizer/DateTimeZoneNormalizer.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +use Symfony\Component\Serializer\Exception\InvalidArgumentException; +use Symfony\Component\Serializer\Exception\NotNormalizableValueException; + +/** + * Normalizes a {@see \DateTimeZone} object to a timezone string. + * + * @author Jérôme Desjardins + */ +class DateTimeZoneNormalizer implements NormalizerInterface, DenormalizerInterface, CacheableSupportsMethodInterface +{ + /** + * {@inheritdoc} + * + * @throws InvalidArgumentException + * + * @return string + */ + public function normalize($object, $format = null, array $context = []) + { + if (!$object instanceof \DateTimeZone) { + throw new InvalidArgumentException('The object must be an instance of "\DateTimeZone".'); + } + + return $object->getName(); + } + + /** + * {@inheritdoc} + */ + public function supportsNormalization($data, $format = null) + { + return $data instanceof \DateTimeZone; + } + + /** + * {@inheritdoc} + * + * @throws NotNormalizableValueException + * + * @return \DateTimeZone + */ + public function denormalize($data, $type, $format = null, array $context = []) + { + if ('' === $data || null === $data) { + throw new NotNormalizableValueException('The data is either an empty string or null, you should pass a string that can be parsed as a DateTimeZone.'); + } + + try { + return new \DateTimeZone($data); + } catch (\Exception $e) { + throw new NotNormalizableValueException($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function supportsDenormalization($data, $type, $format = null) + { + return \DateTimeZone::class === $type; + } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; + } +} diff --git a/vendor/symfony/serializer/Normalizer/DenormalizableInterface.php b/vendor/symfony/serializer/Normalizer/DenormalizableInterface.php index 5db15418..3e7021b1 100644 --- a/vendor/symfony/serializer/Normalizer/DenormalizableInterface.php +++ b/vendor/symfony/serializer/Normalizer/DenormalizableInterface.php @@ -34,7 +34,7 @@ interface DenormalizableInterface * differently based on different input formats * @param array $context Options for denormalizing * - * @return object + * @return object|object[] */ - public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()); + public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = []); } diff --git a/vendor/symfony/serializer/Normalizer/DenormalizerAwareInterface.php b/vendor/symfony/serializer/Normalizer/DenormalizerAwareInterface.php index 4a6a4e26..f88df1be 100644 --- a/vendor/symfony/serializer/Normalizer/DenormalizerAwareInterface.php +++ b/vendor/symfony/serializer/Normalizer/DenormalizerAwareInterface.php @@ -12,16 +12,12 @@ namespace Symfony\Component\Serializer\Normalizer; /** - * Class accepting a denormalizer. - * * @author Joel Wurtz */ interface DenormalizerAwareInterface { /** * Sets the owning Denormalizer object. - * - * @param DenormalizerInterface $denormalizer */ public function setDenormalizer(DenormalizerInterface $denormalizer); } diff --git a/vendor/symfony/serializer/Normalizer/DenormalizerAwareTrait.php b/vendor/symfony/serializer/Normalizer/DenormalizerAwareTrait.php index ff8528bf..82dba8f1 100644 --- a/vendor/symfony/serializer/Normalizer/DenormalizerAwareTrait.php +++ b/vendor/symfony/serializer/Normalizer/DenormalizerAwareTrait.php @@ -12,8 +12,6 @@ namespace Symfony\Component\Serializer\Normalizer; /** - * DenormalizerAware trait. - * * @author Joel Wurtz */ trait DenormalizerAwareTrait @@ -23,11 +21,6 @@ trait DenormalizerAwareTrait */ protected $denormalizer; - /** - * Sets the Denormalizer. - * - * @param DenormalizerInterface $denormalizer A DenormalizerInterface instance - */ public function setDenormalizer(DenormalizerInterface $denormalizer) { $this->denormalizer = $denormalizer; diff --git a/vendor/symfony/serializer/Normalizer/DenormalizerInterface.php b/vendor/symfony/serializer/Normalizer/DenormalizerInterface.php index c3a2bb53..effe8f1c 100644 --- a/vendor/symfony/serializer/Normalizer/DenormalizerInterface.php +++ b/vendor/symfony/serializer/Normalizer/DenormalizerInterface.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Serializer\Normalizer; use Symfony\Component\Serializer\Exception\BadMethodCallException; +use Symfony\Component\Serializer\Exception\ExceptionInterface; use Symfony\Component\Serializer\Exception\ExtraAttributesException; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\LogicException; @@ -19,8 +20,6 @@ use Symfony\Component\Serializer\Exception\UnexpectedValueException; /** - * Defines the interface of denormalizers. - * * @author Jordi Boggiano */ interface DenormalizerInterface @@ -29,11 +28,11 @@ interface DenormalizerInterface * Denormalizes data back into an object of the given class. * * @param mixed $data Data to restore - * @param string $class The expected class to instantiate + * @param string $type The expected class to instantiate * @param string $format Format the given data was extracted from * @param array $context Options available to the denormalizer * - * @return object + * @return object|array * * @throws BadMethodCallException Occurs when the normalizer is not called in an expected context * @throws InvalidArgumentException Occurs when the arguments are not coherent or not supported @@ -41,8 +40,9 @@ interface DenormalizerInterface * @throws ExtraAttributesException Occurs when the item doesn't have attribute to receive given data * @throws LogicException Occurs when the normalizer is not supposed to denormalize * @throws RuntimeException Occurs if the class cannot be instantiated + * @throws ExceptionInterface Occurs for all the other cases of errors */ - public function denormalize($data, $class, $format = null, array $context = array()); + public function denormalize($data, $type, $format = null, array $context = []); /** * Checks whether the given class is supported for denormalization by this normalizer. diff --git a/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php b/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php index 6eec9dd4..0c289729 100644 --- a/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php @@ -34,15 +34,14 @@ */ class GetSetMethodNormalizer extends AbstractObjectNormalizer { - private static $setterAccessibleCache = array(); - private $cache = array(); + private static $setterAccessibleCache = []; /** * {@inheritdoc} */ public function supportsNormalization($data, $format = null) { - return parent::supportsNormalization($data, $format) && (isset($this->cache[$type = \get_class($data)]) ? $this->cache[$type] : $this->cache[$type] = $this->supports($type)); + return parent::supportsNormalization($data, $format) && $this->supports(\get_class($data)); } /** @@ -50,17 +49,21 @@ public function supportsNormalization($data, $format = null) */ public function supportsDenormalization($data, $type, $format = null) { - return parent::supportsDenormalization($data, $type, $format) && (isset($this->cache[$type]) ? $this->cache[$type] : $this->cache[$type] = $this->supports($type)); + return parent::supportsDenormalization($data, $type, $format) && $this->supports($type); + } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; } /** * Checks if the given class has any get{Property} method. - * - * @param string $class - * - * @return bool */ - private function supports($class) + private function supports(string $class): bool { $class = new \ReflectionClass($class); $methods = $class->getMethods(\ReflectionMethod::IS_PUBLIC); @@ -75,10 +78,8 @@ private function supports($class) /** * Checks if a method's name is get.* or is.*, and can be called without parameters. - * - * @return bool whether the method is a getter or boolean getter */ - private function isGetMethod(\ReflectionMethod $method) + private function isGetMethod(\ReflectionMethod $method): bool { $methodLength = \strlen($method->name); @@ -96,12 +97,12 @@ private function isGetMethod(\ReflectionMethod $method) /** * {@inheritdoc} */ - protected function extractAttributes($object, $format = null, array $context = array()) + protected function extractAttributes($object, $format = null, array $context = []) { $reflectionObject = new \ReflectionObject($object); $reflectionMethods = $reflectionObject->getMethods(\ReflectionMethod::IS_PUBLIC); - $attributes = array(); + $attributes = []; foreach ($reflectionMethods as $method) { if (!$this->isGetMethod($method)) { continue; @@ -109,7 +110,7 @@ protected function extractAttributes($object, $format = null, array $context = a $attributeName = lcfirst(substr($method->name, 0 === strpos($method->name, 'is') ? 2 : 3)); - if ($this->isAllowedAttribute($object, $attributeName)) { + if ($this->isAllowedAttribute($object, $attributeName, $format, $context)) { $attributes[] = $attributeName; } } @@ -120,36 +121,38 @@ protected function extractAttributes($object, $format = null, array $context = a /** * {@inheritdoc} */ - protected function getAttributeValue($object, $attribute, $format = null, array $context = array()) + protected function getAttributeValue($object, $attribute, $format = null, array $context = []) { $ucfirsted = ucfirst($attribute); $getter = 'get'.$ucfirsted; - if (\is_callable(array($object, $getter))) { + if (\is_callable([$object, $getter])) { return $object->$getter(); } $isser = 'is'.$ucfirsted; - if (\is_callable(array($object, $isser))) { + if (\is_callable([$object, $isser])) { return $object->$isser(); } $haser = 'has'.$ucfirsted; - if (\is_callable(array($object, $haser))) { + if (\is_callable([$object, $haser])) { return $object->$haser(); } + + return null; } /** * {@inheritdoc} */ - protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()) + protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = []) { $setter = 'set'.ucfirst($attribute); $key = \get_class($object).':'.$setter; if (!isset(self::$setterAccessibleCache[$key])) { - self::$setterAccessibleCache[$key] = \is_callable(array($object, $setter)) && !(new \ReflectionMethod($object, $setter))->isStatic(); + self::$setterAccessibleCache[$key] = \is_callable([$object, $setter]) && !(new \ReflectionMethod($object, $setter))->isStatic(); } if (self::$setterAccessibleCache[$key]) { diff --git a/vendor/symfony/serializer/Normalizer/JsonSerializableNormalizer.php b/vendor/symfony/serializer/Normalizer/JsonSerializableNormalizer.php index 27ccf802..c4a8c7a7 100644 --- a/vendor/symfony/serializer/Normalizer/JsonSerializableNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/JsonSerializableNormalizer.php @@ -24,7 +24,7 @@ class JsonSerializableNormalizer extends AbstractNormalizer /** * {@inheritdoc} */ - public function normalize($object, $format = null, array $context = array()) + public function normalize($object, $format = null, array $context = []) { if ($this->isCircularReference($object, $context)) { return $this->handleCircularReference($object); @@ -35,7 +35,7 @@ public function normalize($object, $format = null, array $context = array()) } if (!$this->serializer instanceof NormalizerInterface) { - throw new LogicException('Cannot normalize object because injected serializer is not a normalizer'); + throw new LogicException('Cannot normalize object because injected serializer is not a normalizer.'); } return $this->serializer->normalize($object->jsonSerialize(), $format, $context); @@ -60,8 +60,16 @@ public function supportsDenormalization($data, $type, $format = null) /** * {@inheritdoc} */ - public function denormalize($data, $class, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { throw new LogicException(sprintf('Cannot denormalize with "%s".', \JsonSerializable::class)); } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; + } } diff --git a/vendor/symfony/serializer/Normalizer/NormalizableInterface.php b/vendor/symfony/serializer/Normalizer/NormalizableInterface.php index 8542e4f8..f7a55601 100644 --- a/vendor/symfony/serializer/Normalizer/NormalizableInterface.php +++ b/vendor/symfony/serializer/Normalizer/NormalizableInterface.php @@ -35,5 +35,5 @@ interface NormalizableInterface * * @return array|string|int|float|bool */ - public function normalize(NormalizerInterface $normalizer, $format = null, array $context = array()); + public function normalize(NormalizerInterface $normalizer, $format = null, array $context = []); } diff --git a/vendor/symfony/serializer/Normalizer/NormalizerAwareInterface.php b/vendor/symfony/serializer/Normalizer/NormalizerAwareInterface.php index 55015fe6..08865a3f 100644 --- a/vendor/symfony/serializer/Normalizer/NormalizerAwareInterface.php +++ b/vendor/symfony/serializer/Normalizer/NormalizerAwareInterface.php @@ -12,16 +12,12 @@ namespace Symfony\Component\Serializer\Normalizer; /** - * Class accepting a normalizer. - * * @author Joel Wurtz */ interface NormalizerAwareInterface { /** * Sets the owning Normalizer object. - * - * @param NormalizerInterface $normalizer */ public function setNormalizer(NormalizerInterface $normalizer); } diff --git a/vendor/symfony/serializer/Normalizer/NormalizerAwareTrait.php b/vendor/symfony/serializer/Normalizer/NormalizerAwareTrait.php index 7d605875..a8835c93 100644 --- a/vendor/symfony/serializer/Normalizer/NormalizerAwareTrait.php +++ b/vendor/symfony/serializer/Normalizer/NormalizerAwareTrait.php @@ -12,8 +12,6 @@ namespace Symfony\Component\Serializer\Normalizer; /** - * NormalizerAware trait. - * * @author Joel Wurtz */ trait NormalizerAwareTrait @@ -23,11 +21,6 @@ trait NormalizerAwareTrait */ protected $normalizer; - /** - * Sets the normalizer. - * - * @param NormalizerInterface $normalizer A NormalizerInterface instance - */ public function setNormalizer(NormalizerInterface $normalizer) { $this->normalizer = $normalizer; diff --git a/vendor/symfony/serializer/Normalizer/NormalizerInterface.php b/vendor/symfony/serializer/Normalizer/NormalizerInterface.php index 5d0e3d14..9ac88b94 100644 --- a/vendor/symfony/serializer/Normalizer/NormalizerInterface.php +++ b/vendor/symfony/serializer/Normalizer/NormalizerInterface.php @@ -12,12 +12,11 @@ namespace Symfony\Component\Serializer\Normalizer; use Symfony\Component\Serializer\Exception\CircularReferenceException; +use Symfony\Component\Serializer\Exception\ExceptionInterface; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\LogicException; /** - * Defines the interface of normalizers. - * * @author Jordi Boggiano */ interface NormalizerInterface @@ -25,18 +24,19 @@ interface NormalizerInterface /** * Normalizes an object into a set of arrays/scalars. * - * @param object $object Object to normalize + * @param mixed $object Object to normalize * @param string $format Format the normalization result will be encoded as * @param array $context Context options for the normalizer * - * @return array|string|int|float|bool + * @return array|string|int|float|bool|\ArrayObject|null \ArrayObject is used to make sure an empty object is encoded as an object not an array * - * @throws InvalidArgumentException Occurs when the object given is not an attempted type for the normalizer + * @throws InvalidArgumentException Occurs when the object given is not a supported type for the normalizer * @throws CircularReferenceException Occurs when the normalizer detects a circular reference when no circular * reference handler can fix it * @throws LogicException Occurs when the normalizer is not called in an expected context + * @throws ExceptionInterface Occurs for all the other cases of errors */ - public function normalize($object, $format = null, array $context = array()); + public function normalize($object, $format = null, array $context = []); /** * Checks whether the given class is supported for normalization by this normalizer. diff --git a/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php b/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php index 614d6cd4..a71313f1 100644 --- a/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php @@ -15,7 +15,9 @@ use Symfony\Component\PropertyAccess\PropertyAccess; use Symfony\Component\PropertyAccess\PropertyAccessorInterface; use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; -use Symfony\Component\Serializer\Exception\RuntimeException; +use Symfony\Component\Serializer\Exception\LogicException; +use Symfony\Component\Serializer\Mapping\AttributeMetadata; +use Symfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface; use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; use Symfony\Component\Serializer\NameConverter\NameConverterInterface; @@ -28,27 +30,45 @@ class ObjectNormalizer extends AbstractObjectNormalizer { protected $propertyAccessor; - public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null) + private $discriminatorCache = []; + + private $objectClassResolver; + + public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null, array $defaultContext = []) { - if (!\class_exists(PropertyAccess::class)) { - throw new RuntimeException('The ObjectNormalizer class requires the "PropertyAccess" component. Install "symfony/property-access" to use it.'); + if (!class_exists(PropertyAccess::class)) { + throw new LogicException('The ObjectNormalizer class requires the "PropertyAccess" component. Install "symfony/property-access" to use it.'); } - parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor); + parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor, $classDiscriminatorResolver, $objectClassResolver, $defaultContext); $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); + + $this->objectClassResolver = $objectClassResolver ?? function ($class) { + return \is_object($class) ? \get_class($class) : $class; + }; + } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; } /** * {@inheritdoc} */ - protected function extractAttributes($object, $format = null, array $context = array()) + protected function extractAttributes($object, $format = null, array $context = []) { // If not using groups, detect manually - $attributes = array(); + $attributes = []; // methods - $reflClass = new \ReflectionClass($object); + $class = ($this->objectClassResolver)($object); + $reflClass = new \ReflectionClass($class); + foreach ($reflClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $reflMethod) { if ( 0 !== $reflMethod->getNumberOfRequiredParameters() || @@ -83,8 +103,14 @@ protected function extractAttributes($object, $format = null, array $context = a } } + $checkPropertyInitialization = \PHP_VERSION_ID >= 70400; + // properties foreach ($reflClass->getProperties(\ReflectionProperty::IS_PUBLIC) as $reflProperty) { + if ($checkPropertyInitialization && !$reflProperty->isInitialized($object)) { + continue; + } + if ($reflProperty->isStatic() || !$this->isAllowedAttribute($object, $reflProperty->name, $format, $context)) { continue; } @@ -98,15 +124,24 @@ protected function extractAttributes($object, $format = null, array $context = a /** * {@inheritdoc} */ - protected function getAttributeValue($object, $attribute, $format = null, array $context = array()) + protected function getAttributeValue($object, $attribute, $format = null, array $context = []) { - return $this->propertyAccessor->getValue($object, $attribute); + $cacheKey = \get_class($object); + if (!\array_key_exists($cacheKey, $this->discriminatorCache)) { + $this->discriminatorCache[$cacheKey] = null; + if (null !== $this->classDiscriminatorResolver) { + $mapping = $this->classDiscriminatorResolver->getMappingForMappedObject($object); + $this->discriminatorCache[$cacheKey] = null === $mapping ? null : $mapping->getTypeProperty(); + } + } + + return $attribute === $this->discriminatorCache[$cacheKey] ? $this->classDiscriminatorResolver->getTypeForMappedObject($object) : $this->propertyAccessor->getValue($object, $attribute); } /** * {@inheritdoc} */ - protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()) + protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = []) { try { $this->propertyAccessor->setValue($object, $attribute, $value); @@ -114,4 +149,29 @@ protected function setAttributeValue($object, $attribute, $value, $format = null // Properties not found are ignored } } + + /** + * {@inheritdoc} + */ + protected function getAllowedAttributes($classOrObject, array $context, $attributesAsString = false) + { + if (false === $allowedAttributes = parent::getAllowedAttributes($classOrObject, $context, $attributesAsString)) { + return false; + } + + if (null !== $this->classDiscriminatorResolver) { + $class = \is_object($classOrObject) ? \get_class($classOrObject) : $classOrObject; + if (null !== $discriminatorMapping = $this->classDiscriminatorResolver->getMappingForMappedObject($classOrObject)) { + $allowedAttributes[] = $attributesAsString ? $discriminatorMapping->getTypeProperty() : new AttributeMetadata($discriminatorMapping->getTypeProperty()); + } + + if (null !== $discriminatorMapping = $this->classDiscriminatorResolver->getMappingForClass($class)) { + foreach ($discriminatorMapping->getTypesMapping() as $mappedClass) { + $allowedAttributes = array_merge($allowedAttributes, parent::getAllowedAttributes($mappedClass, $context, $attributesAsString)); + } + } + } + + return $allowedAttributes; + } } diff --git a/vendor/symfony/serializer/Normalizer/ObjectToPopulateTrait.php b/vendor/symfony/serializer/Normalizer/ObjectToPopulateTrait.php index ac647889..65363a67 100644 --- a/vendor/symfony/serializer/Normalizer/ObjectToPopulateTrait.php +++ b/vendor/symfony/serializer/Normalizer/ObjectToPopulateTrait.php @@ -17,18 +17,17 @@ trait ObjectToPopulateTrait * Extract the `object_to_populate` field from the context if it exists * and is an instance of the provided $class. * - * @param string $class The class the object should be - * @param $context The denormalization context - * @param string $key They in which to look for the object to populate. - * Keeps backwards compatibility with `AbstractNormalizer`. + * @param string $class The class the object should be + * @param string|null $key They in which to look for the object to populate. + * Keeps backwards compatibility with `AbstractNormalizer`. * * @return object|null an object if things check out, null otherwise */ protected function extractObjectToPopulate($class, array $context, $key = null) { - $key = $key ?: 'object_to_populate'; + $key = $key ?? AbstractNormalizer::OBJECT_TO_POPULATE; - if (isset($context[$key]) && is_object($context[$key]) && $context[$key] instanceof $class) { + if (isset($context[$key]) && \is_object($context[$key]) && $context[$key] instanceof $class) { return $context[$key]; } diff --git a/vendor/symfony/serializer/Normalizer/ProblemNormalizer.php b/vendor/symfony/serializer/Normalizer/ProblemNormalizer.php new file mode 100644 index 00000000..ca7b78b5 --- /dev/null +++ b/vendor/symfony/serializer/Normalizer/ProblemNormalizer.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +use Symfony\Component\ErrorHandler\Exception\FlattenException; + +/** + * Normalizes errors according to the API Problem spec (RFC 7807). + * + * @see https://tools.ietf.org/html/rfc7807 + * + * @author Kévin Dunglas + * @author Yonel Ceruto + */ +class ProblemNormalizer implements NormalizerInterface, CacheableSupportsMethodInterface +{ + private $debug; + private $defaultContext = [ + 'type' => 'https://tools.ietf.org/html/rfc2616#section-10', + 'title' => 'An error occurred', + ]; + + public function __construct(bool $debug = false, array $defaultContext = []) + { + $this->debug = $debug; + $this->defaultContext = $defaultContext + $this->defaultContext; + } + + /** + * {@inheritdoc} + * + * @return array + */ + public function normalize($exception, $format = null, array $context = []) + { + $context += $this->defaultContext; + $debug = $this->debug && ($context['debug'] ?? true); + + $data = [ + 'type' => $context['type'], + 'title' => $context['title'], + 'status' => $context['status'] ?? $exception->getStatusCode(), + 'detail' => $debug ? $exception->getMessage() : $exception->getStatusText(), + ]; + if ($debug) { + $data['class'] = $exception->getClass(); + $data['trace'] = $exception->getTrace(); + } + + return $data; + } + + /** + * {@inheritdoc} + */ + public function supportsNormalization($data, $format = null): bool + { + return $data instanceof FlattenException; + } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return true; + } +} diff --git a/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php b/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php index 52dc4f4a..9e2a5321 100644 --- a/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php @@ -30,14 +30,12 @@ */ class PropertyNormalizer extends AbstractObjectNormalizer { - private $cache = array(); - /** * {@inheritdoc} */ public function supportsNormalization($data, $format = null) { - return parent::supportsNormalization($data, $format) && (isset($this->cache[$type = \get_class($data)]) ? $this->cache[$type] : $this->cache[$type] = $this->supports($type)); + return parent::supportsNormalization($data, $format) && $this->supports(\get_class($data)); } /** @@ -45,17 +43,21 @@ public function supportsNormalization($data, $format = null) */ public function supportsDenormalization($data, $type, $format = null) { - return parent::supportsDenormalization($data, $type, $format) && (isset($this->cache[$type]) ? $this->cache[$type] : $this->cache[$type] = $this->supports($type)); + return parent::supportsDenormalization($data, $type, $format) && $this->supports($type); + } + + /** + * {@inheritdoc} + */ + public function hasCacheableSupportsMethod(): bool + { + return __CLASS__ === static::class; } /** * Checks if the given class has any non-static property. - * - * @param string $class - * - * @return bool */ - private function supports($class) + private function supports(string $class): bool { $class = new \ReflectionClass($class); @@ -74,7 +76,7 @@ private function supports($class) /** * {@inheritdoc} */ - protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = array()) + protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = []) { if (!parent::isAllowedAttribute($classOrObject, $attribute, $format, $context)) { return false; @@ -95,14 +97,25 @@ protected function isAllowedAttribute($classOrObject, $attribute, $format = null /** * {@inheritdoc} */ - protected function extractAttributes($object, $format = null, array $context = array()) + protected function extractAttributes($object, $format = null, array $context = []) { $reflectionObject = new \ReflectionObject($object); - $attributes = array(); + $attributes = []; + $checkPropertyInitialization = \PHP_VERSION_ID >= 70400; do { foreach ($reflectionObject->getProperties() as $property) { - if (!$this->isAllowedAttribute($reflectionObject->getName(), $property->name)) { + if ($checkPropertyInitialization) { + if (!$property->isPublic()) { + $property->setAccessible(true); + } + + if (!$property->isInitialized($object)) { + continue; + } + } + + if (!$this->isAllowedAttribute($reflectionObject->getName(), $property->name, $format, $context)) { continue; } @@ -116,12 +129,12 @@ protected function extractAttributes($object, $format = null, array $context = a /** * {@inheritdoc} */ - protected function getAttributeValue($object, $attribute, $format = null, array $context = array()) + protected function getAttributeValue($object, $attribute, $format = null, array $context = []) { try { $reflectionProperty = $this->getReflectionProperty($object, $attribute); } catch (\ReflectionException $reflectionException) { - return; + return null; } // Override visibility @@ -135,7 +148,7 @@ protected function getAttributeValue($object, $attribute, $format = null, array /** * {@inheritdoc} */ - protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()) + protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = []) { try { $reflectionProperty = $this->getReflectionProperty($object, $attribute); @@ -157,13 +170,10 @@ protected function setAttributeValue($object, $attribute, $value, $format = null /** * @param string|object $classOrObject - * @param string $attribute - * - * @return \ReflectionProperty * * @throws \ReflectionException */ - private function getReflectionProperty($classOrObject, $attribute) + private function getReflectionProperty($classOrObject, string $attribute): \ReflectionProperty { $reflectionClass = new \ReflectionClass($classOrObject); while (true) { diff --git a/vendor/symfony/serializer/Normalizer/SerializerAwareNormalizer.php b/vendor/symfony/serializer/Normalizer/SerializerAwareNormalizer.php deleted file mode 100644 index 0480d9ff..00000000 --- a/vendor/symfony/serializer/Normalizer/SerializerAwareNormalizer.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Normalizer; - -use Symfony\Component\Serializer\SerializerAwareTrait; -use Symfony\Component\Serializer\SerializerAwareInterface; - -/** - * SerializerAware Normalizer implementation. - * - * @author Jordi Boggiano - * - * @deprecated since version 3.1, to be removed in 4.0. Use the SerializerAwareTrait instead. - */ -abstract class SerializerAwareNormalizer implements SerializerAwareInterface -{ - use SerializerAwareTrait; -} diff --git a/vendor/symfony/serializer/Serializer.php b/vendor/symfony/serializer/Serializer.php index 1eafaa96..8e1f57f0 100644 --- a/vendor/symfony/serializer/Serializer.php +++ b/vendor/symfony/serializer/Serializer.php @@ -13,15 +13,21 @@ use Symfony\Component\Serializer\Encoder\ChainDecoder; use Symfony\Component\Serializer\Encoder\ChainEncoder; -use Symfony\Component\Serializer\Encoder\EncoderInterface; +use Symfony\Component\Serializer\Encoder\ContextAwareDecoderInterface; +use Symfony\Component\Serializer\Encoder\ContextAwareEncoderInterface; use Symfony\Component\Serializer\Encoder\DecoderInterface; +use Symfony\Component\Serializer\Encoder\EncoderInterface; +use Symfony\Component\Serializer\Exception\LogicException; use Symfony\Component\Serializer\Exception\NotEncodableValueException; use Symfony\Component\Serializer\Exception\NotNormalizableValueException; +use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; +use Symfony\Component\Serializer\Normalizer\CacheableSupportsMethodInterface; +use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface; +use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface; use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface; +use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; -use Symfony\Component\Serializer\Exception\LogicException; /** * Serializer serializes and deserializes data. @@ -29,16 +35,16 @@ * objects are turned into arrays by normalizers. * arrays are turned into various output formats by encoders. * - * $serializer->serialize($obj, 'xml') - * $serializer->decode($data, 'xml') - * $serializer->denormalize($data, 'Class', 'xml') + * $serializer->serialize($obj, 'xml') + * $serializer->decode($data, 'xml') + * $serializer->denormalize($data, 'Class', 'xml') * * @author Jordi Boggiano * @author Johannes M. Schmitt * @author Lukas Kahwe Smith * @author Kévin Dunglas */ -class Serializer implements SerializerInterface, NormalizerInterface, DenormalizerInterface, EncoderInterface, DecoderInterface +class Serializer implements SerializerInterface, ContextAwareNormalizerInterface, ContextAwareDenormalizerInterface, ContextAwareEncoderInterface, ContextAwareDecoderInterface { /** * @var Encoder\ChainEncoder @@ -51,25 +57,19 @@ class Serializer implements SerializerInterface, NormalizerInterface, Denormaliz protected $decoder; /** - * @var array + * @internal since Symfony 4.1 */ - protected $normalizers = array(); + protected $normalizers = []; - /** - * @var array - * - * @deprecated since 3.1 will be removed in 4.0 - */ - protected $normalizerCache = array(); + private $cachedNormalizers; + private $denormalizerCache = []; + private $normalizerCache = []; /** - * @var array - * - * @deprecated since 3.1 will be removed in 4.0 + * @param (NormalizerInterface|DenormalizerInterface)[] $normalizers + * @param (EncoderInterface|DecoderInterface)[] $encoders */ - protected $denormalizerCache = array(); - - public function __construct(array $normalizers = array(), array $encoders = array()) + public function __construct(array $normalizers = [], array $encoders = []) { foreach ($normalizers as $normalizer) { if ($normalizer instanceof SerializerAwareInterface) { @@ -83,11 +83,16 @@ public function __construct(array $normalizers = array(), array $encoders = arra if ($normalizer instanceof NormalizerAwareInterface) { $normalizer->setNormalizer($this); } + + if (!($normalizer instanceof NormalizerInterface || $normalizer instanceof DenormalizerInterface)) { + @trigger_error(sprintf('Passing normalizers ("%s") which do not implement either "%s" or "%s" has been deprecated since Symfony 4.2.', \get_class($normalizer), NormalizerInterface::class, DenormalizerInterface::class), \E_USER_DEPRECATED); + // throw new \InvalidArgumentException(sprintf('The class "%s" does not implement "%s" or "%s".', \get_class($normalizer), NormalizerInterface::class, DenormalizerInterface::class)); + } } $this->normalizers = $normalizers; - $decoders = array(); - $realEncoders = array(); + $decoders = []; + $realEncoders = []; foreach ($encoders as $encoder) { if ($encoder instanceof SerializerAwareInterface) { $encoder->setSerializer($this); @@ -98,6 +103,11 @@ public function __construct(array $normalizers = array(), array $encoders = arra if ($encoder instanceof EncoderInterface) { $realEncoders[] = $encoder; } + + if (!($encoder instanceof EncoderInterface || $encoder instanceof DecoderInterface)) { + @trigger_error(sprintf('Passing encoders ("%s") which do not implement either "%s" or "%s" has been deprecated since Symfony 4.2.', \get_class($encoder), EncoderInterface::class, DecoderInterface::class), \E_USER_DEPRECATED); + // throw new \InvalidArgumentException(sprintf('The class "%s" does not implement "%s" or "%s".', \get_class($normalizer), EncoderInterface::class, DecoderInterface::class)); + } } $this->encoder = new ChainEncoder($realEncoders); $this->decoder = new ChainDecoder($decoders); @@ -106,10 +116,10 @@ public function __construct(array $normalizers = array(), array $encoders = arra /** * {@inheritdoc} */ - final public function serialize($data, $format, array $context = array()) + final public function serialize($data, $format, array $context = []): string { if (!$this->supportsEncoding($format, $context)) { - throw new NotEncodableValueException(sprintf('Serialization for the format %s is not supported', $format)); + throw new NotEncodableValueException(sprintf('Serialization for the format "%s" is not supported.', $format)); } if ($this->encoder->needsNormalization($format, $context)) { @@ -122,10 +132,10 @@ final public function serialize($data, $format, array $context = array()) /** * {@inheritdoc} */ - final public function deserialize($data, $type, $format, array $context = array()) + final public function deserialize($data, $type, $format, array $context = []) { if (!$this->supportsDecoding($format, $context)) { - throw new NotEncodableValueException(sprintf('Deserialization for the format %s is not supported', $format)); + throw new NotEncodableValueException(sprintf('Deserialization for the format "%s" is not supported.', $format)); } $data = $this->decode($data, $format, $context); @@ -136,7 +146,7 @@ final public function deserialize($data, $type, $format, array $context = array( /** * {@inheritdoc} */ - public function normalize($data, $format = null, array $context = array()) + public function normalize($data, $format = null, array $context = []) { // If a normalizer supports the given data, use it if ($normalizer = $this->getNormalizer($data, $format, $context)) { @@ -148,7 +158,11 @@ public function normalize($data, $format = null, array $context = array()) } if (\is_array($data) || $data instanceof \Traversable) { - $normalized = array(); + if (($context[AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS] ?? false) === true && $data instanceof \Countable && 0 === $data->count()) { + return $data; + } + + $normalized = []; foreach ($data as $key => $val) { $normalized[$key] = $this->normalize($val, $format, $context); } @@ -161,10 +175,10 @@ public function normalize($data, $format = null, array $context = array()) throw new LogicException('You must register at least one normalizer to be able to normalize objects.'); } - throw new NotNormalizableValueException(sprintf('Could not normalize object of type %s, no supporting normalizer found.', \get_class($data))); + throw new NotNormalizableValueException(sprintf('Could not normalize object of type "%s", no supporting normalizer found.', \get_class($data))); } - throw new NotNormalizableValueException(sprintf('An unexpected value could not be normalized: %s', var_export($data, true))); + throw new NotNormalizableValueException('An unexpected value could not be normalized: '.(!\is_resource($data) ? var_export($data, true) : sprintf('%s resource', get_resource_type($data)))); } /** @@ -172,7 +186,7 @@ public function normalize($data, $format = null, array $context = array()) * * @throws NotNormalizableValueException */ - public function denormalize($data, $type, $format = null, array $context = array()) + public function denormalize($data, $type, $format = null, array $context = []) { if (!$this->normalizers) { throw new LogicException('You must register at least one normalizer to be able to denormalize objects.'); @@ -182,48 +196,22 @@ public function denormalize($data, $type, $format = null, array $context = array return $normalizer->denormalize($data, $type, $format, $context); } - throw new NotNormalizableValueException(sprintf('Could not denormalize object of type %s, no supporting normalizer found.', $type)); + throw new NotNormalizableValueException(sprintf('Could not denormalize object of type "%s", no supporting normalizer found.', $type)); } /** * {@inheritdoc} */ - public function supportsNormalization($data, $format = null/*, array $context = array()*/) + public function supportsNormalization($data, $format = null, array $context = []) { - if (\func_num_args() > 2) { - $context = \func_get_arg(2); - } else { - if (__CLASS__ !== \get_class($this)) { - $r = new \ReflectionMethod($this, __FUNCTION__); - if (__CLASS__ !== $r->getDeclaringClass()->getName()) { - @trigger_error(sprintf('Method %s() will have a third `$context = array()` argument in version 4.0. Not defining it is deprecated since Symfony 3.3.', __METHOD__), E_USER_DEPRECATED); - } - } - - $context = array(); - } - return null !== $this->getNormalizer($data, $format, $context); } /** * {@inheritdoc} */ - public function supportsDenormalization($data, $type, $format = null/*, array $context = array()*/) + public function supportsDenormalization($data, $type, $format = null, array $context = []) { - if (\func_num_args() > 3) { - $context = \func_get_arg(3); - } else { - if (__CLASS__ !== \get_class($this)) { - $r = new \ReflectionMethod($this, __FUNCTION__); - if (__CLASS__ !== $r->getDeclaringClass()->getName()) { - @trigger_error(sprintf('Method %s() will have a fourth `$context = array()` argument in version 4.0. Not defining it is deprecated since Symfony 3.3.', __METHOD__), E_USER_DEPRECATED); - } - } - - $context = array(); - } - return null !== $this->getDenormalizer($data, $type, $format, $context); } @@ -233,16 +221,40 @@ public function supportsDenormalization($data, $type, $format = null/*, array $c * @param mixed $data Data to get the serializer for * @param string $format Format name, present to give the option to normalizers to act differently based on formats * @param array $context Options available to the normalizer - * - * @return NormalizerInterface|null */ - private function getNormalizer($data, $format, array $context) + private function getNormalizer($data, ?string $format, array $context): ?NormalizerInterface { - foreach ($this->normalizers as $normalizer) { - if ($normalizer instanceof NormalizerInterface && $normalizer->supportsNormalization($data, $format, $context)) { + if ($this->cachedNormalizers !== $this->normalizers) { + $this->cachedNormalizers = $this->normalizers; + $this->denormalizerCache = $this->normalizerCache = []; + } + $type = \is_object($data) ? \get_class($data) : 'native-'.\gettype($data); + + if (!isset($this->normalizerCache[$format][$type])) { + $this->normalizerCache[$format][$type] = []; + + foreach ($this->normalizers as $k => $normalizer) { + if (!$normalizer instanceof NormalizerInterface) { + continue; + } + + if (!$normalizer instanceof CacheableSupportsMethodInterface || !$normalizer->hasCacheableSupportsMethod()) { + $this->normalizerCache[$format][$type][$k] = false; + } elseif ($normalizer->supportsNormalization($data, $format, $context)) { + $this->normalizerCache[$format][$type][$k] = true; + break; + } + } + } + + foreach ($this->normalizerCache[$format][$type] as $k => $cached) { + $normalizer = $this->normalizers[$k]; + if ($cached || $normalizer->supportsNormalization($data, $format, $context)) { return $normalizer; } } + + return null; } /** @@ -252,22 +264,44 @@ private function getNormalizer($data, $format, array $context) * @param string $class The expected class to instantiate * @param string $format Format name, present to give the option to normalizers to act differently based on formats * @param array $context Options available to the denormalizer - * - * @return DenormalizerInterface|null */ - private function getDenormalizer($data, $class, $format, array $context) + private function getDenormalizer($data, string $class, ?string $format, array $context): ?DenormalizerInterface { - foreach ($this->normalizers as $normalizer) { - if ($normalizer instanceof DenormalizerInterface && $normalizer->supportsDenormalization($data, $class, $format, $context)) { + if ($this->cachedNormalizers !== $this->normalizers) { + $this->cachedNormalizers = $this->normalizers; + $this->denormalizerCache = $this->normalizerCache = []; + } + if (!isset($this->denormalizerCache[$format][$class])) { + $this->denormalizerCache[$format][$class] = []; + + foreach ($this->normalizers as $k => $normalizer) { + if (!$normalizer instanceof DenormalizerInterface) { + continue; + } + + if (!$normalizer instanceof CacheableSupportsMethodInterface || !$normalizer->hasCacheableSupportsMethod()) { + $this->denormalizerCache[$format][$class][$k] = false; + } elseif ($normalizer->supportsDenormalization(null, $class, $format, $context)) { + $this->denormalizerCache[$format][$class][$k] = true; + break; + } + } + } + + foreach ($this->denormalizerCache[$format][$class] as $k => $cached) { + $normalizer = $this->normalizers[$k]; + if ($cached || $normalizer->supportsDenormalization($data, $class, $format, $context)) { return $normalizer; } } + + return null; } /** * {@inheritdoc} */ - final public function encode($data, $format, array $context = array()) + final public function encode($data, $format, array $context = []) { return $this->encoder->encode($data, $format, $context); } @@ -275,7 +309,7 @@ final public function encode($data, $format, array $context = array()) /** * {@inheritdoc} */ - final public function decode($data, $format, array $context = array()) + final public function decode($data, $format, array $context = []) { return $this->decoder->decode($data, $format, $context); } @@ -283,42 +317,16 @@ final public function decode($data, $format, array $context = array()) /** * {@inheritdoc} */ - public function supportsEncoding($format/*, array $context = array()*/) + public function supportsEncoding($format, array $context = []) { - if (\func_num_args() > 1) { - $context = \func_get_arg(1); - } else { - if (__CLASS__ !== \get_class($this)) { - $r = new \ReflectionMethod($this, __FUNCTION__); - if (__CLASS__ !== $r->getDeclaringClass()->getName()) { - @trigger_error(sprintf('Method %s() will have a second `$context = array()` argument in version 4.0. Not defining it is deprecated since Symfony 3.3.', __METHOD__), E_USER_DEPRECATED); - } - } - - $context = array(); - } - return $this->encoder->supportsEncoding($format, $context); } /** * {@inheritdoc} */ - public function supportsDecoding($format/*, array $context = array()*/) + public function supportsDecoding($format, array $context = []) { - if (\func_num_args() > 1) { - $context = \func_get_arg(1); - } else { - if (__CLASS__ !== \get_class($this)) { - $r = new \ReflectionMethod($this, __FUNCTION__); - if (__CLASS__ !== $r->getDeclaringClass()->getName()) { - @trigger_error(sprintf('Method %s() will have a second `$context = array()` argument in version 4.0. Not defining it is deprecated since Symfony 3.3.', __METHOD__), E_USER_DEPRECATED); - } - } - - $context = array(); - } - return $this->decoder->supportsDecoding($format, $context); } } diff --git a/vendor/symfony/serializer/SerializerAwareInterface.php b/vendor/symfony/serializer/SerializerAwareInterface.php index 13dfb392..4811fc96 100644 --- a/vendor/symfony/serializer/SerializerAwareInterface.php +++ b/vendor/symfony/serializer/SerializerAwareInterface.php @@ -12,8 +12,6 @@ namespace Symfony\Component\Serializer; /** - * Defines the interface of encoders. - * * @author Jordi Boggiano */ interface SerializerAwareInterface diff --git a/vendor/symfony/serializer/SerializerAwareTrait.php b/vendor/symfony/serializer/SerializerAwareTrait.php index 7f5839ee..99f4d0f3 100644 --- a/vendor/symfony/serializer/SerializerAwareTrait.php +++ b/vendor/symfony/serializer/SerializerAwareTrait.php @@ -12,8 +12,6 @@ namespace Symfony\Component\Serializer; /** - * SerializerAware trait. - * * @author Joel Wurtz */ trait SerializerAwareTrait @@ -23,11 +21,6 @@ trait SerializerAwareTrait */ protected $serializer; - /** - * Sets the serializer. - * - * @param SerializerInterface $serializer A SerializerInterface instance - */ public function setSerializer(SerializerInterface $serializer) { $this->serializer = $serializer; diff --git a/vendor/symfony/serializer/SerializerInterface.php b/vendor/symfony/serializer/SerializerInterface.php index 196bff1a..9151a890 100644 --- a/vendor/symfony/serializer/SerializerInterface.php +++ b/vendor/symfony/serializer/SerializerInterface.php @@ -12,8 +12,6 @@ namespace Symfony\Component\Serializer; /** - * Defines the interface of the Serializer. - * * @author Jordi Boggiano */ interface SerializerInterface @@ -27,7 +25,7 @@ interface SerializerInterface * * @return string */ - public function serialize($data, $format, array $context = array()); + public function serialize($data, $format, array $context = []); /** * Deserializes data into the given type. @@ -35,9 +33,8 @@ public function serialize($data, $format, array $context = array()); * @param mixed $data * @param string $type * @param string $format - * @param array $context * - * @return object + * @return object|array */ - public function deserialize($data, $type, $format, array $context = array()); + public function deserialize($data, $type, $format, array $context = []); } diff --git a/vendor/symfony/serializer/Tests/Annotation/GroupsTest.php b/vendor/symfony/serializer/Tests/Annotation/GroupsTest.php deleted file mode 100644 index 04729ccb..00000000 --- a/vendor/symfony/serializer/Tests/Annotation/GroupsTest.php +++ /dev/null @@ -1,59 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Annotation; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Annotation\Groups; - -/** - * @author Kévin Dunglas - */ -class GroupsTest extends TestCase -{ - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - */ - public function testEmptyGroupsParameter() - { - new Groups(array('value' => array())); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - */ - public function testNotAnArrayGroupsParameter() - { - new Groups(array('value' => 12)); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - */ - public function testInvalidGroupsParameter() - { - new Groups(array('value' => array('a', 1, new \stdClass()))); - } - - public function testGroupsParameters() - { - $validData = array('a', 'b'); - - $groups = new Groups(array('value' => $validData)); - $this->assertEquals($validData, $groups->getGroups()); - } - - public function testSingleGroup() - { - $groups = new Groups(array('value' => 'a')); - $this->assertEquals(array('a'), $groups->getGroups()); - } -} diff --git a/vendor/symfony/serializer/Tests/Annotation/MaxDepthTest.php b/vendor/symfony/serializer/Tests/Annotation/MaxDepthTest.php deleted file mode 100644 index 4554fc99..00000000 --- a/vendor/symfony/serializer/Tests/Annotation/MaxDepthTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Annotation; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Annotation\MaxDepth; - -/** - * @author Kévin Dunglas - */ -class MaxDepthTest extends TestCase -{ - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - * @expectedExceptionMessage Parameter of annotation "Symfony\Component\Serializer\Annotation\MaxDepth" should be set. - */ - public function testNotSetMaxDepthParameter() - { - new MaxDepth(array()); - } - - public function provideInvalidValues() - { - return array( - array(''), - array('foo'), - array('1'), - array(0), - ); - } - - /** - * @dataProvider provideInvalidValues - * - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - * @expectedExceptionMessage Parameter of annotation "Symfony\Component\Serializer\Annotation\MaxDepth" must be a positive integer. - */ - public function testNotAnIntMaxDepthParameter($value) - { - new MaxDepth(array('value' => $value)); - } - - public function testMaxDepthParameters() - { - $maxDepth = new MaxDepth(array('value' => 3)); - $this->assertEquals(3, $maxDepth->getMaxDepth()); - } -} diff --git a/vendor/symfony/serializer/Tests/DependencyInjection/SerializerPassTest.php b/vendor/symfony/serializer/Tests/DependencyInjection/SerializerPassTest.php deleted file mode 100644 index fa12454f..00000000 --- a/vendor/symfony/serializer/Tests/DependencyInjection/SerializerPassTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\DependencyInjection; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; -use Symfony\Component\Serializer\DependencyInjection\SerializerPass; - -/** - * Tests for the SerializerPass class. - * - * @author Javier Lopez - */ -class SerializerPassTest extends TestCase -{ - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage You must tag at least one service as "serializer.normalizer" to use the "serializer" service - */ - public function testThrowExceptionWhenNoNormalizers() - { - $container = new ContainerBuilder(); - $container->register('serializer'); - - $serializerPass = new SerializerPass(); - $serializerPass->process($container); - } - - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage You must tag at least one service as "serializer.encoder" to use the "serializer" service - */ - public function testThrowExceptionWhenNoEncoders() - { - $container = new ContainerBuilder(); - $container->register('serializer') - ->addArgument(array()) - ->addArgument(array()); - $container->register('normalizer')->addTag('serializer.normalizer'); - - $serializerPass = new SerializerPass(); - $serializerPass->process($container); - } - - public function testServicesAreOrderedAccordingToPriority() - { - $container = new ContainerBuilder(); - - $definition = $container->register('serializer')->setArguments(array(null, null)); - $container->register('n2')->addTag('serializer.normalizer', array('priority' => 100))->addTag('serializer.encoder', array('priority' => 100)); - $container->register('n1')->addTag('serializer.normalizer', array('priority' => 200))->addTag('serializer.encoder', array('priority' => 200)); - $container->register('n3')->addTag('serializer.normalizer')->addTag('serializer.encoder'); - - $serializerPass = new SerializerPass(); - $serializerPass->process($container); - - $expected = array( - new Reference('n1'), - new Reference('n2'), - new Reference('n3'), - ); - $this->assertEquals($expected, $definition->getArgument(0)); - $this->assertEquals($expected, $definition->getArgument(1)); - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/ChainDecoderTest.php b/vendor/symfony/serializer/Tests/Encoder/ChainDecoderTest.php deleted file mode 100644 index 7d860f65..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/ChainDecoderTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\ChainDecoder; - -class ChainDecoderTest extends TestCase -{ - const FORMAT_1 = 'format1'; - const FORMAT_2 = 'format2'; - const FORMAT_3 = 'format3'; - - private $chainDecoder; - private $decoder1; - private $decoder2; - - protected function setUp() - { - $this->decoder1 = $this - ->getMockBuilder('Symfony\Component\Serializer\Encoder\DecoderInterface') - ->getMock(); - - $this->decoder1 - ->method('supportsDecoding') - ->will($this->returnValueMap(array( - array(self::FORMAT_1, array(), true), - array(self::FORMAT_2, array(), false), - array(self::FORMAT_3, array(), false), - array(self::FORMAT_3, array('foo' => 'bar'), true), - ))); - - $this->decoder2 = $this - ->getMockBuilder('Symfony\Component\Serializer\Encoder\DecoderInterface') - ->getMock(); - - $this->decoder2 - ->method('supportsDecoding') - ->will($this->returnValueMap(array( - array(self::FORMAT_1, array(), false), - array(self::FORMAT_2, array(), true), - array(self::FORMAT_3, array(), false), - ))); - - $this->chainDecoder = new ChainDecoder(array($this->decoder1, $this->decoder2)); - } - - public function testSupportsDecoding() - { - $this->assertTrue($this->chainDecoder->supportsDecoding(self::FORMAT_1)); - $this->assertTrue($this->chainDecoder->supportsDecoding(self::FORMAT_2)); - $this->assertFalse($this->chainDecoder->supportsDecoding(self::FORMAT_3)); - $this->assertTrue($this->chainDecoder->supportsDecoding(self::FORMAT_3, array('foo' => 'bar'))); - } - - public function testDecode() - { - $this->decoder1->expects($this->never())->method('decode'); - $this->decoder2->expects($this->once())->method('decode'); - - $this->chainDecoder->decode('string_to_decode', self::FORMAT_2); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\RuntimeException - */ - public function testDecodeUnsupportedFormat() - { - $this->chainDecoder->decode('string_to_decode', self::FORMAT_3); - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/ChainEncoderTest.php b/vendor/symfony/serializer/Tests/Encoder/ChainEncoderTest.php deleted file mode 100644 index 82c64cc1..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/ChainEncoderTest.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\ChainEncoder; -use Symfony\Component\Serializer\Encoder\EncoderInterface; -use Symfony\Component\Serializer\Encoder\NormalizationAwareInterface; - -class ChainEncoderTest extends TestCase -{ - const FORMAT_1 = 'format1'; - const FORMAT_2 = 'format2'; - const FORMAT_3 = 'format3'; - - private $chainEncoder; - private $encoder1; - private $encoder2; - - protected function setUp() - { - $this->encoder1 = $this - ->getMockBuilder('Symfony\Component\Serializer\Encoder\EncoderInterface') - ->getMock(); - - $this->encoder1 - ->method('supportsEncoding') - ->will($this->returnValueMap(array( - array(self::FORMAT_1, array(), true), - array(self::FORMAT_2, array(), false), - array(self::FORMAT_3, array(), false), - array(self::FORMAT_3, array('foo' => 'bar'), true), - ))); - - $this->encoder2 = $this - ->getMockBuilder('Symfony\Component\Serializer\Encoder\EncoderInterface') - ->getMock(); - - $this->encoder2 - ->method('supportsEncoding') - ->will($this->returnValueMap(array( - array(self::FORMAT_1, array(), false), - array(self::FORMAT_2, array(), true), - array(self::FORMAT_3, array(), false), - ))); - - $this->chainEncoder = new ChainEncoder(array($this->encoder1, $this->encoder2)); - } - - public function testSupportsEncoding() - { - $this->assertTrue($this->chainEncoder->supportsEncoding(self::FORMAT_1)); - $this->assertTrue($this->chainEncoder->supportsEncoding(self::FORMAT_2)); - $this->assertFalse($this->chainEncoder->supportsEncoding(self::FORMAT_3)); - $this->assertTrue($this->chainEncoder->supportsEncoding(self::FORMAT_3, array('foo' => 'bar'))); - } - - public function testEncode() - { - $this->encoder1->expects($this->never())->method('encode'); - $this->encoder2->expects($this->once())->method('encode'); - - $this->chainEncoder->encode(array('foo' => 123), self::FORMAT_2); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\RuntimeException - */ - public function testEncodeUnsupportedFormat() - { - $this->chainEncoder->encode(array('foo' => 123), self::FORMAT_3); - } - - public function testNeedsNormalizationBasic() - { - $this->assertTrue($this->chainEncoder->needsNormalization(self::FORMAT_1)); - $this->assertTrue($this->chainEncoder->needsNormalization(self::FORMAT_2)); - } - - /** - * @dataProvider booleanProvider - */ - public function testNeedsNormalizationChainNormalizationAware($bool) - { - $chainEncoder = $this - ->getMockBuilder('Symfony\Component\Serializer\Tests\Encoder\ChainNormalizationAwareEncoder') - ->getMock(); - - $chainEncoder->method('supportsEncoding')->willReturn(true); - $chainEncoder->method('needsNormalization')->willReturn($bool); - - $sut = new ChainEncoder(array($chainEncoder)); - - $this->assertEquals($bool, $sut->needsNormalization(self::FORMAT_1)); - } - - public function testNeedsNormalizationNormalizationAware() - { - $encoder = new NormalizationAwareEncoder(); - $sut = new ChainEncoder(array($encoder)); - - $this->assertFalse($sut->needsNormalization(self::FORMAT_1)); - } - - public function booleanProvider() - { - return array( - array(true), - array(false), - ); - } -} - -class ChainNormalizationAwareEncoder extends ChainEncoder implements NormalizationAwareInterface -{ -} - -class NormalizationAwareEncoder implements EncoderInterface, NormalizationAwareInterface -{ - public function supportsEncoding($format) - { - return true; - } - - public function encode($data, $format, array $context = array()) - { - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/CsvEncoderTest.php b/vendor/symfony/serializer/Tests/Encoder/CsvEncoderTest.php deleted file mode 100644 index a5e5c256..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/CsvEncoderTest.php +++ /dev/null @@ -1,294 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\CsvEncoder; - -/** - * @author Kévin Dunglas - */ -class CsvEncoderTest extends TestCase -{ - /** - * @var CsvEncoder - */ - private $encoder; - - protected function setUp() - { - $this->encoder = new CsvEncoder(); - } - - public function testSupportEncoding() - { - $this->assertTrue($this->encoder->supportsEncoding('csv')); - $this->assertFalse($this->encoder->supportsEncoding('foo')); - } - - public function testEncode() - { - $value = array('foo' => 'hello', 'bar' => 'hey ho'); - - $this->assertEquals(<<<'CSV' -foo,bar -hello,"hey ho" - -CSV - , $this->encoder->encode($value, 'csv')); - } - - public function testEncodeCollection() - { - $value = array( - array('foo' => 'hello', 'bar' => 'hey ho'), - array('foo' => 'hi', 'bar' => 'let\'s go'), - ); - - $this->assertEquals(<<<'CSV' -foo,bar -hello,"hey ho" -hi,"let's go" - -CSV - , $this->encoder->encode($value, 'csv')); - } - - public function testEncodePlainIndexedArray() - { - $this->assertEquals(<<<'CSV' -0,1,2 -a,b,c - -CSV - , $this->encoder->encode(array('a', 'b', 'c'), 'csv')); - } - - public function testEncodeNonArray() - { - $this->assertEquals(<<<'CSV' -0 -foo - -CSV - , $this->encoder->encode('foo', 'csv')); - } - - public function testEncodeNestedArrays() - { - $value = array('foo' => 'hello', 'bar' => array( - array('id' => 'yo', 1 => 'wesh'), - array('baz' => 'Halo', 'foo' => 'olá'), - )); - - $this->assertEquals(<<<'CSV' -foo,bar.0.id,bar.0.1,bar.1.baz,bar.1.foo -hello,yo,wesh,Halo,olá - -CSV - , $this->encoder->encode($value, 'csv')); - } - - public function testEncodeCustomSettings() - { - $this->encoder = new CsvEncoder(';', "'", '|', '-'); - - $value = array('a' => 'he\'llo', 'c' => array('d' => 'foo')); - - $this->assertEquals(<<<'CSV' -a;c-d -'he''llo';foo - -CSV - , $this->encoder->encode($value, 'csv')); - } - - public function testEncodeCustomSettingsPassedInContext() - { - $value = array('a' => 'he\'llo', 'c' => array('d' => 'foo')); - - $this->assertSame(<<<'CSV' -a;c-d -'he''llo';foo - -CSV - , $this->encoder->encode($value, 'csv', array( - CsvEncoder::DELIMITER_KEY => ';', - CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', - CsvEncoder::KEY_SEPARATOR_KEY => '-', - ))); - } - - public function testEncodeEmptyArray() - { - $this->assertEquals("\n\n", $this->encoder->encode(array(), 'csv')); - $this->assertEquals("\n\n", $this->encoder->encode(array(array()), 'csv')); - } - - public function testEncodeVariableStructure() - { - $value = array( - array('a' => array('foo', 'bar')), - array('a' => array(), 'b' => 'baz'), - array('a' => array('bar', 'foo'), 'c' => 'pong'), - ); - $csv = <<assertEquals($csv, $this->encoder->encode($value, 'csv')); - } - - public function testEncodeCustomHeaders() - { - $context = array( - CsvEncoder::HEADERS_KEY => array( - 'b', - 'c', - ), - ); - $value = array( - array('a' => 'foo', 'b' => 'bar'), - ); - $csv = <<assertEquals($csv, $this->encoder->encode($value, 'csv', $context)); - } - - public function testSupportsDecoding() - { - $this->assertTrue($this->encoder->supportsDecoding('csv')); - $this->assertFalse($this->encoder->supportsDecoding('foo')); - } - - public function testDecode() - { - $expected = array('foo' => 'a', 'bar' => 'b'); - - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -foo,bar -a,b -CSV - , 'csv')); - } - - public function testDecodeCollection() - { - $expected = array( - array('foo' => 'a', 'bar' => 'b'), - array('foo' => 'c', 'bar' => 'd'), - array('foo' => 'f'), - ); - - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -foo,bar -a,b -c,d -f - -CSV - , 'csv')); - } - - public function testDecodeToManyRelation() - { - $expected = array( - array('foo' => 'bar', 'relations' => array(array('a' => 'b'), array('a' => 'b'))), - array('foo' => 'bat', 'relations' => array(array('a' => 'b'), array('a' => ''))), - array('foo' => 'bat', 'relations' => array(array('a' => 'b'))), - array('foo' => 'baz', 'relations' => array(array('a' => 'c'), array('a' => 'c'))), - ); - - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -foo,relations.0.a,relations.1.a -bar,b,b -bat,b, -bat,b -baz,c,c -CSV - , 'csv')); - } - - public function testDecodeNestedArrays() - { - $expected = array( - array('foo' => 'a', 'bar' => array('baz' => array('bat' => 'b'))), - array('foo' => 'c', 'bar' => array('baz' => array('bat' => 'd'))), - ); - - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -foo,bar.baz.bat -a,b -c,d -CSV - , 'csv')); - } - - public function testDecodeCustomSettings() - { - $this->encoder = new CsvEncoder(';', "'", '|', '-'); - - $expected = array('a' => 'hell\'o', 'bar' => array('baz' => 'b')); - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -a;bar-baz -'hell''o';b;c -CSV - , 'csv')); - } - - public function testDecodeCustomSettingsPassedInContext() - { - $expected = array('a' => 'hell\'o', 'bar' => array('baz' => 'b')); - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -a;bar-baz -'hell''o';b;c -CSV - , 'csv', array( - CsvEncoder::DELIMITER_KEY => ';', - CsvEncoder::ENCLOSURE_KEY => "'", - CsvEncoder::ESCAPE_CHAR_KEY => '|', - CsvEncoder::KEY_SEPARATOR_KEY => '-', - ))); - } - - public function testDecodeMalformedCollection() - { - $expected = array( - array('foo' => 'a', 'bar' => 'b'), - array('foo' => 'c', 'bar' => 'd'), - array('foo' => 'f'), - ); - - $this->assertEquals($expected, $this->encoder->decode(<<<'CSV' -foo,bar -a,b,e -c,d,g,h -f - -CSV - , 'csv')); - } - - public function testDecodeEmptyArray() - { - $this->assertEquals(array(), $this->encoder->decode('', 'csv')); - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/JsonDecodeTest.php b/vendor/symfony/serializer/Tests/Encoder/JsonDecodeTest.php deleted file mode 100644 index 774064d4..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/JsonDecodeTest.php +++ /dev/null @@ -1,75 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\JsonDecode; -use Symfony\Component\Serializer\Encoder\JsonEncoder; - -class JsonDecodeTest extends TestCase -{ - /** @var \Symfony\Component\Serializer\Encoder\JsonDecode */ - private $decode; - - protected function setUp() - { - $this->decode = new JsonDecode(); - } - - public function testSupportsDecoding() - { - $this->assertTrue($this->decode->supportsDecoding(JsonEncoder::FORMAT)); - $this->assertFalse($this->decode->supportsDecoding('foobar')); - } - - /** - * @dataProvider decodeProvider - */ - public function testDecode($toDecode, $expected, $context) - { - $this->assertEquals( - $expected, - $this->decode->decode($toDecode, JsonEncoder::FORMAT, $context) - ); - } - - public function decodeProvider() - { - $stdClass = new \stdClass(); - $stdClass->foo = 'bar'; - - $assoc = array('foo' => 'bar'); - - return array( - array('{"foo": "bar"}', $stdClass, array()), - array('{"foo": "bar"}', $assoc, array('json_decode_associative' => true)), - ); - } - - /** - * @requires function json_last_error_msg - * @dataProvider decodeProviderException - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDecodeWithException($value) - { - $this->decode->decode($value, JsonEncoder::FORMAT); - } - - public function decodeProviderException() - { - return array( - array("{'foo': 'bar'}"), - array('kaboom!'), - ); - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/JsonEncodeTest.php b/vendor/symfony/serializer/Tests/Encoder/JsonEncodeTest.php deleted file mode 100644 index ed33233f..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/JsonEncodeTest.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\JsonEncode; -use Symfony\Component\Serializer\Encoder\JsonEncoder; - -class JsonEncodeTest extends TestCase -{ - private $encoder; - - protected function setUp() - { - $this->encode = new JsonEncode(); - } - - public function testSupportsEncoding() - { - $this->assertTrue($this->encode->supportsEncoding(JsonEncoder::FORMAT)); - $this->assertFalse($this->encode->supportsEncoding('foobar')); - } - - /** - * @dataProvider encodeProvider - */ - public function testEncode($toEncode, $expected, $context) - { - $this->assertEquals( - $expected, - $this->encode->encode($toEncode, JsonEncoder::FORMAT, $context) - ); - } - - public function encodeProvider() - { - return array( - array(array(), '[]', array()), - array(array(), '{}', array('json_encode_options' => JSON_FORCE_OBJECT)), - ); - } - - /** - * @requires function json_last_error_msg - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testEncodeWithError() - { - $this->encode->encode("\xB1\x31", JsonEncoder::FORMAT); - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/JsonEncoderTest.php b/vendor/symfony/serializer/Tests/Encoder/JsonEncoderTest.php deleted file mode 100644 index b08b6d5b..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/JsonEncoderTest.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\JsonEncoder; -use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Serializer\Normalizer\CustomNormalizer; - -class JsonEncoderTest extends TestCase -{ - private $encoder; - private $serializer; - - protected function setUp() - { - $this->encoder = new JsonEncoder(); - $this->serializer = new Serializer(array(new CustomNormalizer()), array('json' => new JsonEncoder())); - } - - public function testEncodeScalar() - { - $obj = new \stdClass(); - $obj->foo = 'foo'; - - $expected = '{"foo":"foo"}'; - - $this->assertEquals($expected, $this->encoder->encode($obj, 'json')); - } - - public function testComplexObject() - { - $obj = $this->getObject(); - - $expected = $this->getJsonSource(); - - $this->assertEquals($expected, $this->encoder->encode($obj, 'json')); - } - - public function testOptions() - { - $context = array('json_encode_options' => JSON_NUMERIC_CHECK); - - $arr = array(); - $arr['foo'] = '3'; - - $expected = '{"foo":3}'; - - $this->assertEquals($expected, $this->serializer->serialize($arr, 'json', $context)); - - $arr = array(); - $arr['foo'] = '3'; - - $expected = '{"foo":"3"}'; - - $this->assertEquals($expected, $this->serializer->serialize($arr, 'json'), 'Context should not be persistent'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testEncodeNotUtf8WithoutPartialOnError() - { - $arr = array( - 'utf8' => 'Hello World!', - 'notUtf8' => "\xb0\xd0\xb5\xd0", - ); - - $this->encoder->encode($arr, 'json'); - } - - public function testEncodeNotUtf8WithPartialOnError() - { - $context = array('json_encode_options' => JSON_PARTIAL_OUTPUT_ON_ERROR); - - $arr = array( - 'utf8' => 'Hello World!', - 'notUtf8' => "\xb0\xd0\xb5\xd0", - ); - - $result = $this->encoder->encode($arr, 'json', $context); - $jsonLastError = json_last_error(); - - $this->assertSame(JSON_ERROR_UTF8, $jsonLastError); - $this->assertEquals('{"utf8":"Hello World!","notUtf8":null}', $result); - - $this->assertEquals('0', $this->serializer->serialize(NAN, 'json', $context)); - } - - public function testDecodeFalseString() - { - $result = $this->encoder->decode('false', 'json'); - $this->assertSame(JSON_ERROR_NONE, json_last_error()); - $this->assertFalse($result); - } - - protected function getJsonSource() - { - return '{"foo":"foo","bar":["a","b"],"baz":{"key":"val","key2":"val","A B":"bar","item":[{"title":"title1"},{"title":"title2"}],"Barry":{"FooBar":{"Baz":"Ed","@id":1}}},"qux":"1"}'; - } - - protected function getObject() - { - $obj = new \stdClass(); - $obj->foo = 'foo'; - $obj->bar = array('a', 'b'); - $obj->baz = array('key' => 'val', 'key2' => 'val', 'A B' => 'bar', 'item' => array(array('title' => 'title1'), array('title' => 'title2')), 'Barry' => array('FooBar' => array('Baz' => 'Ed', '@id' => 1))); - $obj->qux = '1'; - - return $obj; - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/XmlEncoderTest.php b/vendor/symfony/serializer/Tests/Encoder/XmlEncoderTest.php deleted file mode 100644 index e8178ad0..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/XmlEncoderTest.php +++ /dev/null @@ -1,733 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Tests\Fixtures\Dummy; -use Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy; -use Symfony\Component\Serializer\Tests\Fixtures\ScalarDummy; -use Symfony\Component\Serializer\Encoder\XmlEncoder; -use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Serializer\Normalizer\CustomNormalizer; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; - -class XmlEncoderTest extends TestCase -{ - /** - * @var XmlEncoder - */ - private $encoder; - - private $exampleDateTimeString = '2017-02-19T15:16:08+0300'; - - protected function setUp() - { - $this->encoder = new XmlEncoder(); - $serializer = new Serializer(array(new CustomNormalizer()), array('xml' => new XmlEncoder())); - $this->encoder->setSerializer($serializer); - } - - public function testEncodeScalar() - { - $obj = new ScalarDummy(); - $obj->xmlFoo = 'foo'; - - $expected = ''."\n". - 'foo'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($obj, 'xml')); - } - - public function testSetRootNodeName() - { - $obj = new ScalarDummy(); - $obj->xmlFoo = 'foo'; - - $this->encoder->setRootNodeName('test'); - $expected = ''."\n". - 'foo'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($obj, 'xml')); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage Document types are not allowed. - */ - public function testDocTypeIsNotAllowed() - { - $this->encoder->decode('', 'foo'); - } - - public function testAttributes() - { - $obj = new ScalarDummy(); - $obj->xmlFoo = array( - 'foo-bar' => array( - '@id' => 1, - '@name' => 'Bar', - ), - 'Foo' => array( - 'Bar' => 'Test', - '@Type' => 'test', - ), - 'föo_bär' => 'a', - 'Bar' => array(1, 2, 3), - 'a' => 'b', - ); - $expected = ''."\n". - ''. - ''. - 'Test'. - 'a'. - '1'. - '2'. - '3'. - 'b'. - ''."\n"; - $this->assertEquals($expected, $this->encoder->encode($obj, 'xml')); - } - - public function testElementNameValid() - { - $obj = new ScalarDummy(); - $obj->xmlFoo = array( - 'foo-bar' => 'a', - 'foo_bar' => 'a', - 'föo_bär' => 'a', - ); - - $expected = ''."\n". - ''. - 'a'. - 'a'. - 'a'. - ''."\n"; - - $this->assertEquals($expected, $this->encoder->encode($obj, 'xml')); - } - - public function testEncodeSimpleXML() - { - $xml = simplexml_load_string('Peter'); - $array = array('person' => $xml); - - $expected = ''."\n". - 'Peter'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($array, 'xml')); - } - - public function testEncodeXmlAttributes() - { - $xml = simplexml_load_string('Peter'); - $array = array('person' => $xml); - - $expected = ''."\n". - 'Peter'."\n"; - - $context = array( - 'xml_version' => '1.1', - 'xml_encoding' => 'utf-8', - 'xml_standalone' => true, - ); - - $this->assertSame($expected, $this->encoder->encode($array, 'xml', $context)); - } - - public function testEncodeRemovingEmptyTags() - { - $array = array('person' => array('firstname' => 'Peter', 'lastname' => null)); - - $expected = ''."\n". - 'Peter'."\n"; - - $context = array('remove_empty_tags' => true); - - $this->assertSame($expected, $this->encoder->encode($array, 'xml', $context)); - } - - public function testEncodeNotRemovingEmptyTags() - { - $array = array('person' => array('firstname' => 'Peter', 'lastname' => null)); - - $expected = ''."\n". - 'Peter'."\n"; - - $this->assertSame($expected, $this->encoder->encode($array, 'xml')); - } - - public function testContext() - { - $array = array('person' => array('name' => 'George Abitbol')); - $expected = <<<'XML' - - - - George Abitbol - - - -XML; - - $context = array( - 'xml_format_output' => true, - ); - - $this->assertSame($expected, $this->encoder->encode($array, 'xml', $context)); - } - - public function testEncodeScalarRootAttributes() - { - $array = array( - '#' => 'Paul', - '@gender' => 'm', - ); - - $expected = ''."\n". - 'Paul'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($array, 'xml')); - } - - public function testEncodeRootAttributes() - { - $array = array( - 'firstname' => 'Paul', - '@gender' => 'm', - ); - - $expected = ''."\n". - 'Paul'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($array, 'xml')); - } - - public function testEncodeCdataWrapping() - { - $array = array( - 'firstname' => 'Paul ', - ); - - $expected = ''."\n". - ']]>'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($array, 'xml')); - } - - public function testEncodeScalarWithAttribute() - { - $array = array( - 'person' => array('@gender' => 'M', '#' => 'Peter'), - ); - - $expected = ''."\n". - 'Peter'."\n"; - - $this->assertEquals($expected, $this->encoder->encode($array, 'xml')); - } - - public function testDecodeScalar() - { - $source = ''."\n". - 'foo'."\n"; - - $this->assertEquals('foo', $this->encoder->decode($source, 'xml')); - } - - public function testDecodeBigDigitAttributes() - { - $source = << -Name -XML; - - $this->assertSame(array('@index' => 182077241760011681341821060401202210011000045913000000017100, '#' => 'Name'), $this->encoder->decode($source, 'xml')); - } - - public function testDecodeNegativeIntAttribute() - { - $source = << -Name -XML; - - $this->assertSame(array('@index' => -1234, '#' => 'Name'), $this->encoder->decode($source, 'xml')); - } - - public function testDecodeFloatAttribute() - { - $source = << -Name -XML; - - $this->assertSame(array('@index' => -12.11, '#' => 'Name'), $this->encoder->decode($source, 'xml')); - } - - public function testDecodeNegativeFloatAttribute() - { - $source = << -Name -XML; - - $this->assertSame(array('@index' => -12.11, '#' => 'Name'), $this->encoder->decode($source, 'xml')); - } - - public function testNoTypeCastAttribute() - { - $source = << - - - -XML; - - $data = $this->encoder->decode($source, 'xml', array('xml_type_cast_attributes' => false)); - $expected = array( - '@a' => '018', - '@b' => '-12.11', - 'node' => array( - '@a' => '018', - '@b' => '-12.11', - '#' => '', - ), - ); - $this->assertSame($expected, $data); - } - - public function testEncode() - { - $source = $this->getXmlSource(); - $obj = $this->getObject(); - - $this->assertEquals($source, $this->encoder->encode($obj, 'xml')); - } - - public function testEncodeWithNamespace() - { - $source = $this->getNamespacedXmlSource(); - $array = $this->getNamespacedArray(); - - $this->assertEquals($source, $this->encoder->encode($array, 'xml')); - } - - public function testEncodeSerializerXmlRootNodeNameOption() - { - $options = array('xml_root_node_name' => 'test'); - $this->encoder = new XmlEncoder(); - $serializer = new Serializer(array(), array('xml' => new XmlEncoder())); - $this->encoder->setSerializer($serializer); - - $array = array( - 'person' => array('@gender' => 'M', '#' => 'Peter'), - ); - - $expected = ''."\n". - 'Peter'."\n"; - - $this->assertEquals($expected, $serializer->serialize($array, 'xml', $options)); - } - - public function testEncodeTraversableWhenNormalizable() - { - $this->encoder = new XmlEncoder(); - $serializer = new Serializer(array(new CustomNormalizer()), array('xml' => new XmlEncoder())); - $this->encoder->setSerializer($serializer); - - $expected = <<<'XML' - -normalizedFoonormalizedBar - -XML; - - $this->assertEquals($expected, $serializer->serialize(new NormalizableTraversableDummy(), 'xml')); - } - - public function testDecode() - { - $source = $this->getXmlSource(); - $obj = $this->getObject(); - - $this->assertEquals(get_object_vars($obj), $this->encoder->decode($source, 'xml')); - } - - public function testDecodeCdataWrapping() - { - $expected = array( - 'firstname' => 'Paul ', - ); - - $xml = ''."\n". - ']]>'."\n"; - - $this->assertEquals($expected, $this->encoder->decode($xml, 'xml')); - } - - public function testDecodeCdataWrappingAndWhitespace() - { - $expected = array( - 'firstname' => 'Paul ', - ); - - $xml = ''."\n". - ''."\n". - ']]>'."\n"; - - $this->assertEquals($expected, $this->encoder->decode($xml, 'xml')); - } - - public function testDecodeWithNamespace() - { - $source = $this->getNamespacedXmlSource(); - $array = $this->getNamespacedArray(); - - $this->assertEquals($array, $this->encoder->decode($source, 'xml')); - } - - public function testDecodeScalarWithAttribute() - { - $source = ''."\n". - 'Peter'."\n"; - - $expected = array( - 'person' => array('@gender' => 'M', '#' => 'Peter'), - ); - - $this->assertEquals($expected, $this->encoder->decode($source, 'xml')); - } - - public function testDecodeScalarRootAttributes() - { - $source = ''."\n". - 'Peter'."\n"; - - $expected = array( - '#' => 'Peter', - '@gender' => 'M', - ); - - $this->assertEquals($expected, $this->encoder->decode($source, 'xml')); - } - - public function testDecodeRootAttributes() - { - $source = ''."\n". - 'PeterMac Calloway'."\n"; - - $expected = array( - 'firstname' => 'Peter', - 'lastname' => 'Mac Calloway', - '@gender' => 'M', - ); - - $this->assertEquals($expected, $this->encoder->decode($source, 'xml')); - } - - public function testDecodeArray() - { - $source = ''."\n". - ''. - ''. - 'BenjaminAlexandre'. - 'DamienClay'. - ''. - ''."\n"; - - $expected = array( - 'people' => array('person' => array( - array('firstname' => 'Benjamin', 'lastname' => 'Alexandre'), - array('firstname' => 'Damien', 'lastname' => 'Clay'), - )), - ); - - $this->assertEquals($expected, $this->encoder->decode($source, 'xml')); - } - - public function testDecodeXMLWithProcessInstruction() - { - $source = <<<'XML' - - - - - - foo - - a - b - - val - val - bar - - title1 - - - - title2 - - - - Ed - - - - 1 - - ?> -XML; - $obj = $this->getObject(); - - $this->assertEquals(get_object_vars($obj), $this->encoder->decode($source, 'xml')); - } - - public function testDecodeIgnoreWhiteSpace() - { - $source = <<<'XML' - - - - Benjamin - Alexandre - - - Damien - Clay - - -XML; - $expected = array('person' => array( - array('firstname' => 'Benjamin', 'lastname' => 'Alexandre'), - array('firstname' => 'Damien', 'lastname' => 'Clay'), - )); - - $this->assertEquals($expected, $this->encoder->decode($source, 'xml')); - } - - public function testDecodeWithoutItemHash() - { - $obj = new ScalarDummy(); - $obj->xmlFoo = array( - 'foo-bar' => array( - '@key' => 'value', - 'item' => array('@key' => 'key', 'key-val' => 'val'), - ), - 'Foo' => array( - 'Bar' => 'Test', - '@Type' => 'test', - ), - 'föo_bär' => 'a', - 'Bar' => array(1, 2, 3), - 'a' => 'b', - ); - $expected = array( - 'foo-bar' => array( - '@key' => 'value', - 'key' => array('@key' => 'key', 'key-val' => 'val'), - ), - 'Foo' => array( - 'Bar' => 'Test', - '@Type' => 'test', - ), - 'föo_bär' => 'a', - 'Bar' => array(1, 2, 3), - 'a' => 'b', - ); - $xml = $this->encoder->encode($obj, 'xml'); - $this->assertEquals($expected, $this->encoder->decode($xml, 'xml')); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDecodeInvalidXml() - { - $this->encoder->decode('', 'xml'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testPreventsComplexExternalEntities() - { - $this->encoder->decode(']>&test;', 'xml'); - } - - public function testDecodeEmptyXml() - { - if (method_exists($this, 'expectException')) { - $this->expectException('Symfony\Component\Serializer\Exception\UnexpectedValueException'); - $this->expectExceptionMessage('Invalid XML data, it can not be empty.'); - } else { - $this->setExpectedException('Symfony\Component\Serializer\Exception\UnexpectedValueException', 'Invalid XML data, it can not be empty.'); - } - $this->encoder->decode(' ', 'xml'); - } - - protected function getXmlSource() - { - return ''."\n". - ''. - 'foo'. - 'ab'. - 'valvalbar'. - 'title1title2'. - 'Ed'. - '1'. - ''."\n"; - } - - protected function getNamespacedXmlSource() - { - return ''."\n". - ''. - '1'. - 'foo'. - 'ab'. - 'valvalbar'. - 'title1title2'. - 'Ed'. - ''."\n"; - } - - protected function getNamespacedArray() - { - return array( - '@xmlns' => 'http://www.w3.org/2005/Atom', - '@xmlns:app' => 'http://www.w3.org/2007/app', - '@xmlns:media' => 'http://search.yahoo.com/mrss/', - '@xmlns:gd' => 'http://schemas.google.com/g/2005', - '@xmlns:yt' => 'http://gdata.youtube.com/schemas/2007', - 'qux' => '1', - 'app:foo' => 'foo', - 'yt:bar' => array('a', 'b'), - 'media:baz' => array( - 'media:key' => 'val', - 'media:key2' => 'val', - 'A B' => 'bar', - 'item' => array( - array( - 'title' => 'title1', - ), - array( - 'title' => 'title2', - ), - ), - 'Barry' => array( - '@size' => 'large', - 'FooBar' => array( - 'Baz' => 'Ed', - '@gd:id' => 1, - ), - ), - ), - ); - } - - protected function getObject() - { - $obj = new Dummy(); - $obj->foo = 'foo'; - $obj->bar = array('a', 'b'); - $obj->baz = array('key' => 'val', 'key2' => 'val', 'A B' => 'bar', 'item' => array(array('title' => 'title1'), array('title' => 'title2')), 'Barry' => array('FooBar' => array('Baz' => 'Ed', '@id' => 1))); - $obj->qux = '1'; - - return $obj; - } - - public function testEncodeXmlWithBoolValue() - { - $expectedXml = <<<'XML' - -10 - -XML; - - $actualXml = $this->encoder->encode(array('foo' => true, 'bar' => false), 'xml'); - - $this->assertEquals($expectedXml, $actualXml); - } - - public function testEncodeXmlWithDateTimeObjectValue() - { - $xmlEncoder = $this->createXmlEncoderWithDateTimeNormalizer(); - - $actualXml = $xmlEncoder->encode(array('dateTime' => new \DateTime($this->exampleDateTimeString)), 'xml'); - - $this->assertEquals($this->createXmlWithDateTime(), $actualXml); - } - - public function testEncodeXmlWithDateTimeObjectField() - { - $xmlEncoder = $this->createXmlEncoderWithDateTimeNormalizer(); - - $actualXml = $xmlEncoder->encode(array('foo' => array('@dateTime' => new \DateTime($this->exampleDateTimeString))), 'xml'); - - $this->assertEquals($this->createXmlWithDateTimeField(), $actualXml); - } - - /** - * @return XmlEncoder - */ - private function createXmlEncoderWithDateTimeNormalizer() - { - $encoder = new XmlEncoder(); - $serializer = new Serializer(array($this->createMockDateTimeNormalizer()), array('xml' => new XmlEncoder())); - $encoder->setSerializer($serializer); - - return $encoder; - } - - /** - * @return \PHPUnit_Framework_MockObject_MockObject|NormalizerInterface - */ - private function createMockDateTimeNormalizer() - { - $mock = $this->getMockBuilder('\Symfony\Component\Serializer\Normalizer\CustomNormalizer')->getMock(); - - $mock - ->expects($this->once()) - ->method('normalize') - ->with(new \DateTime($this->exampleDateTimeString), 'xml', array()) - ->willReturn($this->exampleDateTimeString); - - $mock - ->expects($this->once()) - ->method('supportsNormalization') - ->with(new \DateTime($this->exampleDateTimeString), 'xml') - ->willReturn(true); - - return $mock; - } - - /** - * @return string - */ - private function createXmlWithDateTime() - { - return sprintf(' -%s -', $this->exampleDateTimeString); - } - - /** - * @return string - */ - private function createXmlWithDateTimeField() - { - return sprintf(' - -', $this->exampleDateTimeString); - } -} diff --git a/vendor/symfony/serializer/Tests/Encoder/YamlEncoderTest.php b/vendor/symfony/serializer/Tests/Encoder/YamlEncoderTest.php deleted file mode 100644 index d08272df..00000000 --- a/vendor/symfony/serializer/Tests/Encoder/YamlEncoderTest.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Encoder; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Encoder\YamlEncoder; -use Symfony\Component\Yaml\Dumper; -use Symfony\Component\Yaml\Parser; -use Symfony\Component\Yaml\Yaml; - -/** - * @author Kévin Dunglas - */ -class YamlEncoderTest extends TestCase -{ - public function testEncode() - { - $encoder = new YamlEncoder(); - - $this->assertEquals('foo', $encoder->encode('foo', 'yaml')); - $this->assertEquals('{ foo: 1 }', $encoder->encode(array('foo' => 1), 'yaml')); - } - - public function testSupportsEncoding() - { - $encoder = new YamlEncoder(); - - $this->assertTrue($encoder->supportsEncoding('yaml')); - $this->assertFalse($encoder->supportsEncoding('json')); - } - - public function testDecode() - { - $encoder = new YamlEncoder(); - - $this->assertEquals('foo', $encoder->decode('foo', 'yaml')); - $this->assertEquals(array('foo' => 1), $encoder->decode('{ foo: 1 }', 'yaml')); - } - - public function testSupportsDecoding() - { - $encoder = new YamlEncoder(); - - $this->assertTrue($encoder->supportsDecoding('yaml')); - $this->assertFalse($encoder->supportsDecoding('json')); - } - - public function testContext() - { - $encoder = new YamlEncoder(new Dumper(), new Parser(), array('yaml_inline' => 1, 'yaml_indent' => 4, 'yaml_flags' => Yaml::DUMP_OBJECT | Yaml::PARSE_OBJECT)); - - $obj = new \stdClass(); - $obj->bar = 2; - - $legacyTag = " foo: !php/object:O:8:\"stdClass\":1:{s:3:\"bar\";i:2;}\n"; - $spacedTag = " foo: !php/object 'O:8:\"stdClass\":1:{s:3:\"bar\";i:2;}'\n"; - $this->assertThat($encoder->encode(array('foo' => $obj), 'yaml'), $this->logicalOr($this->equalTo($legacyTag), $this->equalTo($spacedTag))); - $this->assertEquals(' { foo: null }', $encoder->encode(array('foo' => $obj), 'yaml', array('yaml_inline' => 0, 'yaml_indent' => 2, 'yaml_flags' => 0))); - $this->assertEquals(array('foo' => $obj), $encoder->decode("foo: !php/object 'O:8:\"stdClass\":1:{s:3:\"bar\";i:2;}'", 'yaml')); - $this->assertEquals(array('foo' => null), $encoder->decode("foo: !php/object 'O:8:\"stdClass\":1:{s:3:\"bar\";i:2;}'", 'yaml', array('yaml_flags' => 0))); - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/AbstractNormalizerDummy.php b/vendor/symfony/serializer/Tests/Fixtures/AbstractNormalizerDummy.php deleted file mode 100644 index 27b2f24f..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/AbstractNormalizerDummy.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; - -/** - * Provides a dummy Normalizer which extends the AbstractNormalizer. - * - * @author Konstantin S. M. Möllers - */ -class AbstractNormalizerDummy extends AbstractNormalizer -{ - /** - * {@inheritdoc} - */ - public function getAllowedAttributes($classOrObject, array $context, $attributesAsString = false) - { - return parent::getAllowedAttributes($classOrObject, $context, $attributesAsString); - } - - /** - * {@inheritdoc} - */ - public function normalize($object, $format = null, array $context = array()) - { - } - - /** - * {@inheritdoc} - */ - public function supportsNormalization($data, $format = null) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function denormalize($data, $class, $format = null, array $context = array()) - { - } - - /** - * {@inheritdoc} - */ - public function supportsDenormalization($data, $type, $format = null) - { - return true; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/CircularReferenceDummy.php b/vendor/symfony/serializer/Tests/Fixtures/CircularReferenceDummy.php deleted file mode 100644 index cc07015c..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/CircularReferenceDummy.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -/** - * @author Kévin Dunglas - */ -class CircularReferenceDummy -{ - public function getMe() - { - return $this; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/DenormalizableDummy.php b/vendor/symfony/serializer/Tests/Fixtures/DenormalizableDummy.php deleted file mode 100644 index d78f34a3..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/DenormalizableDummy.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Normalizer\DenormalizableInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; - -class DenormalizableDummy implements DenormalizableInterface -{ - public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()) - { - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/Dummy.php b/vendor/symfony/serializer/Tests/Fixtures/Dummy.php deleted file mode 100644 index 6b33e843..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/Dummy.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Normalizer\NormalizableInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizableInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; - -class Dummy implements NormalizableInterface, DenormalizableInterface -{ - public $foo; - public $bar; - public $baz; - public $qux; - - public function normalize(NormalizerInterface $normalizer, $format = null, array $context = array()) - { - return array( - 'foo' => $this->foo, - 'bar' => $this->bar, - 'baz' => $this->baz, - 'qux' => $this->qux, - ); - } - - public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()) - { - $this->foo = $data['foo']; - $this->bar = $data['bar']; - $this->baz = $data['baz']; - $this->qux = $data['qux']; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/GroupDummy.php b/vendor/symfony/serializer/Tests/Fixtures/GroupDummy.php deleted file mode 100644 index 37bfa7eb..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/GroupDummy.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Annotation\Groups; - -/** - * @author Kévin Dunglas - */ -class GroupDummy extends GroupDummyParent implements GroupDummyInterface -{ - /** - * @Groups({"a"}) - */ - private $foo; - /** - * @Groups({"b", "c", "name_converter"}) - */ - protected $bar; - private $fooBar; - private $symfony; - - /** - * @Groups({"b"}) - */ - public function setBar($bar) - { - $this->bar = $bar; - } - - /** - * @Groups({"c"}) - */ - public function getBar() - { - return $this->bar; - } - - public function setFoo($foo) - { - $this->foo = $foo; - } - - public function getFoo() - { - return $this->foo; - } - - public function setFooBar($fooBar) - { - $this->fooBar = $fooBar; - } - - /** - * @Groups({"a", "b", "name_converter"}) - */ - public function isFooBar() - { - return $this->fooBar; - } - - public function setSymfony($symfony) - { - $this->symfony = $symfony; - } - - public function getSymfony() - { - return $this->symfony; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/GroupDummyChild.php b/vendor/symfony/serializer/Tests/Fixtures/GroupDummyChild.php deleted file mode 100644 index fa72160e..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/GroupDummyChild.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -class GroupDummyChild extends GroupDummy -{ - private $baz; - - /** - * @return mixed - */ - public function getBaz() - { - return $this->baz; - } - - /** - * @param mixed $baz - */ - public function setBaz($baz) - { - $this->baz = $baz; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/GroupDummyInterface.php b/vendor/symfony/serializer/Tests/Fixtures/GroupDummyInterface.php deleted file mode 100644 index a60629e6..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/GroupDummyInterface.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Annotation\Groups; - -/** - * @author Kévin Dunglas - */ -interface GroupDummyInterface -{ - /** - * @Groups({"a", "name_converter"}) - */ - public function getSymfony(); -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/GroupDummyParent.php b/vendor/symfony/serializer/Tests/Fixtures/GroupDummyParent.php deleted file mode 100644 index dd242339..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/GroupDummyParent.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Annotation\Groups; - -/** - * @author Kévin Dunglas - */ -class GroupDummyParent -{ - /** - * @Groups({"a"}) - */ - private $kevin; - private $coopTilleuls; - - public function setKevin($kevin) - { - $this->kevin = $kevin; - } - - public function getKevin() - { - return $this->kevin; - } - - public function setCoopTilleuls($coopTilleuls) - { - $this->coopTilleuls = $coopTilleuls; - } - - /** - * @Groups({"a", "b"}) - */ - public function getCoopTilleuls() - { - return $this->coopTilleuls; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/JsonSerializableDummy.php b/vendor/symfony/serializer/Tests/Fixtures/JsonSerializableDummy.php deleted file mode 100644 index 6d89890b..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/JsonSerializableDummy.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -class JsonSerializableDummy implements \JsonSerializable -{ - public function jsonSerialize() - { - return array( - 'foo' => 'a', - 'bar' => 'b', - 'baz' => 'c', - 'qux' => $this, - ); - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/MaxDepthDummy.php b/vendor/symfony/serializer/Tests/Fixtures/MaxDepthDummy.php deleted file mode 100644 index aef6dda2..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/MaxDepthDummy.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Annotation\MaxDepth; - -/** - * @author Kévin Dunglas - */ -class MaxDepthDummy -{ - /** - * @MaxDepth(2) - */ - public $foo; - - public $bar; - - /** - * @var self - */ - public $child; - - /** - * @MaxDepth(3) - */ - public function getBar() - { - return $this->bar; - } - - public function getChild() - { - return $this->child; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/NormalizableTraversableDummy.php b/vendor/symfony/serializer/Tests/Fixtures/NormalizableTraversableDummy.php deleted file mode 100644 index 3ac2fe36..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/NormalizableTraversableDummy.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Normalizer\NormalizableInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizableInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; - -class NormalizableTraversableDummy extends TraversableDummy implements NormalizableInterface, DenormalizableInterface -{ - public function normalize(NormalizerInterface $normalizer, $format = null, array $context = array()) - { - return array( - 'foo' => 'normalizedFoo', - 'bar' => 'normalizedBar', - ); - } - - public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()) - { - return array( - 'foo' => 'denormalizedFoo', - 'bar' => 'denormalizedBar', - ); - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/PropertyCircularReferenceDummy.php b/vendor/symfony/serializer/Tests/Fixtures/PropertyCircularReferenceDummy.php deleted file mode 100644 index 8a1d9d8c..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/PropertyCircularReferenceDummy.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -/** - * @author Kévin Dunglas - */ -class PropertyCircularReferenceDummy -{ - public $me; - - public function __construct() - { - $this->me = $this; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/PropertySiblingHolder.php b/vendor/symfony/serializer/Tests/Fixtures/PropertySiblingHolder.php deleted file mode 100644 index af993e69..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/PropertySiblingHolder.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -/** - * @author Kévin Dunglas - */ -class PropertySiblingHolder -{ - public $sibling0; - public $sibling1; - public $sibling2; - - public function __construct() - { - $sibling = new PropertySibling(); - - $this->sibling0 = $sibling; - $this->sibling1 = $sibling; - $this->sibling2 = $sibling; - } -} - -/** - * @author Kévin Dunglas - */ -class PropertySibling -{ - public $coopTilleuls = 'Les-Tilleuls.coop'; -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/ScalarDummy.php b/vendor/symfony/serializer/Tests/Fixtures/ScalarDummy.php deleted file mode 100644 index 598e76fd..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/ScalarDummy.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Normalizer\NormalizableInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizableInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; - -class ScalarDummy implements NormalizableInterface, DenormalizableInterface -{ - public $foo; - public $xmlFoo; - - public function normalize(NormalizerInterface $normalizer, $format = null, array $context = array()) - { - return 'xml' === $format ? $this->xmlFoo : $this->foo; - } - - public function denormalize(DenormalizerInterface $denormalizer, $data, $format = null, array $context = array()) - { - if ('xml' === $format) { - $this->xmlFoo = $data; - } else { - $this->foo = $data; - } - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/SiblingHolder.php b/vendor/symfony/serializer/Tests/Fixtures/SiblingHolder.php deleted file mode 100644 index acd4fe94..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/SiblingHolder.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -/** - * @author Kévin Dunglas - */ -class SiblingHolder -{ - private $sibling0; - private $sibling1; - private $sibling2; - - public function __construct() - { - $sibling = new Sibling(); - - $this->sibling0 = $sibling; - $this->sibling1 = $sibling; - $this->sibling2 = $sibling; - } - - public function getSibling0() - { - return $this->sibling0; - } - - public function getSibling1() - { - return $this->sibling1; - } - - public function getSibling2() - { - return $this->sibling2; - } -} - -/** - * @author Kévin Dunglas - */ -class Sibling -{ - public function getCoopTilleuls() - { - return 'Les-Tilleuls.coop'; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/StaticConstructorDummy.php b/vendor/symfony/serializer/Tests/Fixtures/StaticConstructorDummy.php deleted file mode 100644 index 78d39ce9..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/StaticConstructorDummy.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -class StaticConstructorDummy -{ - public $foo; - public $bar; - public $quz; - - public static function create($foo) - { - $dummy = new self(); - $dummy->quz = $foo; - - return $dummy; - } - - private function __construct() - { - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/StaticConstructorNormalizer.php b/vendor/symfony/serializer/Tests/Fixtures/StaticConstructorNormalizer.php deleted file mode 100644 index 67304831..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/StaticConstructorNormalizer.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; - -/** - * @author Guilhem N. - */ -class StaticConstructorNormalizer extends ObjectNormalizer -{ - /** - * {@inheritdoc} - */ - protected function getConstructor(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes) - { - if (is_a($class, StaticConstructorDummy::class, true)) { - return new \ReflectionMethod($class, 'create'); - } - - return parent::getConstructor($data, $class, $context, $reflectionClass, $allowedAttributes); - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/ToBeProxyfiedDummy.php b/vendor/symfony/serializer/Tests/Fixtures/ToBeProxyfiedDummy.php deleted file mode 100644 index 0279493b..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/ToBeProxyfiedDummy.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -/** - * @author Kévin Dunglas - */ -class ToBeProxyfiedDummy -{ - private $foo; - - public function setFoo($foo) - { - $this->foo = $foo; - } - - public function getFoo() - { - return $this->foo; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/TraversableDummy.php b/vendor/symfony/serializer/Tests/Fixtures/TraversableDummy.php deleted file mode 100644 index bcf46e51..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/TraversableDummy.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -class TraversableDummy implements \IteratorAggregate -{ - public $foo = 'foo'; - public $bar = 'bar'; - - public function getIterator() - { - return new \ArrayIterator(get_object_vars($this)); - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/VariadicConstructorArgsDummy.php b/vendor/symfony/serializer/Tests/Fixtures/VariadicConstructorArgsDummy.php deleted file mode 100644 index c04aeba0..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/VariadicConstructorArgsDummy.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Fixtures; - -class VariadicConstructorArgsDummy -{ - private $foo; - - public function __construct(...$foo) - { - $this->foo = $foo; - } - - public function getFoo() - { - return $this->foo; - } -} diff --git a/vendor/symfony/serializer/Tests/Fixtures/empty-mapping.yml b/vendor/symfony/serializer/Tests/Fixtures/empty-mapping.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/vendor/symfony/serializer/Tests/Fixtures/invalid-mapping.yml b/vendor/symfony/serializer/Tests/Fixtures/invalid-mapping.yml deleted file mode 100644 index 19102815..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/invalid-mapping.yml +++ /dev/null @@ -1 +0,0 @@ -foo \ No newline at end of file diff --git a/vendor/symfony/serializer/Tests/Fixtures/serialization.xml b/vendor/symfony/serializer/Tests/Fixtures/serialization.xml deleted file mode 100644 index 9ba51cbf..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/serialization.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - group1 - group2 - - - - group2 - - - - - - - - - diff --git a/vendor/symfony/serializer/Tests/Fixtures/serialization.yml b/vendor/symfony/serializer/Tests/Fixtures/serialization.yml deleted file mode 100644 index c4038704..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/serialization.yml +++ /dev/null @@ -1,12 +0,0 @@ -'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy': - attributes: - foo: - groups: ['group1', 'group2'] - bar: - groups: ['group2'] -'Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy': - attributes: - foo: - max_depth: 2 - bar: - max_depth: 3 diff --git a/vendor/symfony/serializer/Tests/Fixtures/test.gif b/vendor/symfony/serializer/Tests/Fixtures/test.gif deleted file mode 100644 index b636f4b8df536b0a85e7cea1a6cf3f0bd3179b96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 jcmZ?wbh9u|WMp7uXkcLY4+c66KmZb9U}AD%WUvMRyAlZ1 diff --git a/vendor/symfony/serializer/Tests/Fixtures/test.txt b/vendor/symfony/serializer/Tests/Fixtures/test.txt deleted file mode 100644 index a0b5e663..00000000 --- a/vendor/symfony/serializer/Tests/Fixtures/test.txt +++ /dev/null @@ -1 +0,0 @@ -Kévin Dunglas diff --git a/vendor/symfony/serializer/Tests/Mapping/AttributeMetadataTest.php b/vendor/symfony/serializer/Tests/Mapping/AttributeMetadataTest.php deleted file mode 100644 index 16ebcb1a..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/AttributeMetadataTest.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\AttributeMetadata; - -/** - * @author Kévin Dunglas - */ -class AttributeMetadataTest extends TestCase -{ - public function testInterface() - { - $attributeMetadata = new AttributeMetadata('name'); - $this->assertInstanceOf('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface', $attributeMetadata); - } - - public function testGetName() - { - $attributeMetadata = new AttributeMetadata('name'); - $this->assertEquals('name', $attributeMetadata->getName()); - } - - public function testGroups() - { - $attributeMetadata = new AttributeMetadata('group'); - $attributeMetadata->addGroup('a'); - $attributeMetadata->addGroup('a'); - $attributeMetadata->addGroup('b'); - - $this->assertEquals(array('a', 'b'), $attributeMetadata->getGroups()); - } - - public function testMaxDepth() - { - $attributeMetadata = new AttributeMetadata('name'); - $attributeMetadata->setMaxDepth(69); - - $this->assertEquals(69, $attributeMetadata->getMaxDepth()); - } - - public function testMerge() - { - $attributeMetadata1 = new AttributeMetadata('a1'); - $attributeMetadata1->addGroup('a'); - $attributeMetadata1->addGroup('b'); - - $attributeMetadata2 = new AttributeMetadata('a2'); - $attributeMetadata2->addGroup('a'); - $attributeMetadata2->addGroup('c'); - $attributeMetadata2->setMaxDepth(2); - - $attributeMetadata1->merge($attributeMetadata2); - - $this->assertEquals(array('a', 'b', 'c'), $attributeMetadata1->getGroups()); - $this->assertEquals(2, $attributeMetadata1->getMaxDepth()); - } - - public function testSerialize() - { - $attributeMetadata = new AttributeMetadata('attribute'); - $attributeMetadata->addGroup('a'); - $attributeMetadata->addGroup('b'); - $attributeMetadata->setMaxDepth(3); - - $serialized = serialize($attributeMetadata); - $this->assertEquals($attributeMetadata, unserialize($serialized)); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/ClassMetadataTest.php b/vendor/symfony/serializer/Tests/Mapping/ClassMetadataTest.php deleted file mode 100644 index f2db1c51..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/ClassMetadataTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\ClassMetadata; - -/** - * @author Kévin Dunglas - */ -class ClassMetadataTest extends TestCase -{ - public function testInterface() - { - $classMetadata = new ClassMetadata('name'); - $this->assertInstanceOf('Symfony\Component\Serializer\Mapping\ClassMetadataInterface', $classMetadata); - } - - public function testAttributeMetadata() - { - $classMetadata = new ClassMetadata('c'); - - $a1 = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface')->getMock(); - $a1->method('getName')->willReturn('a1'); - - $a2 = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface')->getMock(); - $a2->method('getName')->willReturn('a2'); - - $classMetadata->addAttributeMetadata($a1); - $classMetadata->addAttributeMetadata($a2); - - $this->assertEquals(array('a1' => $a1, 'a2' => $a2), $classMetadata->getAttributesMetadata()); - } - - public function testMerge() - { - $classMetadata1 = new ClassMetadata('c1'); - $classMetadata2 = new ClassMetadata('c2'); - - $ac1 = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface')->getMock(); - $ac1->method('getName')->willReturn('a1'); - $ac1->method('getGroups')->willReturn(array('a', 'b')); - - $ac2 = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface')->getMock(); - $ac2->method('getName')->willReturn('a1'); - $ac2->method('getGroups')->willReturn(array('b', 'c')); - - $classMetadata1->addAttributeMetadata($ac1); - $classMetadata2->addAttributeMetadata($ac2); - - $classMetadata1->merge($classMetadata2); - - $ac1->method('getGroups')->willReturn('a', 'b', 'c'); - - $this->assertEquals(array('a1' => $ac1), $classMetadata2->getAttributesMetadata()); - } - - public function testSerialize() - { - $classMetadata = new ClassMetadata('a'); - - $a1 = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface')->getMock(); - $a1->method('getName')->willReturn('b1'); - - $a2 = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\AttributeMetadataInterface')->getMock(); - $a2->method('getName')->willReturn('b2'); - - $classMetadata->addAttributeMetadata($a1); - $classMetadata->addAttributeMetadata($a2); - - $serialized = serialize($classMetadata); - $this->assertEquals($classMetadata, unserialize($serialized)); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php b/vendor/symfony/serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php deleted file mode 100644 index dc392581..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping\Factory; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Cache\Adapter\ArrayAdapter; -use Symfony\Component\Serializer\Mapping\ClassMetadata; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface; -use Symfony\Component\Serializer\Mapping\Factory\CacheClassMetadataFactory; -use Symfony\Component\Serializer\Tests\Fixtures\Dummy; - -/** - * @author Kévin Dunglas - */ -class CacheMetadataFactoryTest extends TestCase -{ - public function testGetMetadataFor() - { - $metadata = new ClassMetadata(Dummy::class); - - $decorated = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock(); - $decorated - ->expects($this->once()) - ->method('getMetadataFor') - ->will($this->returnValue($metadata)) - ; - - $factory = new CacheClassMetadataFactory($decorated, new ArrayAdapter()); - - $this->assertEquals($metadata, $factory->getMetadataFor(Dummy::class)); - // The second call should retrieve the value from the cache - $this->assertEquals($metadata, $factory->getMetadataFor(Dummy::class)); - } - - public function testHasMetadataFor() - { - $decorated = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock(); - $decorated - ->expects($this->once()) - ->method('hasMetadataFor') - ->will($this->returnValue(true)) - ; - - $factory = new CacheClassMetadataFactory($decorated, new ArrayAdapter()); - - $this->assertTrue($factory->hasMetadataFor(Dummy::class)); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - */ - public function testInvalidClassThrowsException() - { - $decorated = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock(); - $factory = new CacheClassMetadataFactory($decorated, new ArrayAdapter()); - - $factory->getMetadataFor('Not\Exist'); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/Factory/ClassMetadataFactoryTest.php b/vendor/symfony/serializer/Tests/Mapping/Factory/ClassMetadataFactoryTest.php deleted file mode 100644 index 903cc04d..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/Factory/ClassMetadataFactoryTest.php +++ /dev/null @@ -1,79 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping\Factory; - -use Doctrine\Common\Annotations\AnnotationReader; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; -use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; -use Symfony\Component\Serializer\Mapping\Loader\LoaderChain; -use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory; - -/** - * @author Kévin Dunglas - */ -class ClassMetadataFactoryTest extends TestCase -{ - public function testInterface() - { - $classMetadata = new ClassMetadataFactory(new LoaderChain(array())); - $this->assertInstanceOf('Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface', $classMetadata); - } - - public function testGetMetadataFor() - { - $factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $classMetadata = $factory->getMetadataFor('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - - $this->assertEquals(TestClassMetadataFactory::createClassMetadata(true, true), $classMetadata); - } - - public function testHasMetadataFor() - { - $factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->assertTrue($factory->hasMetadataFor('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy')); - $this->assertTrue($factory->hasMetadataFor('Symfony\Component\Serializer\Tests\Fixtures\GroupDummyParent')); - $this->assertTrue($factory->hasMetadataFor('Symfony\Component\Serializer\Tests\Fixtures\GroupDummyInterface')); - $this->assertFalse($factory->hasMetadataFor('Dunglas\Entity')); - } - - /** - * @group legacy - */ - public function testCacheExists() - { - $cache = $this->getMockBuilder('Doctrine\Common\Cache\Cache')->getMock(); - $cache - ->expects($this->once()) - ->method('fetch') - ->will($this->returnValue('foo')) - ; - - $factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()), $cache); - $this->assertEquals('foo', $factory->getMetadataFor('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy')); - } - - /** - * @group legacy - */ - public function testCacheNotExists() - { - $cache = $this->getMockBuilder('Doctrine\Common\Cache\Cache')->getMock(); - $cache->method('fetch')->will($this->returnValue(false)); - $cache->method('save'); - - $factory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()), $cache); - $metadata = $factory->getMetadataFor('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - - $this->assertEquals(TestClassMetadataFactory::createClassMetadata(true, true), $metadata); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php b/vendor/symfony/serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php deleted file mode 100644 index b2e5c692..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/Loader/AnnotationLoaderTest.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping\Loader; - -use Doctrine\Common\Annotations\AnnotationReader; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\ClassMetadata; -use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; -use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory; - -/** - * @author Kévin Dunglas - */ -class AnnotationLoaderTest extends TestCase -{ - /** - * @var AnnotationLoader - */ - private $loader; - - protected function setUp() - { - $this->loader = new AnnotationLoader(new AnnotationReader()); - } - - public function testInterface() - { - $this->assertInstanceOf('Symfony\Component\Serializer\Mapping\Loader\LoaderInterface', $this->loader); - } - - public function testLoadClassMetadataReturnsTrueIfSuccessful() - { - $classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - - $this->assertTrue($this->loader->loadClassMetadata($classMetadata)); - } - - public function testLoadGroups() - { - $classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - $this->loader->loadClassMetadata($classMetadata); - - $this->assertEquals(TestClassMetadataFactory::createClassMetadata(), $classMetadata); - } - - public function testLoadMaxDepth() - { - $classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy'); - $this->loader->loadClassMetadata($classMetadata); - - $attributesMetadata = $classMetadata->getAttributesMetadata(); - $this->assertEquals(2, $attributesMetadata['foo']->getMaxDepth()); - $this->assertEquals(3, $attributesMetadata['bar']->getMaxDepth()); - } - - public function testLoadClassMetadataAndMerge() - { - $classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - $parentClassMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummyParent'); - - $this->loader->loadClassMetadata($parentClassMetadata); - $classMetadata->merge($parentClassMetadata); - - $this->loader->loadClassMetadata($classMetadata); - - $this->assertEquals(TestClassMetadataFactory::createClassMetadata(true), $classMetadata); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php b/vendor/symfony/serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php deleted file mode 100644 index 974d42ee..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/Loader/XmlFileLoaderTest.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping\Loader; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader; -use Symfony\Component\Serializer\Mapping\ClassMetadata; -use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory; - -/** - * @author Kévin Dunglas - */ -class XmlFileLoaderTest extends TestCase -{ - /** - * @var XmlFileLoader - */ - private $loader; - /** - * @var ClassMetadata - */ - private $metadata; - - protected function setUp() - { - $this->loader = new XmlFileLoader(__DIR__.'/../../Fixtures/serialization.xml'); - $this->metadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - } - - public function testInterface() - { - $this->assertInstanceOf('Symfony\Component\Serializer\Mapping\Loader\LoaderInterface', $this->loader); - } - - public function testLoadClassMetadataReturnsTrueIfSuccessful() - { - $this->assertTrue($this->loader->loadClassMetadata($this->metadata)); - } - - public function testLoadClassMetadata() - { - $this->loader->loadClassMetadata($this->metadata); - - $this->assertEquals(TestClassMetadataFactory::createXmlCLassMetadata(), $this->metadata); - } - - public function testMaxDepth() - { - $classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy'); - $this->loader->loadClassMetadata($classMetadata); - - $attributesMetadata = $classMetadata->getAttributesMetadata(); - $this->assertEquals(2, $attributesMetadata['foo']->getMaxDepth()); - $this->assertEquals(3, $attributesMetadata['bar']->getMaxDepth()); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php b/vendor/symfony/serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php deleted file mode 100644 index 918af73b..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/Loader/YamlFileLoaderTest.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping\Loader; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader; -use Symfony\Component\Serializer\Mapping\ClassMetadata; -use Symfony\Component\Serializer\Tests\Mapping\TestClassMetadataFactory; - -/** - * @author Kévin Dunglas - */ -class YamlFileLoaderTest extends TestCase -{ - /** - * @var YamlFileLoader - */ - private $loader; - /** - * @var ClassMetadata - */ - private $metadata; - - protected function setUp() - { - $this->loader = new YamlFileLoader(__DIR__.'/../../Fixtures/serialization.yml'); - $this->metadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - } - - public function testInterface() - { - $this->assertInstanceOf('Symfony\Component\Serializer\Mapping\Loader\LoaderInterface', $this->loader); - } - - public function testLoadClassMetadataReturnsTrueIfSuccessful() - { - $this->assertTrue($this->loader->loadClassMetadata($this->metadata)); - } - - public function testLoadClassMetadataReturnsFalseWhenEmpty() - { - $loader = new YamlFileLoader(__DIR__.'/../../Fixtures/empty-mapping.yml'); - $this->assertFalse($loader->loadClassMetadata($this->metadata)); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\MappingException - */ - public function testLoadClassMetadataReturnsThrowsInvalidMapping() - { - $loader = new YamlFileLoader(__DIR__.'/../../Fixtures/invalid-mapping.yml'); - $loader->loadClassMetadata($this->metadata); - } - - public function testLoadClassMetadata() - { - $this->loader->loadClassMetadata($this->metadata); - - $this->assertEquals(TestClassMetadataFactory::createXmlCLassMetadata(), $this->metadata); - } - - public function testMaxDepth() - { - $classMetadata = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy'); - $this->loader->loadClassMetadata($classMetadata); - - $attributesMetadata = $classMetadata->getAttributesMetadata(); - $this->assertEquals(2, $attributesMetadata['foo']->getMaxDepth()); - $this->assertEquals(3, $attributesMetadata['bar']->getMaxDepth()); - } -} diff --git a/vendor/symfony/serializer/Tests/Mapping/TestClassMetadataFactory.php b/vendor/symfony/serializer/Tests/Mapping/TestClassMetadataFactory.php deleted file mode 100644 index f435d36f..00000000 --- a/vendor/symfony/serializer/Tests/Mapping/TestClassMetadataFactory.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Mapping; - -use Symfony\Component\Serializer\Mapping\AttributeMetadata; -use Symfony\Component\Serializer\Mapping\ClassMetadata; - -/** - * @author Kévin Dunglas - */ -class TestClassMetadataFactory -{ - public static function createClassMetadata($withParent = false, $withInterface = false) - { - $expected = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - - $foo = new AttributeMetadata('foo'); - $foo->addGroup('a'); - $expected->addAttributeMetadata($foo); - - $bar = new AttributeMetadata('bar'); - $bar->addGroup('b'); - $bar->addGroup('c'); - $bar->addGroup('name_converter'); - $expected->addAttributeMetadata($bar); - - $fooBar = new AttributeMetadata('fooBar'); - $fooBar->addGroup('a'); - $fooBar->addGroup('b'); - $fooBar->addGroup('name_converter'); - $expected->addAttributeMetadata($fooBar); - - $symfony = new AttributeMetadata('symfony'); - $expected->addAttributeMetadata($symfony); - - if ($withParent) { - $kevin = new AttributeMetadata('kevin'); - $kevin->addGroup('a'); - $expected->addAttributeMetadata($kevin); - - $coopTilleuls = new AttributeMetadata('coopTilleuls'); - $coopTilleuls->addGroup('a'); - $coopTilleuls->addGroup('b'); - $expected->addAttributeMetadata($coopTilleuls); - } - - if ($withInterface) { - $symfony->addGroup('a'); - $symfony->addGroup('name_converter'); - } - - // load reflection class so that the comparison passes - $expected->getReflectionClass(); - - return $expected; - } - - public static function createXmlCLassMetadata() - { - $expected = new ClassMetadata('Symfony\Component\Serializer\Tests\Fixtures\GroupDummy'); - - $foo = new AttributeMetadata('foo'); - $foo->addGroup('group1'); - $foo->addGroup('group2'); - $expected->addAttributeMetadata($foo); - - $bar = new AttributeMetadata('bar'); - $bar->addGroup('group2'); - $expected->addAttributeMetadata($bar); - - return $expected; - } -} diff --git a/vendor/symfony/serializer/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php b/vendor/symfony/serializer/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php deleted file mode 100644 index b0dec518..00000000 --- a/vendor/symfony/serializer/Tests/NameConverter/CamelCaseToSnakeCaseNameConverterTest.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\NameConverter; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter; - -/** - * @author Kévin Dunglas - */ -class CamelCaseToSnakeCaseNameConverterTest extends TestCase -{ - public function testInterface() - { - $attributeMetadata = new CamelCaseToSnakeCaseNameConverter(); - $this->assertInstanceOf('Symfony\Component\Serializer\NameConverter\NameConverterInterface', $attributeMetadata); - } - - /** - * @dataProvider attributeProvider - */ - public function testNormalize($underscored, $camelCased, $useLowerCamelCase) - { - $nameConverter = new CamelCaseToSnakeCaseNameConverter(null, $useLowerCamelCase); - $this->assertEquals($nameConverter->normalize($camelCased), $underscored); - } - - /** - * @dataProvider attributeProvider - */ - public function testDenormalize($underscored, $camelCased, $useLowerCamelCase) - { - $nameConverter = new CamelCaseToSnakeCaseNameConverter(null, $useLowerCamelCase); - $this->assertEquals($nameConverter->denormalize($underscored), $camelCased); - } - - public function attributeProvider() - { - return array( - array('coop_tilleuls', 'coopTilleuls', true), - array('_kevin_dunglas', '_kevinDunglas', true), - array('this_is_a_test', 'thisIsATest', true), - array('coop_tilleuls', 'CoopTilleuls', false), - array('_kevin_dunglas', '_kevinDunglas', false), - array('this_is_a_test', 'ThisIsATest', false), - ); - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/AbstractNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/AbstractNormalizerTest.php deleted file mode 100644 index e07fb56b..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/AbstractNormalizerTest.php +++ /dev/null @@ -1,119 +0,0 @@ - - */ -class AbstractNormalizerTest extends TestCase -{ - /** - * @var AbstractNormalizerDummy - */ - private $normalizer; - - /** - * @var ClassMetadataFactoryInterface|\PHPUnit_Framework_MockObject_MockObject - */ - private $classMetadata; - - protected function setUp() - { - $loader = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\Loader\LoaderChain')->setConstructorArgs(array(array()))->getMock(); - $this->classMetadata = $this->getMockBuilder('Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory')->setConstructorArgs(array($loader))->getMock(); - $this->normalizer = new AbstractNormalizerDummy($this->classMetadata); - } - - public function testGetAllowedAttributesAsString() - { - $classMetadata = new ClassMetadata('c'); - - $a1 = new AttributeMetadata('a1'); - $classMetadata->addAttributeMetadata($a1); - - $a2 = new AttributeMetadata('a2'); - $a2->addGroup('test'); - $classMetadata->addAttributeMetadata($a2); - - $a3 = new AttributeMetadata('a3'); - $a3->addGroup('other'); - $classMetadata->addAttributeMetadata($a3); - - $a4 = new AttributeMetadata('a4'); - $a4->addGroup('test'); - $a4->addGroup('other'); - $classMetadata->addAttributeMetadata($a4); - - $this->classMetadata->method('getMetadataFor')->willReturn($classMetadata); - - $result = $this->normalizer->getAllowedAttributes('c', array(AbstractNormalizer::GROUPS => array('test')), true); - $this->assertEquals(array('a2', 'a4'), $result); - - $result = $this->normalizer->getAllowedAttributes('c', array(AbstractNormalizer::GROUPS => array('other')), true); - $this->assertEquals(array('a3', 'a4'), $result); - } - - public function testGetAllowedAttributesAsObjects() - { - $classMetadata = new ClassMetadata('c'); - - $a1 = new AttributeMetadata('a1'); - $classMetadata->addAttributeMetadata($a1); - - $a2 = new AttributeMetadata('a2'); - $a2->addGroup('test'); - $classMetadata->addAttributeMetadata($a2); - - $a3 = new AttributeMetadata('a3'); - $a3->addGroup('other'); - $classMetadata->addAttributeMetadata($a3); - - $a4 = new AttributeMetadata('a4'); - $a4->addGroup('test'); - $a4->addGroup('other'); - $classMetadata->addAttributeMetadata($a4); - - $this->classMetadata->method('getMetadataFor')->willReturn($classMetadata); - - $result = $this->normalizer->getAllowedAttributes('c', array(AbstractNormalizer::GROUPS => array('test')), false); - $this->assertEquals(array($a2, $a4), $result); - - $result = $this->normalizer->getAllowedAttributes('c', array(AbstractNormalizer::GROUPS => array('other')), false); - $this->assertEquals(array($a3, $a4), $result); - } - - public function testObjectToPopulateWithProxy() - { - $proxyDummy = new ProxyDummy(); - - $context = array(AbstractNormalizer::OBJECT_TO_POPULATE => $proxyDummy); - - $normalizer = new ObjectNormalizer(); - $normalizer->denormalize(array('foo' => 'bar'), 'Symfony\Component\Serializer\Tests\Fixtures\ToBeProxyfiedDummy', null, $context); - - $this->assertSame('bar', $proxyDummy->getFoo()); - } - - public function testObjectWithStaticConstructor() - { - $normalizer = new StaticConstructorNormalizer(); - $dummy = $normalizer->denormalize(array('foo' => 'baz'), StaticConstructorDummy::class); - - $this->assertInstanceOf(StaticConstructorDummy::class, $dummy); - $this->assertEquals('baz', $dummy->quz); - $this->assertNull($dummy->foo); - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php deleted file mode 100644 index 3ca418d5..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php +++ /dev/null @@ -1,126 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use Doctrine\Common\Annotations\AnnotationReader; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; -use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; -use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer; - -class AbstractObjectNormalizerTest extends TestCase -{ - public function testDenormalize() - { - $normalizer = new AbstractObjectNormalizerDummy(); - $normalizedData = $normalizer->denormalize(array('foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz'), __NAMESPACE__.'\Dummy'); - - $this->assertSame('foo', $normalizedData->foo); - $this->assertNull($normalizedData->bar); - $this->assertSame('baz', $normalizedData->baz); - } - - public function testInstantiateObjectDenormalizer() - { - $data = array('foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz'); - $class = __NAMESPACE__.'\Dummy'; - $context = array(); - - $normalizer = new AbstractObjectNormalizerDummy(); - - $this->assertInstanceOf(__NAMESPACE__.'\Dummy', $normalizer->instantiateObject($data, $class, $context, new \ReflectionClass($class), array())); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\ExtraAttributesException - * @expectedExceptionMessage Extra attributes are not allowed ("fooFoo", "fooBar" are unknown). - */ - public function testDenormalizeWithExtraAttributes() - { - $normalizer = new AbstractObjectNormalizerDummy(); - $normalizer->denormalize( - array('fooFoo' => 'foo', 'fooBar' => 'bar'), - __NAMESPACE__.'\Dummy', - 'any', - array('allow_extra_attributes' => false) - ); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\ExtraAttributesException - * @expectedExceptionMessage Extra attributes are not allowed ("fooFoo", "fooBar" are unknown). - */ - public function testDenormalizeWithExtraAttributesAndNoGroupsWithMetadataFactory() - { - $normalizer = new AbstractObjectNormalizerWithMetadata(); - $normalizer->denormalize( - array('fooFoo' => 'foo', 'fooBar' => 'bar', 'bar' => 'bar'), - Dummy::class, - 'any', - array('allow_extra_attributes' => false) - ); - } -} - -class AbstractObjectNormalizerDummy extends AbstractObjectNormalizer -{ - protected function extractAttributes($object, $format = null, array $context = array()) - { - } - - protected function getAttributeValue($object, $attribute, $format = null, array $context = array()) - { - } - - protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()) - { - $object->$attribute = $value; - } - - protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = array()) - { - return in_array($attribute, array('foo', 'baz')); - } - - public function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes, $format = null) - { - return parent::instantiateObject($data, $class, $context, $reflectionClass, $allowedAttributes, $format); - } -} - -class Dummy -{ - public $foo; - public $bar; - public $baz; -} - -class AbstractObjectNormalizerWithMetadata extends AbstractObjectNormalizer -{ - public function __construct() - { - parent::__construct(new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()))); - } - - protected function extractAttributes($object, $format = null, array $context = array()) - { - } - - protected function getAttributeValue($object, $attribute, $format = null, array $context = array()) - { - } - - protected function setAttributeValue($object, $attribute, $value, $format = null, array $context = array()) - { - $object->$attribute = $value; - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/ArrayDenormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/ArrayDenormalizerTest.php deleted file mode 100644 index e5876a04..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/ArrayDenormalizerTest.php +++ /dev/null @@ -1,122 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; -use Symfony\Component\Serializer\SerializerInterface; - -class ArrayDenormalizerTest extends TestCase -{ - /** - * @var ArrayDenormalizer - */ - private $denormalizer; - - /** - * @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - private $serializer; - - protected function setUp() - { - $this->serializer = $this->getMockBuilder('Symfony\Component\Serializer\Serializer')->getMock(); - $this->denormalizer = new ArrayDenormalizer(); - $this->denormalizer->setSerializer($this->serializer); - } - - public function testDenormalize() - { - $this->serializer->expects($this->at(0)) - ->method('denormalize') - ->with(array('foo' => 'one', 'bar' => 'two')) - ->will($this->returnValue(new ArrayDummy('one', 'two'))); - - $this->serializer->expects($this->at(1)) - ->method('denormalize') - ->with(array('foo' => 'three', 'bar' => 'four')) - ->will($this->returnValue(new ArrayDummy('three', 'four'))); - - $result = $this->denormalizer->denormalize( - array( - array('foo' => 'one', 'bar' => 'two'), - array('foo' => 'three', 'bar' => 'four'), - ), - __NAMESPACE__.'\ArrayDummy[]' - ); - - $this->assertEquals( - array( - new ArrayDummy('one', 'two'), - new ArrayDummy('three', 'four'), - ), - $result - ); - } - - public function testSupportsValidArray() - { - $this->serializer->expects($this->once()) - ->method('supportsDenormalization') - ->with($this->anything(), __NAMESPACE__.'\ArrayDummy', $this->anything()) - ->will($this->returnValue(true)); - - $this->assertTrue( - $this->denormalizer->supportsDenormalization( - array( - array('foo' => 'one', 'bar' => 'two'), - array('foo' => 'three', 'bar' => 'four'), - ), - __NAMESPACE__.'\ArrayDummy[]' - ) - ); - } - - public function testSupportsInvalidArray() - { - $this->serializer->expects($this->any()) - ->method('supportsDenormalization') - ->will($this->returnValue(false)); - - $this->assertFalse( - $this->denormalizer->supportsDenormalization( - array( - array('foo' => 'one', 'bar' => 'two'), - array('foo' => 'three', 'bar' => 'four'), - ), - __NAMESPACE__.'\InvalidClass[]' - ) - ); - } - - public function testSupportsNoArray() - { - $this->assertFalse( - $this->denormalizer->supportsDenormalization( - array('foo' => 'one', 'bar' => 'two'), - __NAMESPACE__.'\ArrayDummy' - ) - ); - } -} - -class ArrayDummy -{ - public $foo; - public $bar; - - public function __construct($foo, $bar) - { - $this->foo = $foo; - $this->bar = $bar; - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/CustomNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/CustomNormalizerTest.php deleted file mode 100644 index e5d0d445..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/CustomNormalizerTest.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Tests\Fixtures\ScalarDummy; -use Symfony\Component\Serializer\Normalizer\CustomNormalizer; -use Symfony\Component\Serializer\Serializer; - -class CustomNormalizerTest extends TestCase -{ - /** - * @var CustomNormalizer - */ - private $normalizer; - - protected function setUp() - { - $this->normalizer = new CustomNormalizer(); - $this->normalizer->setSerializer(new Serializer()); - } - - public function testInterface() - { - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\NormalizerInterface', $this->normalizer); - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\DenormalizerInterface', $this->normalizer); - $this->assertInstanceOf('Symfony\Component\Serializer\SerializerAwareInterface', $this->normalizer); - } - - public function testSerialize() - { - $obj = new ScalarDummy(); - $obj->foo = 'foo'; - $obj->xmlFoo = 'xml'; - $this->assertEquals('foo', $this->normalizer->normalize($obj, 'json')); - $this->assertEquals('xml', $this->normalizer->normalize($obj, 'xml')); - } - - public function testDeserialize() - { - $obj = $this->normalizer->denormalize('foo', get_class(new ScalarDummy()), 'xml'); - $this->assertEquals('foo', $obj->xmlFoo); - $this->assertNull($obj->foo); - - $obj = $this->normalizer->denormalize('foo', get_class(new ScalarDummy()), 'json'); - $this->assertEquals('foo', $obj->foo); - $this->assertNull($obj->xmlFoo); - } - - public function testDenormalizeWithObjectToPopulateUsesProvidedObject() - { - $expected = new ScalarDummy(); - $obj = $this->normalizer->denormalize('foo', ScalarDummy::class, 'json', array( - 'object_to_populate' => $expected, - )); - - $this->assertSame($expected, $obj); - $this->assertEquals('foo', $obj->foo); - $this->assertNull($obj->xmlFoo); - } - - public function testSupportsNormalization() - { - $this->assertTrue($this->normalizer->supportsNormalization(new ScalarDummy())); - $this->assertFalse($this->normalizer->supportsNormalization(new \stdClass())); - } - - public function testSupportsDenormalization() - { - $this->assertTrue($this->normalizer->supportsDenormalization(array(), 'Symfony\Component\Serializer\Tests\Fixtures\ScalarDummy')); - $this->assertFalse($this->normalizer->supportsDenormalization(array(), 'stdClass')); - $this->assertTrue($this->normalizer->supportsDenormalization(array(), 'Symfony\Component\Serializer\Tests\Fixtures\DenormalizableDummy')); - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/DataUriNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/DataUriNormalizerTest.php deleted file mode 100644 index 4bc94435..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/DataUriNormalizerTest.php +++ /dev/null @@ -1,189 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\HttpFoundation\File\File; -use Symfony\Component\Serializer\Normalizer\DataUriNormalizer; - -/** - * @author Kévin Dunglas - */ -class DataUriNormalizerTest extends TestCase -{ - const TEST_GIF_DATA = 'data:image/gif;base64,R0lGODdhAQABAIAAAP///////ywAAAAAAQABAAACAkQBADs='; - const TEST_TXT_DATA = 'data:text/plain,K%C3%A9vin%20Dunglas%0A'; - const TEST_TXT_CONTENT = "Kévin Dunglas\n"; - - /** - * @var DataUriNormalizer - */ - private $normalizer; - - protected function setUp() - { - $this->normalizer = new DataUriNormalizer(); - } - - public function testInterface() - { - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\NormalizerInterface', $this->normalizer); - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\DenormalizerInterface', $this->normalizer); - } - - public function testSupportNormalization() - { - $this->assertFalse($this->normalizer->supportsNormalization(new \stdClass())); - $this->assertTrue($this->normalizer->supportsNormalization(new \SplFileObject('data:,Hello%2C%20World!'))); - } - - /** - * @requires extension fileinfo - */ - public function testNormalizeHttpFoundationFile() - { - $file = new File(__DIR__.'/../Fixtures/test.gif'); - - $this->assertSame(self::TEST_GIF_DATA, $this->normalizer->normalize($file)); - } - - /** - * @requires extension fileinfo - */ - public function testNormalizeSplFileInfo() - { - $file = new \SplFileInfo(__DIR__.'/../Fixtures/test.gif'); - - $this->assertSame(self::TEST_GIF_DATA, $this->normalizer->normalize($file)); - } - - /** - * @requires extension fileinfo - */ - public function testNormalizeText() - { - $file = new \SplFileObject(__DIR__.'/../Fixtures/test.txt'); - - $data = $this->normalizer->normalize($file); - - $this->assertSame(self::TEST_TXT_DATA, $data); - $this->assertSame(self::TEST_TXT_CONTENT, file_get_contents($data)); - } - - public function testSupportsDenormalization() - { - $this->assertFalse($this->normalizer->supportsDenormalization('foo', 'Bar')); - $this->assertTrue($this->normalizer->supportsDenormalization(self::TEST_GIF_DATA, 'SplFileInfo')); - $this->assertTrue($this->normalizer->supportsDenormalization(self::TEST_GIF_DATA, 'SplFileObject')); - $this->assertTrue($this->normalizer->supportsDenormalization(self::TEST_TXT_DATA, 'Symfony\Component\HttpFoundation\File\File')); - } - - public function testDenormalizeSplFileInfo() - { - $file = $this->normalizer->denormalize(self::TEST_TXT_DATA, 'SplFileInfo'); - - $this->assertInstanceOf('SplFileInfo', $file); - $this->assertSame(file_get_contents(self::TEST_TXT_DATA), $this->getContent($file)); - } - - public function testDenormalizeSplFileObject() - { - $file = $this->normalizer->denormalize(self::TEST_TXT_DATA, 'SplFileObject'); - - $this->assertInstanceOf('SplFileObject', $file); - $this->assertEquals(file_get_contents(self::TEST_TXT_DATA), $this->getContent($file)); - } - - public function testDenormalizeHttpFoundationFile() - { - $file = $this->normalizer->denormalize(self::TEST_GIF_DATA, 'Symfony\Component\HttpFoundation\File\File'); - - $this->assertInstanceOf('Symfony\Component\HttpFoundation\File\File', $file); - $this->assertSame(file_get_contents(self::TEST_GIF_DATA), $this->getContent($file->openFile())); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage The provided "data:" URI is not valid. - */ - public function testGiveNotAccessToLocalFiles() - { - $this->normalizer->denormalize('/etc/shadow', 'SplFileObject'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @dataProvider invalidUriProvider - */ - public function testInvalidData($uri) - { - $this->normalizer->denormalize($uri, 'SplFileObject'); - } - - public function invalidUriProvider() - { - return array( - array('dataxbase64'), - array('data:HelloWorld'), - array('data:text/html;charset=,%3Ch1%3EHello!%3C%2Fh1%3E'), - array('data:text/html;charset,%3Ch1%3EHello!%3C%2Fh1%3E'), - array('data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC'), - array(''), - array('http://wikipedia.org'), - array('base64'), - array('iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC'), - array(' data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC'), - array(' data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC'), - ); - } - - /** - * @dataProvider validUriProvider - */ - public function testValidData($uri) - { - $this->assertInstanceOf('SplFileObject', $this->normalizer->denormalize($uri, 'SplFileObject')); - } - - public function validUriProvider() - { - $data = array( - array('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC'), - array('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC'), - array('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC '), - array('data:,Hello%2C%20World!'), - array('data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E'), - array('data:,A%20brief%20note'), - array('data:text/html;charset=US-ASCII,%3Ch1%3EHello!%3C%2Fh1%3E'), - array('data:application/ld+json;base64,eyJAaWQiOiAiL2ZvbyJ9'), - array('data:application/vnd.ms-word.document.macroenabled.12;base64,UEsDBBQABgAIAAAAIQBnzQ+udAEAADoFAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0lMtOwzAQRfdI/EPkLUrcskAINe0CyhIqUT7AtSepIX7Idl9/zzhpI1TRBFG6iZTM3HvPOJmMJltVJWtwXhqdk2E2IAloboTUZU7e58/pPUl8YFqwymjIyQ48mYyvr0bznQWfoFr7nCxDsA+Uer4ExXxmLGisFMYpFvDWldQy/slKoLeDwR3lRgfQIQ3Rg4xHT1CwVRWS6RYfNyQoJ8lj0xejcsKsrSRnAcs0VumPOgeV7xCutTiiS/dkGSrrHr+U1t+cTviwUB4lSBVHqwuoecXjdFJAMmMuvDCFDXRjnKDC8JVCUdY9XGRUPo2SrJUoxp2ZaraoAKtM6gPhyTQfdhX4X2QdnYcpCsmhDY5e1hkO3uM3oaqs8e2PhxBQcAmAvXMvwgYWbxej+GbeC1Jg7jy+uv/HaK17IQLuJjTX4dkctU1XJHbOnLEed939YezDUkZ1igNbcEF2f3VtIlqfPR/EfRcgfsim9Z9v/AUAAP//AwBQSwMEFAAGAAgAAAAhAMfCJ7z/AAAA3wIAAAsACAJfcmVscy8ucmVscyCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsks1KAzEQgO+C7xDm3s22iog024sIvYmsDzAm093o5odkqu3bG0XUhWUR7HH+Pr5JZr05uEG8Uso2eAXLqgZBXgdjfafgsb1bXIPIjN7gEDwpOFKGTXN+tn6gAbkM5d7GLArFZwU9c7yRMuueHOYqRPKlsgvJIZcwdTKifsGO5Kqur2T6zYBmxBRboyBtzQWI9hjpf2zpiNEgo9Qh0SKmMp3Yll1Ei6kjVmCCvi/p/NlRFTLIaaHLvwuF3c5qug1678jzlBcdmLwhM6+EMc4ZLU9pNO74kXkLyUjzlZ6zWZ32w7jfuyePdph4l+9a9Ryp+xCSo7Ns3gEAAP//AwBQSwMEFAAGAAgAAAAhABOqPof2AAAAMQMAABwACAF3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzIKIEASigAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArJLLasMwEEX3hf6DmH0tO31QQuRsSiHb1v0ARR4/qCwJzfThv69oSOvQYLrw8l4x955Bs9l+Dla8Y6TeOwVFloNAZ3zdu1bBS/V4dQ+CWLtaW+9QwYgE2/LyYvOEVnMaoq4PJFKKIwUdc1hLSabDQVPmA7r00vg4aE4ytjJo86pblKs8v5NxmgHlSabY1Qrirr4GUY0B/5Ptm6Y3+ODN24COz1TID9w/I3NajlKsji2ygomZpUSQ50FulgRpvONK7y3+YvxYcxC3S0Jwmp0AfMuDWcwxFEsyEI8WJ59x0HP1q0Xr/1zD0TkiyJNDL78AAAD//wMAUEsDBBQABgAIAAAAIQAz6gHKYAIAAAIHAAARAAAAd29yZC9kb2N1bWVudC54bWykld1u2jAUx+8n7R2Q70sSCpRGQKVBh9A0qRrb9WQcJ7GIfSzbQLs32nPsxXacL7JNQ7QgFPt8+Of/sWNn+vAsi96BGytAzUjUD0mPKwaJUNmMfPv68WZCetZRldACFJ+RF27Jw/z9u+kxToDtJVeuhwhl46NmM5I7p+MgsCznktq+FMyAhdT1GcgA0lQwHhzBJMEgjMKypw0wbi3Ot6DqQC2pcRIuo0nKmu4gDCdoC9Uy/lUEmisMpmAkdWiaDEeY3V7fIFNTJ7aiEO7Fs8Yt5jAje6PimnHT6vBjYhQQH2TRJMO53Epo3TQjzCUiqyHLeslLeYHhBQoGZXOhT+v2VhoG8wZytuBOsUcdDa/b9KWhR2xOwEvkJ9UgWVTKzxOj8IId8Yh2xCUS/pyzUdJ9+Y5vW5rO4kaj1wEGfwN0dt3mrAzs9YkmrqOt1a5l+avkFax6k7ul2evEbHKq8QRKFq8zBYZuC1SEW9bDVe/515rM8YrbQvLiW43uYaypoetkRsLB8hb/Q1J6HX923ntX/9Ab43WafMHEcHQXLUaD1rXkKd0Xzkduw9FitChnMf7h5p9+/TwINQ183z9L9xZg5y+ojaPGIUb4+T1PUYmKv6/gA2U7EnRzH1XSZgYlSvuw5cw9mf+r22Dcex+j0eQ+LJXpbPMDo3gioug+LOfNsT+eDEuyT/hMPdIBHtxoGFXViyx3J3MLzoE82QVPO9Gc04TjFXgXTryZAriOme1dadbTMSgseq2mjFc5pRu/RCsjfNGFUPxJOIYqb8dN9VXhZbfa0OD08Zr/BgAA//8DAFBLAwQUAAYACAAAACEAJyDgAjMGAACMGgAAFQAAAHdvcmQvdGhlbWUvdGhlbWUxLnhtbOxZTYvbRhi+F/ofhO6OZVvyxxJvsGU7abObhOwmJcexNJYmO9KYmdHumhAoybFQKE1LDw301kJpG0igl/TUn7JtSptC/kJHI8uesccsaTawhNhgzcfzvvPM+848I1kXLx0n2DqElCGSdu3aBce2YBqQEKVR1761P6q0bYtxkIYAkxR27Rlk9qXtDz+4CLZ4DBNoCfuUbYGuHXM+3apWWSCaAbtApjAVfRNCE8BFlUbVkIIj4TfB1brjNKsJQKltpSARbvfj338Qzq5PJiiA9nbpfYjFT8pZ3hBgupf7hnOTfkYhyCQ2PKjlFzZjPqbWIcBdWwwUkqN9eMxtCwPGRUfXduTHrm5frC6MMN9gq9iN5GduNzcID+rSjkbjhaHrem6zt/AvAZiv44atYXPYXPiTABAEYqYFFxXr9Tv9gTfHKqCiaPA9aA0aNQ2v+G+s4Xte/tXwElQU3TX8aOQvY6iAiqJniEmr7rsaXoKKYnMN33J6A7el4SUoxig9WEM7XrPhl7NdQCYEXzHCO547atXn8CWqqqyuwj7lm9ZaAu4SOhIAmVzAUWrx2RROQCBwPsBoTJG1g6JYLLwpSAkTzU7dGTkN8Zt/XVmSEQFbECjWRVPA1ppyPhYLKJryrv2x8GorkFfPf3r1/Kl18uDZyYNfTx4+PHnwi8HqCkgj1erl91/8+/hT65+n37189JUZz1T8nz9/9sdvX5qBXAW++PrJX8+evPjm879/fGSA9ygYq/B9lEBmXYNH1k2SiIkZBoBj+noW+zFAqkUvjRhIQW5jQA95rKGvzQAGBlwf6hG8TYVMmICXs7sa4b2YZhwZgFfjRAPuEoL7hBrndDUfS41ClkbmwWmm4m4CcGga21/J7zCbivWOTC79GGo0b2CRchDBFHIr7yMHEBrM7iCkxXUXBZQwMuHWHWT1ATKGZB+NtdW0NLqCEpGXmYmgyLcWm93bVp9gk/sBPNSRYlcAbHIJsRbGyyDjIDEyBglWkTuAxyaSezMaaAFnXGQ6gphYwxAyZrK5Tmca3atCXsxp38WzREdSjg5MyB1AiIockAM/BsnUyBmlsYr9iB2IJQqsG4QbSRB9h+R1kQeQbkz3bQS1dJ++t28JZTUvkLwno6YtAYm+H2d4AqB0Xl3R8wSlp4r7iqx7b1fWhZC++PaxWXfPpaD3KDLuqFUZ34RbFW+f0BCdf+0egCy9AcV2MUDfS/d76X7npXvTfj57wV5qtLyJL2/VpZtk4337BGG8x2cY7jCp7kxMLxyJRlmRRovHhGksivPhNFxEgSxblPBPEI/3YjAVw9TkCBGbu46YNSVMnA+y2eg778BZskvCorVWK59MhQHgy3ZxvpTt4jTiRWuztXwEW7iXtUg+KpcEctvXIaEMppNoGEi0ysZTSMiZnQmLjoFFO3e/kYW8zLMi9p8F8n81PLdgJNYbwDDM81TYl9k980xvCqY+7bphep2c69lkWiOhLDedhLIMYxDC1eYzznVnmVKNXh6KdRqt9tvIdS4iK9qAU71mHYk91/CEmwBMu/ZE3BmKYjIV/liumwBHadcO+DzQ/0dZppTxAWBxAZNdxfwTxCG1MErEWlfTgNMlt1q9lc/xnJLrOOcvcvKiJhlOJjDgG1qWVdFXODH2viE4r5BMkN6LwyNrjDN6E4hAea1aHsAQMb6IZoiosriXUVyRq/lW1P4xW25RgKcxmJ8oqpgXcFle0FHmIZmuzkqvzyczjvIkvfGpe7pR3qGI5oYDJD81zfrx9g55hdVS9zVWhXSval2n1LpNp8SbHwgKteVgGrWcsYHaslWndoY3BMpwi6W56Yw469NgddXmB0R5Xylra68myPiuWPkDcbuaYc4kVXgsnhH88k/lQglka6kux9zKKOra9xyv5/p1z684bW9YcRuuU2l7vUal53mN2tCrOYN+/b4ICo+TmleMPRLPM3g2f/Ui29devyTlbfaFgCRVIt+rVKWxfP1Sq2uvX4r3LtZ+3m9bSETmXrM+6jQ6/Wal0+iNKu6g3650/Ga/Mmj6rcFo4Hvtzui+bR1KsNtr+G5z2K40a75fcZtOTr/dqbTcer3ntnrtodu7P4+1mHl5LcMreW3/BwAA//8DAFBLAwQKAAAAAAAAACEAahPYDYwlAACMJQAAFwAAAGRvY1Byb3BzL3RodW1ibmFpbC5qcGVn/9j/4AAQSkZJRgABAQAASABIAAD/4QCARXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAABIAAAAAQAAAEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAWmgAwAEAAAAAQAAAgAAAAAA/+0AOFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv/AABEIAgABaQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/3QAEAC7/2gAMAwEAAhEDEQA/AP7Yfgx8GPg9N8HvhRLL8KPhrLLL8NfAskkkngTws8kkj+F9LZ3d200s7uxLMzHczEk5JNAHpX/ClPg3/wBEl+GX/hBeFf8A5W0AH/ClPg3/ANEl+GX/AIQXhX/5W0AH/ClPg3/0SX4Zf+EF4V/+VtAB/wAKU+Df/RJfhl/4QXhX/wCVtAB/wpT4N/8ARJfhl/4QXhX/AOVtAB/wpT4N/wDRJfhl/wCEF4V/+VtAB/wpT4N/9El+GX/hBeFf/lbQAf8AClPg3/0SX4Zf+EF4V/8AlbQAf8KU+Df/AESX4Zf+EF4V/wDlbQAf8KU+Df8A0SX4Zf8AhBeFf/lbQAf8KU+Df/RJfhl/4QXhX/5W0AH/AApT4N/9El+GX/hBeFf/AJW0AH/ClPg3/wBEl+GX/hBeFf8A5W0AH/ClPg3/ANEl+GX/AIQXhX/5W0AH/ClPg3/0SX4Zf+EF4V/+VtAB/wAKU+Df/RJfhl/4QXhX/wCVtAB/wpT4N/8ARJfhl/4QXhX/AOVtAB/wpT4N/wDRJfhl/wCEF4V/+VtAB/wpT4N/9El+GX/hBeFf/lbQAf8AClPg3/0SX4Zf+EF4V/8AlbQAf8KU+Df/AESX4Zf+EF4V/wDlbQAf8KU+Df8A0SX4Zf8AhBeFf/lbQAf8KU+Df/RJfhl/4QXhX/5W0AH/AApT4N/9El+GX/hBeFf/AJW0AH/ClPg3/wBEl+GX/hBeFf8A5W0AH/ClPg3/ANEl+GX/AIQXhX/5W0AH/ClPg3/0SX4Zf+EF4V/+VtAB/wAKU+Df/RJfhl/4QXhX/wCVtAB/wpT4N/8ARJfhl/4QXhX/AOVtAB/wpT4N/wDRJfhl/wCEF4V/+VtAB/wpT4N/9El+GX/hBeFf/lbQAf8AClPg3/0SX4Zf+EF4V/8AlbQAf8KU+Df/AESX4Zf+EF4V/wDlbQAf8KU+Df8A0SX4Zf8AhBeFf/lbQAf8KU+Df/RJfhl/4QXhX/5W0AH/AApT4N/9El+GX/hBeFf/AJW0AH/ClPg3/wBEl+GX/hBeFf8A5W0AH/ClPg3/ANEl+GX/AIQXhX/5W0AH/ClPg3/0SX4Zf+EF4V/+VtAB/wAKU+Df/RJfhl/4QXhX/wCVtAB/wpT4N/8ARJfhl/4QXhX/AOVtAB/wpT4N/wDRJfhl/wCEF4V/+VtAB/wpT4N/9El+GX/hBeFf/lbQAf8AClPg3/0SX4Zf+EF4V/8AlbQB/Nd/wrT4c/8ARP8AwT/4Sug//INAH//Q/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9H+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0v7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/T/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9T+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAfP3j79pv4T/DT4n6P8IvFmr3Vj4w1jwRqvxN2GC3TSNH+G3hs6v/AMJj8QPEmsXV5a2Xh3wZ4JTSB/wlPiPVnttK0+81vwpokdxc+IPFfh/SdQAMPQ/2v/gXr2heH9WtvFlrZ6n4g8X6B4Gi8GatfaFpnjPS/Eev+N2+HyafrmjXWsxx6bdaV4lg1DTtasZbxtUstX0rUvCS6fP45gXwu4B6v8L/AIufDX40+GR4x+FfjDSPG3hk3ENqNW0eSZoPNu9I0rxFp7GO5ht7hbfV/DevaD4m0O7aL7LrnhjXtC8SaRPe6JrOmX10AejUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/1f7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQB4L8Vv2YvgX8b9UbWvij4Ct/FWqP4Yv/BbXsut+JtKlPhTV9K8WaFrWgf8SPWdMT+zNd0Lx14t0TXrbAXW9H1y70zVftliILeIA4/Rv2Jv2Y9AvvDuqaX8Mkg1Pwr4a8O+D9Dv5PF3ju6u7Xw74T+M9h+0J4e06aW68TzG/GnfGDTLTxglzqH2q7mKS6FczzeGbm50eUA9j+Gfwk+Hvwd0e80D4c+H/wDhHdJv5PDUl3a/2rrerec/hD4eeCvhT4dbz9c1LU7lP7O8A/DvwdoOI5lF3/Y/9qX32nWdQ1PUb0A9HoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/mXoA/9b+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1/7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/Q/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9H+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0v7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/T/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9T+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1f7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/W/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9f+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0P7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/R/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9L+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0/7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/U/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9X+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1v7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/X/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9D+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0f7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/S/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9P+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1P7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/V/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9b+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1/7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/Q/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9H+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0v7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/T/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9T+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1f7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/W/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9f+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0P7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/R/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9L+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0/7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/U/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9X+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1v7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/X/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9D+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/0f7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/S/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9P+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8y9AH/1P7q/gp/yRr4Sf8AZMvAf/qK6VQB6bQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfzL0Af/V/ur+Cn/JGvhJ/wBky8B/+orpVAHptABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/MvQB/9b+6v4Kf8ka+En/AGTLwH/6iulUAem0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF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'), - array('data:a!b#c&d-e^f_g+h.i/a!b#c&d-e^f_g+h.i;base64,foobar'), - ); - - if (!defined('HHVM_VERSION')) { - // See https://github.com/facebook/hhvm/issues/6354 - $data[] = array('data:text/plain;charset=utf-8;base64,SGVsbG8gV29ybGQh'); - } - - return $data; - } - - private function getContent(\SplFileObject $file) - { - $buffer = ''; - while (!$file->eof()) { - $buffer .= $file->fgets(); - } - - return $buffer; - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/DateIntervalNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/DateIntervalNormalizerTest.php deleted file mode 100644 index f6dc6c24..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/DateIntervalNormalizerTest.php +++ /dev/null @@ -1,137 +0,0 @@ - - */ -class DateIntervalNormalizerTest extends TestCase -{ - /** - * @var DateIntervalNormalizer - */ - private $normalizer; - - protected function setUp() - { - $this->normalizer = new DateIntervalNormalizer(); - } - - public function dataProviderISO() - { - $data = array( - array('P%YY%MM%DDT%HH%IM%SS', 'P00Y00M00DT00H00M00S', 'PT0S'), - array('P%yY%mM%dDT%hH%iM%sS', 'P0Y0M0DT0H0M0S', 'PT0S'), - array('P%yY%mM%dDT%hH%iM%sS', 'P10Y2M3DT16H5M6S', 'P10Y2M3DT16H5M6S'), - array('P%yY%mM%dDT%hH%iM', 'P10Y2M3DT16H5M', 'P10Y2M3DT16H5M'), - array('P%yY%mM%dDT%hH', 'P10Y2M3DT16H', 'P10Y2M3DT16H'), - array('P%yY%mM%dD', 'P10Y2M3D', 'P10Y2M3DT0H'), - ); - - return $data; - } - - public function testSupportsNormalization() - { - $this->assertTrue($this->normalizer->supportsNormalization(new \DateInterval('P00Y00M00DT00H00M00S'))); - $this->assertFalse($this->normalizer->supportsNormalization(new \stdClass())); - } - - public function testNormalize() - { - $this->assertEquals('P0Y0M0DT0H0M0S', $this->normalizer->normalize(new \DateInterval('PT0S'))); - } - - /** - * @dataProvider dataProviderISO - */ - public function testNormalizeUsingFormatPassedInContext($format, $output, $input) - { - $this->assertEquals($output, $this->normalizer->normalize(new \DateInterval($input), null, array(DateIntervalNormalizer::FORMAT_KEY => $format))); - } - - /** - * @dataProvider dataProviderISO - */ - public function testNormalizeUsingFormatPassedInConstructor($format, $output, $input) - { - $this->assertEquals($output, (new DateIntervalNormalizer($format))->normalize(new \DateInterval($input))); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - * @expectedExceptionMessage The object must be an instance of "\DateInterval". - */ - public function testNormalizeInvalidObjectThrowsException() - { - $this->normalizer->normalize(new \stdClass()); - } - - public function testSupportsDenormalization() - { - $this->assertTrue($this->normalizer->supportsDenormalization('P00Y00M00DT00H00M00S', \DateInterval::class)); - $this->assertFalse($this->normalizer->supportsDenormalization('foo', 'Bar')); - } - - public function testDenormalize() - { - $this->assertDateIntervalEquals(new \DateInterval('P00Y00M00DT00H00M00S'), $this->normalizer->denormalize('P00Y00M00DT00H00M00S', \DateInterval::class)); - } - - /** - * @dataProvider dataProviderISO - */ - public function testDenormalizeUsingFormatPassedInContext($format, $input, $output) - { - $this->assertDateIntervalEquals(new \DateInterval($output), $this->normalizer->denormalize($input, \DateInterval::class, null, array(DateIntervalNormalizer::FORMAT_KEY => $format))); - } - - /** - * @dataProvider dataProviderISO - */ - public function testDenormalizeUsingFormatPassedInConstructor($format, $input, $output) - { - $this->assertDateIntervalEquals(new \DateInterval($output), (new DateIntervalNormalizer($format))->denormalize($input, \DateInterval::class)); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - */ - public function testDenormalizeExpectsString() - { - $this->normalizer->denormalize(1234, \DateInterval::class); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage Expected a valid ISO 8601 interval string. - */ - public function testDenormalizeNonISO8601IntervalStringThrowsException() - { - $this->normalizer->denormalize('10 years 2 months 3 days', \DateInterval::class, null); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDenormalizeInvalidDataThrowsException() - { - $this->normalizer->denormalize('invalid interval', \DateInterval::class); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDenormalizeFormatMismatchThrowsException() - { - $this->normalizer->denormalize('P00Y00M00DT00H00M00S', \DateInterval::class, null, array(DateIntervalNormalizer::FORMAT_KEY => 'P%yY%mM%dD')); - } - - private function assertDateIntervalEquals(\DateInterval $expected, \DateInterval $actual) - { - $this->assertEquals($expected->format('%RP%yY%mM%dDT%hH%iM%sS'), $actual->format('%RP%yY%mM%dDT%hH%iM%sS')); - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/DateTimeNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/DateTimeNormalizerTest.php deleted file mode 100644 index 178519b3..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/DateTimeNormalizerTest.php +++ /dev/null @@ -1,195 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; - -/** - * @author Kévin Dunglas - */ -class DateTimeNormalizerTest extends TestCase -{ - /** - * @var DateTimeNormalizer - */ - private $normalizer; - - protected function setUp() - { - $this->normalizer = new DateTimeNormalizer(); - } - - public function testSupportsNormalization() - { - $this->assertTrue($this->normalizer->supportsNormalization(new \DateTime())); - $this->assertTrue($this->normalizer->supportsNormalization(new \DateTimeImmutable())); - $this->assertFalse($this->normalizer->supportsNormalization(new \stdClass())); - } - - public function testNormalize() - { - $this->assertEquals('2016-01-01T00:00:00+00:00', $this->normalizer->normalize(new \DateTime('2016/01/01', new \DateTimeZone('UTC')))); - $this->assertEquals('2016-01-01T00:00:00+00:00', $this->normalizer->normalize(new \DateTimeImmutable('2016/01/01', new \DateTimeZone('UTC')))); - } - - public function testNormalizeUsingFormatPassedInContext() - { - $this->assertEquals('2016', $this->normalizer->normalize(new \DateTime('2016/01/01'), null, array(DateTimeNormalizer::FORMAT_KEY => 'Y'))); - } - - public function testNormalizeUsingFormatPassedInConstructor() - { - $this->assertEquals('16', (new DateTimeNormalizer('y'))->normalize(new \DateTime('2016/01/01', new \DateTimeZone('UTC')))); - } - - public function testNormalizeUsingTimeZonePassedInConstructor() - { - $normalizer = new DateTimeNormalizer(\DateTime::RFC3339, new \DateTimeZone('Japan')); - - $this->assertSame('2016-12-01T00:00:00+09:00', $normalizer->normalize(new \DateTime('2016/12/01', new \DateTimeZone('Japan')))); - $this->assertSame('2016-12-01T09:00:00+09:00', $normalizer->normalize(new \DateTime('2016/12/01', new \DateTimeZone('UTC')))); - } - - /** - * @dataProvider normalizeUsingTimeZonePassedInContextProvider - */ - public function testNormalizeUsingTimeZonePassedInContext($expected, $input, $timezone) - { - $this->assertSame($expected, $this->normalizer->normalize($input, null, array( - DateTimeNormalizer::TIMEZONE_KEY => $timezone, - ))); - } - - public function normalizeUsingTimeZonePassedInContextProvider() - { - yield array('2016-12-01T00:00:00+00:00', new \DateTime('2016/12/01', new \DateTimeZone('UTC')), null); - yield array('2016-12-01T00:00:00+09:00', new \DateTime('2016/12/01', new \DateTimeZone('Japan')), new \DateTimeZone('Japan')); - yield array('2016-12-01T09:00:00+09:00', new \DateTime('2016/12/01', new \DateTimeZone('UTC')), new \DateTimeZone('Japan')); - yield array('2016-12-01T09:00:00+09:00', new \DateTimeImmutable('2016/12/01', new \DateTimeZone('UTC')), new \DateTimeZone('Japan')); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - * @expectedExceptionMessage The object must implement the "\DateTimeInterface". - */ - public function testNormalizeInvalidObjectThrowsException() - { - $this->normalizer->normalize(new \stdClass()); - } - - public function testSupportsDenormalization() - { - $this->assertTrue($this->normalizer->supportsDenormalization('2016-01-01T00:00:00+00:00', \DateTimeInterface::class)); - $this->assertTrue($this->normalizer->supportsDenormalization('2016-01-01T00:00:00+00:00', \DateTime::class)); - $this->assertTrue($this->normalizer->supportsDenormalization('2016-01-01T00:00:00+00:00', \DateTimeImmutable::class)); - $this->assertFalse($this->normalizer->supportsDenormalization('foo', 'Bar')); - } - - public function testDenormalize() - { - $this->assertEquals(new \DateTimeImmutable('2016/01/01', new \DateTimeZone('UTC')), $this->normalizer->denormalize('2016-01-01T00:00:00+00:00', \DateTimeInterface::class)); - $this->assertEquals(new \DateTimeImmutable('2016/01/01', new \DateTimeZone('UTC')), $this->normalizer->denormalize('2016-01-01T00:00:00+00:00', \DateTimeImmutable::class)); - $this->assertEquals(new \DateTime('2016/01/01', new \DateTimeZone('UTC')), $this->normalizer->denormalize('2016-01-01T00:00:00+00:00', \DateTime::class)); - } - - public function testDenormalizeUsingTimezonePassedInConstructor() - { - $timezone = new \DateTimeZone('Japan'); - $expected = new \DateTime('2016/12/01 17:35:00', $timezone); - $normalizer = new DateTimeNormalizer(null, $timezone); - - $this->assertEquals($expected, $normalizer->denormalize('2016.12.01 17:35:00', \DateTime::class, null, array( - DateTimeNormalizer::FORMAT_KEY => 'Y.m.d H:i:s', - ))); - } - - public function testDenormalizeUsingFormatPassedInContext() - { - $this->assertEquals(new \DateTimeImmutable('2016/01/01'), $this->normalizer->denormalize('2016.01.01', \DateTimeInterface::class, null, array(DateTimeNormalizer::FORMAT_KEY => 'Y.m.d|'))); - $this->assertEquals(new \DateTimeImmutable('2016/01/01'), $this->normalizer->denormalize('2016.01.01', \DateTimeImmutable::class, null, array(DateTimeNormalizer::FORMAT_KEY => 'Y.m.d|'))); - $this->assertEquals(new \DateTime('2016/01/01'), $this->normalizer->denormalize('2016.01.01', \DateTime::class, null, array(DateTimeNormalizer::FORMAT_KEY => 'Y.m.d|'))); - } - - /** - * @dataProvider denormalizeUsingTimezonePassedInContextProvider - */ - public function testDenormalizeUsingTimezonePassedInContext($input, $expected, $timezone, $format = null) - { - $actual = $this->normalizer->denormalize($input, \DateTimeInterface::class, null, array( - DateTimeNormalizer::TIMEZONE_KEY => $timezone, - DateTimeNormalizer::FORMAT_KEY => $format, - )); - - $this->assertEquals($expected, $actual); - } - - public function denormalizeUsingTimezonePassedInContextProvider() - { - yield 'with timezone' => array( - '2016/12/01 17:35:00', - new \DateTimeImmutable('2016/12/01 17:35:00', new \DateTimeZone('Japan')), - new \DateTimeZone('Japan'), - ); - yield 'with timezone as string' => array( - '2016/12/01 17:35:00', - new \DateTimeImmutable('2016/12/01 17:35:00', new \DateTimeZone('Japan')), - 'Japan', - ); - yield 'with format without timezone information' => array( - '2016.12.01 17:35:00', - new \DateTimeImmutable('2016/12/01 17:35:00', new \DateTimeZone('Japan')), - new \DateTimeZone('Japan'), - 'Y.m.d H:i:s', - ); - yield 'ignored with format with timezone information' => array( - '2016-12-01T17:35:00Z', - new \DateTimeImmutable('2016/12/01 17:35:00', new \DateTimeZone('UTC')), - 'Europe/Paris', - \DateTime::RFC3339, - ); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDenormalizeInvalidDataThrowsException() - { - $this->normalizer->denormalize('invalid date', \DateTimeInterface::class); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage The data is either an empty string or null, you should pass a string that can be parsed with the passed format or a valid DateTime string. - */ - public function testDenormalizeNullThrowsException() - { - $this->normalizer->denormalize(null, \DateTimeInterface::class); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage The data is either an empty string or null, you should pass a string that can be parsed with the passed format or a valid DateTime string. - */ - public function testDenormalizeEmptyStringThrowsException() - { - $this->normalizer->denormalize('', \DateTimeInterface::class); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDenormalizeFormatMismatchThrowsException() - { - $this->normalizer->denormalize('2016-01-01T00:00:00+00:00', \DateTimeInterface::class, null, array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d|')); - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php deleted file mode 100644 index 6358cd7a..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php +++ /dev/null @@ -1,841 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use Doctrine\Common\Annotations\AnnotationReader; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter; -use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; -use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Tests\Fixtures\CircularReferenceDummy; -use Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy; -use Symfony\Component\Serializer\Tests\Fixtures\SiblingHolder; -use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; -use Symfony\Component\Serializer\Tests\Fixtures\GroupDummy; - -class GetSetMethodNormalizerTest extends TestCase -{ - /** - * @var GetSetMethodNormalizer - */ - private $normalizer; - /** - * @var SerializerInterface - */ - private $serializer; - - protected function setUp() - { - $this->serializer = $this->getMockBuilder(__NAMESPACE__.'\SerializerNormalizer')->getMock(); - $this->normalizer = new GetSetMethodNormalizer(); - $this->normalizer->setSerializer($this->serializer); - } - - public function testInterface() - { - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\NormalizerInterface', $this->normalizer); - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\DenormalizerInterface', $this->normalizer); - } - - public function testNormalize() - { - $obj = new GetSetDummy(); - $object = new \stdClass(); - $obj->setFoo('foo'); - $obj->setBar('bar'); - $obj->setBaz(true); - $obj->setCamelCase('camelcase'); - $obj->setObject($object); - - $this->serializer - ->expects($this->once()) - ->method('normalize') - ->with($object, 'any') - ->will($this->returnValue('string_object')) - ; - - $this->assertEquals( - array( - 'foo' => 'foo', - 'bar' => 'bar', - 'baz' => true, - 'fooBar' => 'foobar', - 'camelCase' => 'camelcase', - 'object' => 'string_object', - ), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function testDenormalize() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar'), - __NAMESPACE__.'\GetSetDummy', - 'any' - ); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - $this->assertTrue($obj->isBaz()); - } - - public function testDenormalizeWithObject() - { - $data = new \stdClass(); - $data->foo = 'foo'; - $data->bar = 'bar'; - $data->fooBar = 'foobar'; - $obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\GetSetDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - } - - public function testDenormalizeNull() - { - $this->assertEquals(new GetSetDummy(), $this->normalizer->denormalize(null, __NAMESPACE__.'\GetSetDummy')); - } - - public function testConstructorDenormalize() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar'), - __NAMESPACE__.'\GetConstructorDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - $this->assertTrue($obj->isBaz()); - } - - public function testConstructorDenormalizeWithNullArgument() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => null, 'baz' => true), - __NAMESPACE__.'\GetConstructorDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertNull($obj->getBar()); - $this->assertTrue($obj->isBaz()); - } - - public function testConstructorDenormalizeWithMissingOptionalArgument() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'test', 'baz' => array(1, 2, 3)), - __NAMESPACE__.'\GetConstructorOptionalArgsDummy', 'any'); - $this->assertEquals('test', $obj->getFoo()); - $this->assertEquals(array(), $obj->getBar()); - $this->assertEquals(array(1, 2, 3), $obj->getBaz()); - } - - public function testConstructorDenormalizeWithOptionalDefaultArgument() - { - $obj = $this->normalizer->denormalize( - array('bar' => 'test'), - __NAMESPACE__.'\GetConstructorArgsWithDefaultValueDummy', 'any'); - $this->assertEquals(array(), $obj->getFoo()); - $this->assertEquals('test', $obj->getBar()); - } - - /** - * @requires PHP 5.6 - */ - public function testConstructorDenormalizeWithVariadicArgument() - { - $obj = $this->normalizer->denormalize( - array('foo' => array(1, 2, 3)), - 'Symfony\Component\Serializer\Tests\Fixtures\VariadicConstructorArgsDummy', 'any'); - $this->assertEquals(array(1, 2, 3), $obj->getFoo()); - } - - /** - * @requires PHP 5.6 - */ - public function testConstructorDenormalizeWithMissingVariadicArgument() - { - $obj = $this->normalizer->denormalize( - array(), - 'Symfony\Component\Serializer\Tests\Fixtures\VariadicConstructorArgsDummy', 'any'); - $this->assertEquals(array(), $obj->getFoo()); - } - - public function testConstructorWithObjectDenormalize() - { - $data = new \stdClass(); - $data->foo = 'foo'; - $data->bar = 'bar'; - $data->baz = true; - $data->fooBar = 'foobar'; - $obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\GetConstructorDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - } - - public function testConstructorWArgWithPrivateMutator() - { - $obj = $this->normalizer->denormalize(array('foo' => 'bar'), __NAMESPACE__.'\ObjectConstructorArgsWithPrivateMutatorDummy', 'any'); - $this->assertEquals('bar', $obj->getFoo()); - } - - public function testGroupsNormalize() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new GetSetMethodNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - $obj->setBar('bar'); - $obj->setFooBar('fooBar'); - $obj->setSymfony('symfony'); - $obj->setKevin('kevin'); - $obj->setCoopTilleuls('coopTilleuls'); - - $this->assertEquals(array( - 'bar' => 'bar', - ), $this->normalizer->normalize($obj, null, array(GetSetMethodNormalizer::GROUPS => array('c')))); - - $this->assertEquals(array( - 'symfony' => 'symfony', - 'foo' => 'foo', - 'fooBar' => 'fooBar', - 'bar' => 'bar', - 'kevin' => 'kevin', - 'coopTilleuls' => 'coopTilleuls', - ), $this->normalizer->normalize($obj, null, array(GetSetMethodNormalizer::GROUPS => array('a', 'c')))); - } - - public function testGroupsDenormalize() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new GetSetMethodNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - - $toNormalize = array('foo' => 'foo', 'bar' => 'bar'); - - $normalized = $this->normalizer->denormalize( - $toNormalize, - 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', - null, - array(GetSetMethodNormalizer::GROUPS => array('a')) - ); - $this->assertEquals($obj, $normalized); - - $obj->setBar('bar'); - - $normalized = $this->normalizer->denormalize( - $toNormalize, - 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', - null, - array(GetSetMethodNormalizer::GROUPS => array('a', 'b')) - ); - $this->assertEquals($obj, $normalized); - } - - public function testGroupsNormalizeWithNameConverter() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new GetSetMethodNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter()); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFooBar('@dunglas'); - $obj->setSymfony('@coopTilleuls'); - $obj->setCoopTilleuls('les-tilleuls.coop'); - - $this->assertEquals( - array( - 'bar' => null, - 'foo_bar' => '@dunglas', - 'symfony' => '@coopTilleuls', - ), - $this->normalizer->normalize($obj, null, array(GetSetMethodNormalizer::GROUPS => array('name_converter'))) - ); - } - - public function testGroupsDenormalizeWithNameConverter() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new GetSetMethodNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter()); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFooBar('@dunglas'); - $obj->setSymfony('@coopTilleuls'); - - $this->assertEquals( - $obj, - $this->normalizer->denormalize(array( - 'bar' => null, - 'foo_bar' => '@dunglas', - 'symfony' => '@coopTilleuls', - 'coop_tilleuls' => 'les-tilleuls.coop', - ), 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', null, array(GetSetMethodNormalizer::GROUPS => array('name_converter'))) - ); - } - - /** - * @dataProvider provideCallbacks - */ - public function testCallbacks($callbacks, $value, $result, $message) - { - $this->normalizer->setCallbacks($callbacks); - - $obj = new GetConstructorDummy('', $value, true); - - $this->assertEquals( - $result, - $this->normalizer->normalize($obj, 'any'), - $message - ); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testUncallableCallbacks() - { - $this->normalizer->setCallbacks(array('bar' => null)); - - $obj = new GetConstructorDummy('baz', 'quux', true); - - $this->normalizer->normalize($obj, 'any'); - } - - public function testIgnoredAttributes() - { - $this->normalizer->setIgnoredAttributes(array('foo', 'bar', 'baz', 'camelCase', 'object')); - - $obj = new GetSetDummy(); - $obj->setFoo('foo'); - $obj->setBar('bar'); - $obj->setBaz(true); - - $this->assertEquals( - array('fooBar' => 'foobar'), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function provideCallbacks() - { - return array( - array( - array( - 'bar' => function ($bar) { - return 'baz'; - }, - ), - 'baz', - array('foo' => '', 'bar' => 'baz', 'baz' => true), - 'Change a string', - ), - array( - array( - 'bar' => function ($bar) { - }, - ), - 'baz', - array('foo' => '', 'bar' => null, 'baz' => true), - 'Null an item', - ), - array( - array( - 'bar' => function ($bar) { - return $bar->format('d-m-Y H:i:s'); - }, - ), - new \DateTime('2011-09-10 06:30:00'), - array('foo' => '', 'bar' => '10-09-2011 06:30:00', 'baz' => true), - 'Format a date', - ), - array( - array( - 'bar' => function ($bars) { - $foos = ''; - foreach ($bars as $bar) { - $foos .= $bar->getFoo(); - } - - return $foos; - }, - ), - array(new GetConstructorDummy('baz', '', false), new GetConstructorDummy('quux', '', false)), - array('foo' => '', 'bar' => 'bazquux', 'baz' => true), - 'Collect a property', - ), - array( - array( - 'bar' => function ($bars) { - return count($bars); - }, - ), - array(new GetConstructorDummy('baz', '', false), new GetConstructorDummy('quux', '', false)), - array('foo' => '', 'bar' => 2, 'baz' => true), - 'Count a property', - ), - ); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\LogicException - * @expectedExceptionMessage Cannot normalize attribute "object" because the injected serializer is not a normalizer - */ - public function testUnableToNormalizeObjectAttribute() - { - $serializer = $this->getMockBuilder('Symfony\Component\Serializer\SerializerInterface')->getMock(); - $this->normalizer->setSerializer($serializer); - - $obj = new GetSetDummy(); - $object = new \stdClass(); - $obj->setObject($object); - - $this->normalizer->normalize($obj, 'any'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\CircularReferenceException - */ - public function testUnableToNormalizeCircularReference() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - $this->normalizer->setCircularReferenceLimit(2); - - $obj = new CircularReferenceDummy(); - - $this->normalizer->normalize($obj); - } - - public function testSiblingReference() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $siblingHolder = new SiblingHolder(); - - $expected = array( - 'sibling0' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - 'sibling1' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - 'sibling2' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - ); - $this->assertEquals($expected, $this->normalizer->normalize($siblingHolder)); - } - - public function testCircularReferenceHandler() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - $this->normalizer->setCircularReferenceHandler(function ($obj) { - return get_class($obj); - }); - - $obj = new CircularReferenceDummy(); - - $expected = array('me' => 'Symfony\Component\Serializer\Tests\Fixtures\CircularReferenceDummy'); - $this->assertEquals($expected, $this->normalizer->normalize($obj)); - } - - public function testObjectToPopulate() - { - $dummy = new GetSetDummy(); - $dummy->setFoo('foo'); - - $obj = $this->normalizer->denormalize( - array('bar' => 'bar'), - __NAMESPACE__.'\GetSetDummy', - null, - array(GetSetMethodNormalizer::OBJECT_TO_POPULATE => $dummy) - ); - - $this->assertEquals($dummy, $obj); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - } - - public function testDenormalizeNonExistingAttribute() - { - $this->assertEquals( - new GetSetDummy(), - $this->normalizer->denormalize(array('non_existing' => true), __NAMESPACE__.'\GetSetDummy') - ); - } - - public function testDenormalizeShouldNotSetStaticAttribute() - { - $obj = $this->normalizer->denormalize(array('staticObject' => true), __NAMESPACE__.'\GetSetDummy'); - - $this->assertEquals(new GetSetDummy(), $obj); - $this->assertNull(GetSetDummy::getStaticObject()); - } - - public function testNoTraversableSupport() - { - $this->assertFalse($this->normalizer->supportsNormalization(new \ArrayObject())); - } - - public function testNoStaticGetSetSupport() - { - $this->assertFalse($this->normalizer->supportsNormalization(new ObjectWithJustStaticSetterDummy())); - } - - public function testPrivateSetter() - { - $obj = $this->normalizer->denormalize(array('foo' => 'foobar'), __NAMESPACE__.'\ObjectWithPrivateSetterDummy'); - $this->assertEquals('bar', $obj->getFoo()); - } - - public function testHasGetterDenormalize() - { - $obj = $this->normalizer->denormalize(array('foo' => true), ObjectWithHasGetterDummy::class); - $this->assertTrue($obj->hasFoo()); - } - - public function testHasGetterNormalize() - { - $obj = new ObjectWithHasGetterDummy(); - $obj->setFoo(true); - - $this->assertEquals( - array('foo' => true), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function testMaxDepth() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new GetSetMethodNormalizer($classMetadataFactory); - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $level1 = new MaxDepthDummy(); - $level1->bar = 'level1'; - - $level2 = new MaxDepthDummy(); - $level2->bar = 'level2'; - $level1->child = $level2; - - $level3 = new MaxDepthDummy(); - $level3->bar = 'level3'; - $level2->child = $level3; - - $level4 = new MaxDepthDummy(); - $level4->bar = 'level4'; - $level3->child = $level4; - - $result = $serializer->normalize($level1, null, array(GetSetMethodNormalizer::ENABLE_MAX_DEPTH => true)); - - $expected = array( - 'bar' => 'level1', - 'child' => array( - 'bar' => 'level2', - 'child' => array( - 'bar' => 'level3', - 'child' => array( - 'child' => null, - ), - ), - ), - ); - - $this->assertEquals($expected, $result); - } -} - -class GetSetDummy -{ - protected $foo; - private $bar; - private $baz; - protected $camelCase; - protected $object; - private static $staticObject; - - public function getFoo() - { - return $this->foo; - } - - public function setFoo($foo) - { - $this->foo = $foo; - } - - public function getBar() - { - return $this->bar; - } - - public function setBar($bar) - { - $this->bar = $bar; - } - - public function isBaz() - { - return $this->baz; - } - - public function setBaz($baz) - { - $this->baz = $baz; - } - - public function getFooBar() - { - return $this->foo.$this->bar; - } - - public function getCamelCase() - { - return $this->camelCase; - } - - public function setCamelCase($camelCase) - { - $this->camelCase = $camelCase; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } - - public function setObject($object) - { - $this->object = $object; - } - - public function getObject() - { - return $this->object; - } - - public static function getStaticObject() - { - return self::$staticObject; - } - - public static function setStaticObject($object) - { - self::$staticObject = $object; - } - - protected function getPrivate() - { - throw new \RuntimeException('Dummy::getPrivate() should not be called'); - } -} - -class GetConstructorDummy -{ - protected $foo; - private $bar; - private $baz; - - public function __construct($foo, $bar, $baz) - { - $this->foo = $foo; - $this->bar = $bar; - $this->baz = $baz; - } - - public function getFoo() - { - return $this->foo; - } - - public function getBar() - { - return $this->bar; - } - - public function isBaz() - { - return $this->baz; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } -} - -abstract class SerializerNormalizer implements SerializerInterface, NormalizerInterface -{ -} - -class GetConstructorOptionalArgsDummy -{ - protected $foo; - private $bar; - private $baz; - - public function __construct($foo, $bar = array(), $baz = array()) - { - $this->foo = $foo; - $this->bar = $bar; - $this->baz = $baz; - } - - public function getFoo() - { - return $this->foo; - } - - public function getBar() - { - return $this->bar; - } - - public function getBaz() - { - return $this->baz; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } -} - -class GetConstructorArgsWithDefaultValueDummy -{ - protected $foo; - protected $bar; - - public function __construct($foo = array(), $bar) - { - $this->foo = $foo; - $this->bar = $bar; - } - - public function getFoo() - { - return $this->foo; - } - - public function getBar() - { - return $this->bar; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } -} - -class GetCamelizedDummy -{ - private $kevinDunglas; - private $fooBar; - private $bar_foo; - - public function __construct($kevinDunglas = null) - { - $this->kevinDunglas = $kevinDunglas; - } - - public function getKevinDunglas() - { - return $this->kevinDunglas; - } - - public function setFooBar($fooBar) - { - $this->fooBar = $fooBar; - } - - public function getFooBar() - { - return $this->fooBar; - } - - public function setBar_foo($bar_foo) - { - $this->bar_foo = $bar_foo; - } - - public function getBar_foo() - { - return $this->bar_foo; - } -} - -class ObjectConstructorArgsWithPrivateMutatorDummy -{ - private $foo; - - public function __construct($foo) - { - $this->setFoo($foo); - } - - public function getFoo() - { - return $this->foo; - } - - private function setFoo($foo) - { - $this->foo = $foo; - } -} - -class ObjectWithPrivateSetterDummy -{ - private $foo = 'bar'; - - public function getFoo() - { - return $this->foo; - } - - private function setFoo($foo) - { - } -} - -class ObjectWithJustStaticSetterDummy -{ - private static $foo = 'bar'; - - public static function getFoo() - { - return self::$foo; - } - - public static function setFoo($foo) - { - self::$foo = $foo; - } -} - -class ObjectWithHasGetterDummy -{ - private $foo; - - public function setFoo($foo) - { - $this->foo = $foo; - } - - public function hasFoo() - { - return $this->foo; - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php deleted file mode 100644 index 065d92b9..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/JsonSerializableNormalizerTest.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Serializer\Tests\Fixtures\JsonSerializableDummy; - -/** - * @author Fred Cox - */ -class JsonSerializableNormalizerTest extends TestCase -{ - /** - * @var JsonSerializableNormalizer - */ - private $normalizer; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject|SerializerInterface - */ - private $serializer; - - protected function setUp() - { - $this->serializer = $this->getMockBuilder(JsonSerializerNormalizer::class)->getMock(); - $this->normalizer = new JsonSerializableNormalizer(); - $this->normalizer->setSerializer($this->serializer); - } - - public function testSupportNormalization() - { - $this->assertTrue($this->normalizer->supportsNormalization(new JsonSerializableDummy())); - $this->assertFalse($this->normalizer->supportsNormalization(new \stdClass())); - } - - public function testNormalize() - { - $this->serializer - ->expects($this->once()) - ->method('normalize') - ->will($this->returnCallback(function ($data) { - $this->assertArraySubset(array('foo' => 'a', 'bar' => 'b', 'baz' => 'c'), $data); - - return 'string_object'; - })) - ; - - $this->assertEquals('string_object', $this->normalizer->normalize(new JsonSerializableDummy())); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\CircularReferenceException - */ - public function testCircularNormalize() - { - $this->normalizer->setCircularReferenceLimit(1); - - $this->serializer - ->expects($this->once()) - ->method('normalize') - ->will($this->returnCallback(function ($data, $format, $context) { - $this->normalizer->normalize($data['qux'], $format, $context); - - return 'string_object'; - })) - ; - - $this->assertEquals('string_object', $this->normalizer->normalize(new JsonSerializableDummy())); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\InvalidArgumentException - * @expectedExceptionMessage The object must implement "JsonSerializable". - */ - public function testInvalidDataThrowException() - { - $this->normalizer->normalize(new \stdClass()); - } -} - -abstract class JsonSerializerNormalizer implements SerializerInterface, NormalizerInterface -{ -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/ObjectNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/ObjectNormalizerTest.php deleted file mode 100644 index f2d389a0..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ /dev/null @@ -1,1068 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use Doctrine\Common\Annotations\AnnotationReader; -use PHPUnit\Framework\TestCase; -use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; -use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; -use Symfony\Component\PropertyInfo\PropertyInfoExtractor; -use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter; -use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; -use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; -use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; -use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Tests\Fixtures\CircularReferenceDummy; -use Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy; -use Symfony\Component\Serializer\Tests\Fixtures\SiblingHolder; -use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; -use Symfony\Component\Serializer\Tests\Fixtures\GroupDummy; - -/** - * @author Kévin Dunglas - */ -class ObjectNormalizerTest extends TestCase -{ - /** - * @var ObjectNormalizer - */ - private $normalizer; - /** - * @var SerializerInterface - */ - private $serializer; - - protected function setUp() - { - $this->serializer = $this->getMockBuilder(__NAMESPACE__.'\ObjectSerializerNormalizer')->getMock(); - $this->normalizer = new ObjectNormalizer(); - $this->normalizer->setSerializer($this->serializer); - } - - public function testNormalize() - { - $obj = new ObjectDummy(); - $object = new \stdClass(); - $obj->setFoo('foo'); - $obj->bar = 'bar'; - $obj->setBaz(true); - $obj->setCamelCase('camelcase'); - $obj->setObject($object); - - $this->serializer - ->expects($this->once()) - ->method('normalize') - ->with($object, 'any') - ->will($this->returnValue('string_object')) - ; - - $this->assertEquals( - array( - 'foo' => 'foo', - 'bar' => 'bar', - 'baz' => true, - 'fooBar' => 'foobar', - 'camelCase' => 'camelcase', - 'object' => 'string_object', - ), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function testDenormalize() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar'), - __NAMESPACE__.'\ObjectDummy', - 'any' - ); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->bar); - $this->assertTrue($obj->isBaz()); - } - - public function testDenormalizeWithObject() - { - $data = new \stdClass(); - $data->foo = 'foo'; - $data->bar = 'bar'; - $data->fooBar = 'foobar'; - $obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\ObjectDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->bar); - } - - public function testDenormalizeNull() - { - $this->assertEquals(new ObjectDummy(), $this->normalizer->denormalize(null, __NAMESPACE__.'\ObjectDummy')); - } - - public function testConstructorDenormalize() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar', 'baz' => true, 'fooBar' => 'foobar'), - __NAMESPACE__.'\ObjectConstructorDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->bar); - $this->assertTrue($obj->isBaz()); - } - - public function testConstructorDenormalizeWithNullArgument() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => null, 'baz' => true), - __NAMESPACE__.'\ObjectConstructorDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertNull($obj->bar); - $this->assertTrue($obj->isBaz()); - } - - public function testConstructorDenormalizeWithMissingOptionalArgument() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'test', 'baz' => array(1, 2, 3)), - __NAMESPACE__.'\ObjectConstructorOptionalArgsDummy', 'any'); - $this->assertEquals('test', $obj->getFoo()); - $this->assertEquals(array(), $obj->bar); - $this->assertEquals(array(1, 2, 3), $obj->getBaz()); - } - - public function testConstructorDenormalizeWithOptionalDefaultArgument() - { - $obj = $this->normalizer->denormalize( - array('bar' => 'test'), - __NAMESPACE__.'\ObjectConstructorArgsWithDefaultValueDummy', 'any'); - $this->assertEquals(array(), $obj->getFoo()); - $this->assertEquals('test', $obj->getBar()); - } - - public function testConstructorWithObjectDenormalize() - { - $data = new \stdClass(); - $data->foo = 'foo'; - $data->bar = 'bar'; - $data->baz = true; - $data->fooBar = 'foobar'; - $obj = $this->normalizer->denormalize($data, __NAMESPACE__.'\ObjectConstructorDummy', 'any'); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->bar); - } - - public function testConstructorWithObjectTypeHintDenormalize() - { - $data = array( - 'id' => 10, - 'inner' => array( - 'foo' => 'oof', - 'bar' => 'rab', - ), - ); - - $normalizer = new ObjectNormalizer(); - $serializer = new Serializer(array($normalizer)); - $normalizer->setSerializer($serializer); - - $obj = $normalizer->denormalize($data, DummyWithConstructorObject::class); - $this->assertInstanceOf(DummyWithConstructorObject::class, $obj); - $this->assertEquals(10, $obj->getId()); - $this->assertInstanceOf(ObjectInner::class, $obj->getInner()); - $this->assertEquals('oof', $obj->getInner()->foo); - $this->assertEquals('rab', $obj->getInner()->bar); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\RuntimeException - * @expectedExceptionMessage Could not determine the class of the parameter "unknown". - */ - public function testConstructorWithUnknownObjectTypeHintDenormalize() - { - $data = array( - 'id' => 10, - 'unknown' => array( - 'foo' => 'oof', - 'bar' => 'rab', - ), - ); - - $normalizer = new ObjectNormalizer(); - $serializer = new Serializer(array($normalizer)); - $normalizer->setSerializer($serializer); - - $normalizer->denormalize($data, DummyWithConstructorInexistingObject::class); - } - - public function testGroupsNormalize() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - $obj->setBar('bar'); - $obj->setFooBar('fooBar'); - $obj->setSymfony('symfony'); - $obj->setKevin('kevin'); - $obj->setCoopTilleuls('coopTilleuls'); - - $this->assertEquals(array( - 'bar' => 'bar', - ), $this->normalizer->normalize($obj, null, array(ObjectNormalizer::GROUPS => array('c')))); - - $this->assertEquals(array( - 'symfony' => 'symfony', - 'foo' => 'foo', - 'fooBar' => 'fooBar', - 'bar' => 'bar', - 'kevin' => 'kevin', - 'coopTilleuls' => 'coopTilleuls', - ), $this->normalizer->normalize($obj, null, array(ObjectNormalizer::GROUPS => array('a', 'c')))); - } - - public function testGroupsDenormalize() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - - $toNormalize = array('foo' => 'foo', 'bar' => 'bar'); - - $normalized = $this->normalizer->denormalize( - $toNormalize, - 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', - null, - array(ObjectNormalizer::GROUPS => array('a')) - ); - $this->assertEquals($obj, $normalized); - - $obj->setBar('bar'); - - $normalized = $this->normalizer->denormalize( - $toNormalize, - 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', - null, - array(ObjectNormalizer::GROUPS => array('a', 'b')) - ); - $this->assertEquals($obj, $normalized); - } - - public function testNormalizeNoPropertyInGroup() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - - $this->assertEquals(array(), $this->normalizer->normalize($obj, null, array('groups' => array('notExist')))); - } - - public function testGroupsNormalizeWithNameConverter() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter()); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFooBar('@dunglas'); - $obj->setSymfony('@coopTilleuls'); - $obj->setCoopTilleuls('les-tilleuls.coop'); - - $this->assertEquals( - array( - 'bar' => null, - 'foo_bar' => '@dunglas', - 'symfony' => '@coopTilleuls', - ), - $this->normalizer->normalize($obj, null, array(ObjectNormalizer::GROUPS => array('name_converter'))) - ); - } - - public function testGroupsDenormalizeWithNameConverter() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter()); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFooBar('@dunglas'); - $obj->setSymfony('@coopTilleuls'); - - $this->assertEquals( - $obj, - $this->normalizer->denormalize(array( - 'bar' => null, - 'foo_bar' => '@dunglas', - 'symfony' => '@coopTilleuls', - 'coop_tilleuls' => 'les-tilleuls.coop', - ), 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', null, array(ObjectNormalizer::GROUPS => array('name_converter'))) - ); - } - - /** - * @dataProvider provideCallbacks - */ - public function testCallbacks($callbacks, $value, $result, $message) - { - $this->normalizer->setCallbacks($callbacks); - - $obj = new ObjectConstructorDummy('', $value, true); - - $this->assertEquals( - $result, - $this->normalizer->normalize($obj, 'any'), - $message - ); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testUncallableCallbacks() - { - $this->normalizer->setCallbacks(array('bar' => null)); - - $obj = new ObjectConstructorDummy('baz', 'quux', true); - - $this->normalizer->normalize($obj, 'any'); - } - - public function testIgnoredAttributes() - { - $this->normalizer->setIgnoredAttributes(array('foo', 'bar', 'baz', 'camelCase', 'object')); - - $obj = new ObjectDummy(); - $obj->setFoo('foo'); - $obj->bar = 'bar'; - $obj->setBaz(true); - - $this->assertEquals( - array('fooBar' => 'foobar'), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function testIgnoredAttributesDenormalize() - { - $this->normalizer->setIgnoredAttributes(array('fooBar', 'bar', 'baz')); - - $obj = new ObjectDummy(); - $obj->setFoo('foo'); - - $this->assertEquals( - $obj, - $this->normalizer->denormalize(array('fooBar' => 'fooBar', 'foo' => 'foo', 'baz' => 'baz'), __NAMESPACE__.'\ObjectDummy') - ); - } - - public function provideCallbacks() - { - return array( - array( - array( - 'bar' => function ($bar) { - return 'baz'; - }, - ), - 'baz', - array('foo' => '', 'bar' => 'baz', 'baz' => true), - 'Change a string', - ), - array( - array( - 'bar' => function ($bar) { - return; - }, - ), - 'baz', - array('foo' => '', 'bar' => null, 'baz' => true), - 'Null an item', - ), - array( - array( - 'bar' => function ($bar) { - return $bar->format('d-m-Y H:i:s'); - }, - ), - new \DateTime('2011-09-10 06:30:00'), - array('foo' => '', 'bar' => '10-09-2011 06:30:00', 'baz' => true), - 'Format a date', - ), - array( - array( - 'bar' => function ($bars) { - $foos = ''; - foreach ($bars as $bar) { - $foos .= $bar->getFoo(); - } - - return $foos; - }, - ), - array(new ObjectConstructorDummy('baz', '', false), new ObjectConstructorDummy('quux', '', false)), - array('foo' => '', 'bar' => 'bazquux', 'baz' => true), - 'Collect a property', - ), - array( - array( - 'bar' => function ($bars) { - return count($bars); - }, - ), - array(new ObjectConstructorDummy('baz', '', false), new ObjectConstructorDummy('quux', '', false)), - array('foo' => '', 'bar' => 2, 'baz' => true), - 'Count a property', - ), - ); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\LogicException - * @expectedExceptionMessage Cannot normalize attribute "object" because the injected serializer is not a normalizer - */ - public function testUnableToNormalizeObjectAttribute() - { - $serializer = $this->getMockBuilder('Symfony\Component\Serializer\SerializerInterface')->getMock(); - $this->normalizer->setSerializer($serializer); - - $obj = new ObjectDummy(); - $object = new \stdClass(); - $obj->setObject($object); - - $this->normalizer->normalize($obj, 'any'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\CircularReferenceException - */ - public function testUnableToNormalizeCircularReference() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - $this->normalizer->setCircularReferenceLimit(2); - - $obj = new CircularReferenceDummy(); - - $this->normalizer->normalize($obj); - } - - public function testSiblingReference() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $siblingHolder = new SiblingHolder(); - - $expected = array( - 'sibling0' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - 'sibling1' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - 'sibling2' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - ); - $this->assertEquals($expected, $this->normalizer->normalize($siblingHolder)); - } - - public function testCircularReferenceHandler() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - $this->normalizer->setCircularReferenceHandler(function ($obj) { - return get_class($obj); - }); - - $obj = new CircularReferenceDummy(); - - $expected = array('me' => 'Symfony\Component\Serializer\Tests\Fixtures\CircularReferenceDummy'); - $this->assertEquals($expected, $this->normalizer->normalize($obj)); - } - - public function testDenormalizeNonExistingAttribute() - { - $this->assertEquals( - new ObjectDummy(), - $this->normalizer->denormalize(array('non_existing' => true), __NAMESPACE__.'\ObjectDummy') - ); - } - - public function testNoTraversableSupport() - { - $this->assertFalse($this->normalizer->supportsNormalization(new \ArrayObject())); - } - - public function testNormalizeStatic() - { - $this->assertEquals(array('foo' => 'K'), $this->normalizer->normalize(new ObjectWithStaticPropertiesAndMethods())); - } - - public function testNormalizeUpperCaseAttributes() - { - $this->assertEquals(array('Foo' => 'Foo', 'Bar' => 'BarBar'), $this->normalizer->normalize(new ObjectWithUpperCaseAttributeNames())); - } - - public function testNormalizeNotSerializableContext() - { - $objectDummy = new ObjectDummy(); - $expected = array( - 'foo' => null, - 'baz' => null, - 'fooBar' => '', - 'camelCase' => null, - 'object' => null, - 'bar' => null, - ); - - $this->assertEquals($expected, $this->normalizer->normalize($objectDummy, null, array('not_serializable' => function () { - }))); - } - - public function testMaxDepth() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory); - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $level1 = new MaxDepthDummy(); - $level1->foo = 'level1'; - - $level2 = new MaxDepthDummy(); - $level2->foo = 'level2'; - $level1->child = $level2; - - $level3 = new MaxDepthDummy(); - $level3->foo = 'level3'; - $level2->child = $level3; - - $result = $serializer->normalize($level1, null, array(ObjectNormalizer::ENABLE_MAX_DEPTH => true)); - - $expected = array( - 'bar' => null, - 'foo' => 'level1', - 'child' => array( - 'bar' => null, - 'foo' => 'level2', - 'child' => array( - 'bar' => null, - 'child' => null, - ), - ), - ); - - $this->assertEquals($expected, $result); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testThrowUnexpectedValueException() - { - $this->normalizer->denormalize(array('foo' => 'bar'), ObjectTypeHinted::class); - } - - public function testDenomalizeRecursive() - { - $extractor = new PropertyInfoExtractor(array(), array(new PhpDocExtractor(), new ReflectionExtractor())); - $normalizer = new ObjectNormalizer(null, null, null, $extractor); - $serializer = new Serializer(array(new ArrayDenormalizer(), new DateTimeNormalizer(), $normalizer)); - - $obj = $serializer->denormalize(array( - 'inner' => array('foo' => 'foo', 'bar' => 'bar'), - 'date' => '1988/01/21', - 'inners' => array(array('foo' => 1), array('foo' => 2)), - ), ObjectOuter::class); - - $this->assertSame('foo', $obj->getInner()->foo); - $this->assertSame('bar', $obj->getInner()->bar); - $this->assertSame('1988-01-21', $obj->getDate()->format('Y-m-d')); - $this->assertSame(1, $obj->getInners()[0]->foo); - $this->assertSame(2, $obj->getInners()[1]->foo); - } - - public function testAcceptJsonNumber() - { - $extractor = new PropertyInfoExtractor(array(), array(new PhpDocExtractor(), new ReflectionExtractor())); - $normalizer = new ObjectNormalizer(null, null, null, $extractor); - $serializer = new Serializer(array(new ArrayDenormalizer(), new DateTimeNormalizer(), $normalizer)); - - $this->assertSame(10.0, $serializer->denormalize(array('number' => 10), JsonNumber::class, 'json')->number); - $this->assertSame(10.0, $serializer->denormalize(array('number' => 10), JsonNumber::class, 'jsonld')->number); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage The type of the "date" attribute for class "Symfony\Component\Serializer\Tests\Normalizer\ObjectOuter" must be one of "DateTimeInterface" ("string" given). - */ - public function testRejectInvalidType() - { - $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); - $serializer = new Serializer(array($normalizer)); - - $serializer->denormalize(array('date' => 'foo'), ObjectOuter::class); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - * @expectedExceptionMessage The type of the key "a" must be "int" ("string" given). - */ - public function testRejectInvalidKey() - { - $extractor = new PropertyInfoExtractor(array(), array(new PhpDocExtractor(), new ReflectionExtractor())); - $normalizer = new ObjectNormalizer(null, null, null, $extractor); - $serializer = new Serializer(array(new ArrayDenormalizer(), new DateTimeNormalizer(), $normalizer)); - - $serializer->denormalize(array('inners' => array('a' => array('foo' => 1))), ObjectOuter::class); - } - - public function testDoNotRejectInvalidTypeOnDisableTypeEnforcementContextOption() - { - $extractor = new PropertyInfoExtractor(array(), array(new PhpDocExtractor())); - $normalizer = new ObjectNormalizer(null, null, null, $extractor); - $serializer = new Serializer(array($normalizer)); - $context = array(ObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true); - - $this->assertSame('foo', $serializer->denormalize(array('number' => 'foo'), JsonNumber::class, null, $context)->number); - } - - public function testExtractAttributesRespectsFormat() - { - $normalizer = new FormatAndContextAwareNormalizer(); - - $data = new ObjectDummy(); - $data->setFoo('bar'); - $data->bar = 'foo'; - - $this->assertSame(array('foo' => 'bar', 'bar' => 'foo'), $normalizer->normalize($data, 'foo_and_bar_included')); - } - - public function testExtractAttributesRespectsContext() - { - $normalizer = new FormatAndContextAwareNormalizer(); - - $data = new ObjectDummy(); - $data->setFoo('bar'); - $data->bar = 'foo'; - - $this->assertSame(array('foo' => 'bar', 'bar' => 'foo'), $normalizer->normalize($data, null, array('include_foo_and_bar' => true))); - } - - public function testAttributesContextNormalize() - { - $normalizer = new ObjectNormalizer(); - $serializer = new Serializer(array($normalizer)); - - $objectInner = new ObjectInner(); - $objectInner->foo = 'innerFoo'; - $objectInner->bar = 'innerBar'; - - $objectDummy = new ObjectDummy(); - $objectDummy->setFoo('foo'); - $objectDummy->setBaz(true); - $objectDummy->setObject($objectInner); - - $context = array('attributes' => array('foo', 'baz', 'object' => array('foo'))); - $this->assertEquals( - array( - 'foo' => 'foo', - 'baz' => true, - 'object' => array('foo' => 'innerFoo'), - ), - $serializer->normalize($objectDummy, null, $context) - ); - - $context = array('attributes' => array('foo', 'baz', 'object')); - $this->assertEquals( - array( - 'foo' => 'foo', - 'baz' => true, - 'object' => array('foo' => 'innerFoo', 'bar' => 'innerBar'), - ), - $serializer->normalize($objectDummy, null, $context) - ); - } - - public function testAttributesContextDenormalize() - { - $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); - $serializer = new Serializer(array($normalizer)); - - $objectInner = new ObjectInner(); - $objectInner->foo = 'innerFoo'; - - $objectOuter = new ObjectOuter(); - $objectOuter->bar = 'bar'; - $objectOuter->setInner($objectInner); - - $context = array('attributes' => array('bar', 'inner' => array('foo'))); - $this->assertEquals($objectOuter, $serializer->denormalize( - array( - 'foo' => 'foo', - 'bar' => 'bar', - 'date' => '2017-02-03', - 'inner' => array('foo' => 'innerFoo', 'bar' => 'innerBar'), - ), ObjectOuter::class, null, $context)); - } - - public function testAttributesContextDenormalizeConstructor() - { - $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); - $serializer = new Serializer(array($normalizer)); - - $objectInner = new ObjectInner(); - $objectInner->bar = 'bar'; - - $obj = new DummyWithConstructorObjectAndDefaultValue('a', $objectInner); - - $context = array('attributes' => array('inner' => array('bar'))); - $this->assertEquals($obj, $serializer->denormalize(array( - 'foo' => 'b', - 'inner' => array('foo' => 'foo', 'bar' => 'bar'), - ), DummyWithConstructorObjectAndDefaultValue::class, null, $context)); - } - - public function testNormalizeSameObjectWithDifferentAttributes() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new ObjectNormalizer($classMetadataFactory); - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $dummy = new ObjectOuter(); - $dummy->foo = new ObjectInner(); - $dummy->foo->foo = 'foo.foo'; - $dummy->foo->bar = 'foo.bar'; - - $dummy->bar = new ObjectInner(); - $dummy->bar->foo = 'bar.foo'; - $dummy->bar->bar = 'bar.bar'; - - $this->assertEquals(array( - 'foo' => array( - 'bar' => 'foo.bar', - ), - 'bar' => array( - 'foo' => 'bar.foo', - ), - ), $this->normalizer->normalize($dummy, 'json', array( - 'attributes' => array( - 'foo' => array('bar'), - 'bar' => array('foo'), - ), - ))); - } -} - -class ObjectDummy -{ - protected $foo; - public $bar; - private $baz; - protected $camelCase; - protected $object; - - public function getFoo() - { - return $this->foo; - } - - public function setFoo($foo) - { - $this->foo = $foo; - } - - public function isBaz() - { - return $this->baz; - } - - public function setBaz($baz) - { - $this->baz = $baz; - } - - public function getFooBar() - { - return $this->foo.$this->bar; - } - - public function getCamelCase() - { - return $this->camelCase; - } - - public function setCamelCase($camelCase) - { - $this->camelCase = $camelCase; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } - - public function setObject($object) - { - $this->object = $object; - } - - public function getObject() - { - return $this->object; - } -} - -class ObjectConstructorDummy -{ - protected $foo; - public $bar; - private $baz; - - public function __construct($foo, $bar, $baz) - { - $this->foo = $foo; - $this->bar = $bar; - $this->baz = $baz; - } - - public function getFoo() - { - return $this->foo; - } - - public function isBaz() - { - return $this->baz; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } -} - -abstract class ObjectSerializerNormalizer implements SerializerInterface, NormalizerInterface -{ -} - -class ObjectConstructorOptionalArgsDummy -{ - protected $foo; - public $bar; - private $baz; - - public function __construct($foo, $bar = array(), $baz = array()) - { - $this->foo = $foo; - $this->bar = $bar; - $this->baz = $baz; - } - - public function getFoo() - { - return $this->foo; - } - - public function getBaz() - { - return $this->baz; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } -} - -class ObjectConstructorArgsWithDefaultValueDummy -{ - protected $foo; - protected $bar; - - public function __construct($foo = array(), $bar) - { - $this->foo = $foo; - $this->bar = $bar; - } - - public function getFoo() - { - return $this->foo; - } - - public function getBar() - { - return $this->bar; - } - - public function otherMethod() - { - throw new \RuntimeException('Dummy::otherMethod() should not be called'); - } -} - -class ObjectWithStaticPropertiesAndMethods -{ - public $foo = 'K'; - public static $bar = 'A'; - - public static function getBaz() - { - return 'L'; - } -} - -class ObjectTypeHinted -{ - public function setFoo(array $f) - { - } -} - -class ObjectOuter -{ - public $foo; - public $bar; - private $inner; - private $date; - - /** - * @var ObjectInner[] - */ - private $inners; - - public function getInner() - { - return $this->inner; - } - - public function setInner(ObjectInner $inner) - { - $this->inner = $inner; - } - - public function setDate(\DateTimeInterface $date) - { - $this->date = $date; - } - - public function getDate() - { - return $this->date; - } - - public function setInners(array $inners) - { - $this->inners = $inners; - } - - public function getInners() - { - return $this->inners; - } -} - -class ObjectInner -{ - public $foo; - public $bar; -} - -class FormatAndContextAwareNormalizer extends ObjectNormalizer -{ - protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = array()) - { - if (in_array($attribute, array('foo', 'bar')) && 'foo_and_bar_included' === $format) { - return true; - } - - if (in_array($attribute, array('foo', 'bar')) && isset($context['include_foo_and_bar']) && true === $context['include_foo_and_bar']) { - return true; - } - - return false; - } -} - -class DummyWithConstructorObject -{ - private $id; - private $inner; - - public function __construct($id, ObjectInner $inner) - { - $this->id = $id; - $this->inner = $inner; - } - - public function getId() - { - return $this->id; - } - - public function getInner() - { - return $this->inner; - } -} - -class DummyWithConstructorInexistingObject -{ - public function __construct($id, Unknown $unknown) - { - } -} - -class JsonNumber -{ - /** - * @var float - */ - public $number; -} - -class DummyWithConstructorObjectAndDefaultValue -{ - private $foo; - private $inner; - - public function __construct($foo = 'a', ObjectInner $inner) - { - $this->foo = $foo; - $this->inner = $inner; - } - - public function getFoo() - { - return $this->foo; - } - - public function getInner() - { - return $this->inner; - } -} - -class ObjectWithUpperCaseAttributeNames -{ - private $Foo = 'Foo'; - public $Bar = 'BarBar'; - - public function getFoo() - { - return $this->Foo; - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/ObjectToPopulateTraitTest.php b/vendor/symfony/serializer/Tests/Normalizer/ObjectToPopulateTraitTest.php deleted file mode 100644 index def71e5d..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/ObjectToPopulateTraitTest.php +++ /dev/null @@ -1,47 +0,0 @@ -extractObjectToPopulate(ProxyDummy::class, array()); - - $this->assertNull($object); - } - - public function testExtractObjectToPopulateReturnsNullWhenNonObjectIsProvided() - { - $object = $this->extractObjectToPopulate(ProxyDummy::class, array( - 'object_to_populate' => 'not an object', - )); - - $this->assertNull($object); - } - - public function testExtractObjectToPopulateReturnsNullWhenTheClassIsNotAnInstanceOfTheProvidedClass() - { - $object = $this->extractObjectToPopulate(ProxyDummy::class, array( - 'object_to_populate' => new \stdClass(), - )); - - $this->assertNull($object); - } - - public function testExtractObjectToPopulateReturnsObjectWhenEverythingChecksOut() - { - $expected = new ProxyDummy(); - $object = $this->extractObjectToPopulate(ProxyDummy::class, array( - 'object_to_populate' => $expected, - )); - - $this->assertSame($expected, $object); - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/PropertyNormalizerTest.php b/vendor/symfony/serializer/Tests/Normalizer/PropertyNormalizerTest.php deleted file mode 100644 index 29c2127a..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/PropertyNormalizerTest.php +++ /dev/null @@ -1,525 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use Doctrine\Common\Annotations\AnnotationReader; -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; -use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; -use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter; -use Symfony\Component\Serializer\Normalizer\PropertyNormalizer; -use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Serializer\Tests\Fixtures\GroupDummy; -use Symfony\Component\Serializer\Tests\Fixtures\GroupDummyChild; -use Symfony\Component\Serializer\Tests\Fixtures\MaxDepthDummy; -use Symfony\Component\Serializer\Tests\Fixtures\PropertyCircularReferenceDummy; -use Symfony\Component\Serializer\Tests\Fixtures\PropertySiblingHolder; - -class PropertyNormalizerTest extends TestCase -{ - /** - * @var PropertyNormalizer - */ - private $normalizer; - /** - * @var SerializerInterface - */ - private $serializer; - - protected function setUp() - { - $this->serializer = $this->getMockBuilder('Symfony\Component\Serializer\SerializerInterface')->getMock(); - $this->normalizer = new PropertyNormalizer(); - $this->normalizer->setSerializer($this->serializer); - } - - public function testNormalize() - { - $obj = new PropertyDummy(); - $obj->foo = 'foo'; - $obj->setBar('bar'); - $obj->setCamelCase('camelcase'); - $this->assertEquals( - array('foo' => 'foo', 'bar' => 'bar', 'camelCase' => 'camelcase'), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function testDenormalize() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar'), - __NAMESPACE__.'\PropertyDummy', - 'any' - ); - $this->assertEquals('foo', $obj->foo); - $this->assertEquals('bar', $obj->getBar()); - } - - public function testNormalizeWithParentClass() - { - $group = new GroupDummyChild(); - $group->setBaz('baz'); - $group->setFoo('foo'); - $group->setBar('bar'); - $group->setKevin('Kevin'); - $group->setCoopTilleuls('coop'); - $this->assertEquals( - array('foo' => 'foo', 'bar' => 'bar', 'kevin' => 'Kevin', - 'coopTilleuls' => 'coop', 'fooBar' => null, 'symfony' => null, 'baz' => 'baz', ), - $this->normalizer->normalize($group, 'any') - ); - } - - public function testDenormalizeWithParentClass() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar', 'kevin' => 'Kevin', 'baz' => 'baz'), - GroupDummyChild::class, - 'any' - ); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - $this->assertEquals('Kevin', $obj->getKevin()); - $this->assertEquals('baz', $obj->getBaz()); - $this->assertNull($obj->getSymfony()); - } - - public function testConstructorDenormalize() - { - $obj = $this->normalizer->denormalize( - array('foo' => 'foo', 'bar' => 'bar'), - __NAMESPACE__.'\PropertyConstructorDummy', - 'any' - ); - $this->assertEquals('foo', $obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - } - - public function testConstructorDenormalizeWithNullArgument() - { - $obj = $this->normalizer->denormalize( - array('foo' => null, 'bar' => 'bar'), - __NAMESPACE__.'\PropertyConstructorDummy', ' - any' - ); - $this->assertNull($obj->getFoo()); - $this->assertEquals('bar', $obj->getBar()); - } - - /** - * @dataProvider provideCallbacks - */ - public function testCallbacks($callbacks, $value, $result, $message) - { - $this->normalizer->setCallbacks($callbacks); - - $obj = new PropertyConstructorDummy('', $value); - - $this->assertEquals( - $result, - $this->normalizer->normalize($obj, 'any'), - $message - ); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testUncallableCallbacks() - { - $this->normalizer->setCallbacks(array('bar' => null)); - - $obj = new PropertyConstructorDummy('baz', 'quux'); - - $this->normalizer->normalize($obj, 'any'); - } - - public function testIgnoredAttributes() - { - $this->normalizer->setIgnoredAttributes(array('foo', 'bar', 'camelCase')); - - $obj = new PropertyDummy(); - $obj->foo = 'foo'; - $obj->setBar('bar'); - - $this->assertEquals( - array(), - $this->normalizer->normalize($obj, 'any') - ); - } - - public function testGroupsNormalize() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new PropertyNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - $obj->setBar('bar'); - $obj->setFooBar('fooBar'); - $obj->setSymfony('symfony'); - $obj->setKevin('kevin'); - $obj->setCoopTilleuls('coopTilleuls'); - - $this->assertEquals(array( - 'bar' => 'bar', - ), $this->normalizer->normalize($obj, null, array(PropertyNormalizer::GROUPS => array('c')))); - - // The PropertyNormalizer is also able to hydrate properties from parent classes - $this->assertEquals(array( - 'symfony' => 'symfony', - 'foo' => 'foo', - 'fooBar' => 'fooBar', - 'bar' => 'bar', - 'kevin' => 'kevin', - 'coopTilleuls' => 'coopTilleuls', - ), $this->normalizer->normalize($obj, null, array(PropertyNormalizer::GROUPS => array('a', 'c')))); - } - - public function testGroupsDenormalize() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new PropertyNormalizer($classMetadataFactory); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFoo('foo'); - - $toNormalize = array('foo' => 'foo', 'bar' => 'bar'); - - $normalized = $this->normalizer->denormalize( - $toNormalize, - 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', - null, - array(PropertyNormalizer::GROUPS => array('a')) - ); - $this->assertEquals($obj, $normalized); - - $obj->setBar('bar'); - - $normalized = $this->normalizer->denormalize( - $toNormalize, - 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', - null, - array(PropertyNormalizer::GROUPS => array('a', 'b')) - ); - $this->assertEquals($obj, $normalized); - } - - public function testGroupsNormalizeWithNameConverter() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new PropertyNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter()); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFooBar('@dunglas'); - $obj->setSymfony('@coopTilleuls'); - $obj->setCoopTilleuls('les-tilleuls.coop'); - - $this->assertEquals( - array( - 'bar' => null, - 'foo_bar' => '@dunglas', - 'symfony' => '@coopTilleuls', - ), - $this->normalizer->normalize($obj, null, array(PropertyNormalizer::GROUPS => array('name_converter'))) - ); - } - - public function testGroupsDenormalizeWithNameConverter() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new PropertyNormalizer($classMetadataFactory, new CamelCaseToSnakeCaseNameConverter()); - $this->normalizer->setSerializer($this->serializer); - - $obj = new GroupDummy(); - $obj->setFooBar('@dunglas'); - $obj->setSymfony('@coopTilleuls'); - - $this->assertEquals( - $obj, - $this->normalizer->denormalize(array( - 'bar' => null, - 'foo_bar' => '@dunglas', - 'symfony' => '@coopTilleuls', - 'coop_tilleuls' => 'les-tilleuls.coop', - ), 'Symfony\Component\Serializer\Tests\Fixtures\GroupDummy', null, array(PropertyNormalizer::GROUPS => array('name_converter'))) - ); - } - - public function provideCallbacks() - { - return array( - array( - array( - 'bar' => function ($bar) { - return 'baz'; - }, - ), - 'baz', - array('foo' => '', 'bar' => 'baz'), - 'Change a string', - ), - array( - array( - 'bar' => function ($bar) { - return; - }, - ), - 'baz', - array('foo' => '', 'bar' => null), - 'Null an item', - ), - array( - array( - 'bar' => function ($bar) { - return $bar->format('d-m-Y H:i:s'); - }, - ), - new \DateTime('2011-09-10 06:30:00'), - array('foo' => '', 'bar' => '10-09-2011 06:30:00'), - 'Format a date', - ), - array( - array( - 'bar' => function ($bars) { - $foos = ''; - foreach ($bars as $bar) { - $foos .= $bar->getFoo(); - } - - return $foos; - }, - ), - array(new PropertyConstructorDummy('baz', ''), new PropertyConstructorDummy('quux', '')), - array('foo' => '', 'bar' => 'bazquux'), - 'Collect a property', - ), - array( - array( - 'bar' => function ($bars) { - return count($bars); - }, - ), - array(new PropertyConstructorDummy('baz', ''), new PropertyConstructorDummy('quux', '')), - array('foo' => '', 'bar' => 2), - 'Count a property', - ), - ); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\CircularReferenceException - */ - public function testUnableToNormalizeCircularReference() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - $this->normalizer->setCircularReferenceLimit(2); - - $obj = new PropertyCircularReferenceDummy(); - - $this->normalizer->normalize($obj); - } - - public function testSiblingReference() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $siblingHolder = new PropertySiblingHolder(); - - $expected = array( - 'sibling0' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - 'sibling1' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - 'sibling2' => array('coopTilleuls' => 'Les-Tilleuls.coop'), - ); - $this->assertEquals($expected, $this->normalizer->normalize($siblingHolder)); - } - - public function testCircularReferenceHandler() - { - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - $this->normalizer->setCircularReferenceHandler(function ($obj) { - return get_class($obj); - }); - - $obj = new PropertyCircularReferenceDummy(); - - $expected = array('me' => 'Symfony\Component\Serializer\Tests\Fixtures\PropertyCircularReferenceDummy'); - $this->assertEquals($expected, $this->normalizer->normalize($obj)); - } - - public function testDenormalizeNonExistingAttribute() - { - $this->assertEquals( - new PropertyDummy(), - $this->normalizer->denormalize(array('non_existing' => true), __NAMESPACE__.'\PropertyDummy') - ); - } - - public function testDenormalizeShouldIgnoreStaticProperty() - { - $obj = $this->normalizer->denormalize(array('outOfScope' => true), __NAMESPACE__.'\PropertyDummy'); - - $this->assertEquals(new PropertyDummy(), $obj); - $this->assertEquals('out_of_scope', PropertyDummy::$outOfScope); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\LogicException - * @expectedExceptionMessage Cannot normalize attribute "bar" because the injected serializer is not a normalizer - */ - public function testUnableToNormalizeObjectAttribute() - { - $serializer = $this->getMockBuilder('Symfony\Component\Serializer\SerializerInterface')->getMock(); - $this->normalizer->setSerializer($serializer); - - $obj = new PropertyDummy(); - $object = new \stdClass(); - $obj->setBar($object); - - $this->normalizer->normalize($obj, 'any'); - } - - public function testNoTraversableSupport() - { - $this->assertFalse($this->normalizer->supportsNormalization(new \ArrayObject())); - } - - public function testNoStaticPropertySupport() - { - $this->assertFalse($this->normalizer->supportsNormalization(new StaticPropertyDummy())); - } - - public function testMaxDepth() - { - $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); - $this->normalizer = new PropertyNormalizer($classMetadataFactory); - $serializer = new Serializer(array($this->normalizer)); - $this->normalizer->setSerializer($serializer); - - $level1 = new MaxDepthDummy(); - $level1->foo = 'level1'; - - $level2 = new MaxDepthDummy(); - $level2->foo = 'level2'; - $level1->child = $level2; - - $level3 = new MaxDepthDummy(); - $level3->foo = 'level3'; - $level2->child = $level3; - - $result = $serializer->normalize($level1, null, array(PropertyNormalizer::ENABLE_MAX_DEPTH => true)); - - $expected = array( - 'foo' => 'level1', - 'child' => array( - 'foo' => 'level2', - 'child' => array( - 'child' => null, - 'bar' => null, - ), - 'bar' => null, - ), - 'bar' => null, - ); - - $this->assertEquals($expected, $result); - } - - public function testInheritedPropertiesSupport() - { - $this->assertTrue($this->normalizer->supportsNormalization(new PropertyChildDummy())); - } -} - -class PropertyDummy -{ - public static $outOfScope = 'out_of_scope'; - public $foo; - private $bar; - protected $camelCase; - - public function getBar() - { - return $this->bar; - } - - public function setBar($bar) - { - $this->bar = $bar; - } - - public function getCamelCase() - { - return $this->camelCase; - } - - public function setCamelCase($camelCase) - { - $this->camelCase = $camelCase; - } -} - -class PropertyConstructorDummy -{ - protected $foo; - private $bar; - - public function __construct($foo, $bar) - { - $this->foo = $foo; - $this->bar = $bar; - } - - public function getFoo() - { - return $this->foo; - } - - public function getBar() - { - return $this->bar; - } -} - -class PropertyCamelizedDummy -{ - private $kevinDunglas; - public $fooBar; - public $bar_foo; - - public function __construct($kevinDunglas = null) - { - $this->kevinDunglas = $kevinDunglas; - } -} - -class StaticPropertyDummy -{ - private static $property = 'value'; -} - -class PropertyParentDummy -{ - private $foo = 'bar'; -} - -class PropertyChildDummy extends PropertyParentDummy -{ -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/TestDenormalizer.php b/vendor/symfony/serializer/Tests/Normalizer/TestDenormalizer.php deleted file mode 100644 index 7525d5c9..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/TestDenormalizer.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; - -/** - * Provides a test Normalizer which only implements the DenormalizerInterface. - * - * @author Lin Clark - */ -class TestDenormalizer implements DenormalizerInterface -{ - /** - * {@inheritdoc} - */ - public function denormalize($data, $class, $format = null, array $context = array()) - { - } - - /** - * {@inheritdoc} - */ - public function supportsDenormalization($data, $type, $format = null) - { - return true; - } -} diff --git a/vendor/symfony/serializer/Tests/Normalizer/TestNormalizer.php b/vendor/symfony/serializer/Tests/Normalizer/TestNormalizer.php deleted file mode 100644 index 4b29e8fa..00000000 --- a/vendor/symfony/serializer/Tests/Normalizer/TestNormalizer.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests\Normalizer; - -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; - -/** - * Provides a test Normalizer which only implements the NormalizerInterface. - * - * @author Lin Clark - */ -class TestNormalizer implements NormalizerInterface -{ - /** - * {@inheritdoc} - */ - public function normalize($object, $format = null, array $context = array()) - { - } - - /** - * {@inheritdoc} - */ - public function supportsNormalization($data, $format = null) - { - return true; - } -} diff --git a/vendor/symfony/serializer/Tests/SerializerTest.php b/vendor/symfony/serializer/Tests/SerializerTest.php deleted file mode 100644 index f7f8594c..00000000 --- a/vendor/symfony/serializer/Tests/SerializerTest.php +++ /dev/null @@ -1,413 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Serializer\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer; -use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface; -use Symfony\Component\Serializer\Normalizer\DenormalizerInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; -use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; -use Symfony\Component\Serializer\Normalizer\PropertyNormalizer; -use Symfony\Component\Serializer\Serializer; -use Symfony\Component\Serializer\Encoder\JsonEncoder; -use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; -use Symfony\Component\Serializer\Normalizer\CustomNormalizer; -use Symfony\Component\Serializer\Tests\Fixtures\TraversableDummy; -use Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy; -use Symfony\Component\Serializer\Tests\Normalizer\TestNormalizer; -use Symfony\Component\Serializer\Tests\Normalizer\TestDenormalizer; - -class SerializerTest extends TestCase -{ - public function testInterface() - { - $serializer = new Serializer(); - - $this->assertInstanceOf('Symfony\Component\Serializer\SerializerInterface', $serializer); - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\NormalizerInterface', $serializer); - $this->assertInstanceOf('Symfony\Component\Serializer\Normalizer\DenormalizerInterface', $serializer); - $this->assertInstanceOf('Symfony\Component\Serializer\Encoder\EncoderInterface', $serializer); - $this->assertInstanceOf('Symfony\Component\Serializer\Encoder\DecoderInterface', $serializer); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testNormalizeNoMatch() - { - $serializer = new Serializer(array($this->getMockBuilder('Symfony\Component\Serializer\Normalizer\CustomNormalizer')->getMock())); - $serializer->normalize(new \stdClass(), 'xml'); - } - - public function testNormalizeTraversable() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $result = $serializer->serialize(new TraversableDummy(), 'json'); - $this->assertEquals('{"foo":"foo","bar":"bar"}', $result); - } - - public function testNormalizeGivesPriorityToInterfaceOverTraversable() - { - $serializer = new Serializer(array(new CustomNormalizer()), array('json' => new JsonEncoder())); - $result = $serializer->serialize(new NormalizableTraversableDummy(), 'json'); - $this->assertEquals('{"foo":"normalizedFoo","bar":"normalizedBar"}', $result); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testNormalizeOnDenormalizer() - { - $serializer = new Serializer(array(new TestDenormalizer()), array()); - $this->assertTrue($serializer->normalize(new \stdClass(), 'json')); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDenormalizeNoMatch() - { - $serializer = new Serializer(array($this->getMockBuilder('Symfony\Component\Serializer\Normalizer\CustomNormalizer')->getMock())); - $serializer->denormalize('foo', 'stdClass'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDenormalizeOnNormalizer() - { - $serializer = new Serializer(array(new TestNormalizer()), array()); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $this->assertTrue($serializer->denormalize(json_encode($data), 'stdClass', 'json')); - } - - public function testCustomNormalizerCanNormalizeCollectionsAndScalar() - { - $serializer = new Serializer(array(new TestNormalizer()), array()); - $this->assertNull($serializer->normalize(array('a', 'b'))); - $this->assertNull($serializer->normalize(new \ArrayObject(array('c', 'd')))); - $this->assertNull($serializer->normalize(array())); - $this->assertNull($serializer->normalize('test')); - } - - public function testNormalizeWithSupportOnData() - { - $normalizer1 = $this->getMockBuilder('Symfony\Component\Serializer\Normalizer\NormalizerInterface')->getMock(); - $normalizer1->method('supportsNormalization') - ->willReturnCallback(function ($data, $format) { - return isset($data->test); - }); - $normalizer1->method('normalize')->willReturn('test1'); - - $normalizer2 = $this->getMockBuilder('Symfony\Component\Serializer\Normalizer\NormalizerInterface')->getMock(); - $normalizer2->method('supportsNormalization') - ->willReturn(true); - $normalizer2->method('normalize')->willReturn('test2'); - - $serializer = new Serializer(array($normalizer1, $normalizer2)); - - $data = new \stdClass(); - $data->test = true; - $this->assertEquals('test1', $serializer->normalize($data)); - - $this->assertEquals('test2', $serializer->normalize(new \stdClass())); - } - - public function testDenormalizeWithSupportOnData() - { - $denormalizer1 = $this->getMockBuilder('Symfony\Component\Serializer\Normalizer\DenormalizerInterface')->getMock(); - $denormalizer1->method('supportsDenormalization') - ->willReturnCallback(function ($data, $type, $format) { - return isset($data['test1']); - }); - $denormalizer1->method('denormalize')->willReturn('test1'); - - $denormalizer2 = $this->getMockBuilder('Symfony\Component\Serializer\Normalizer\DenormalizerInterface')->getMock(); - $denormalizer2->method('supportsDenormalization') - ->willReturn(true); - $denormalizer2->method('denormalize')->willReturn('test2'); - - $serializer = new Serializer(array($denormalizer1, $denormalizer2)); - - $this->assertEquals('test1', $serializer->denormalize(array('test1' => true), 'test')); - - $this->assertEquals('test2', $serializer->denormalize(array(), 'test')); - } - - public function testSerialize() - { - $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new JsonEncoder())); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $result = $serializer->serialize(Model::fromArray($data), 'json'); - $this->assertEquals(json_encode($data), $result); - } - - public function testSerializeScalar() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $result = $serializer->serialize('foo', 'json'); - $this->assertEquals('"foo"', $result); - } - - public function testSerializeArrayOfScalars() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $data = array('foo', array(5, 3)); - $result = $serializer->serialize($data, 'json'); - $this->assertEquals(json_encode($data), $result); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testSerializeNoEncoder() - { - $serializer = new Serializer(array(), array()); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $serializer->serialize($data, 'json'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\LogicException - */ - public function testSerializeNoNormalizer() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $serializer->serialize(Model::fromArray($data), 'json'); - } - - public function testDeserialize() - { - $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new JsonEncoder())); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $result = $serializer->deserialize(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json'); - $this->assertEquals($data, $result->toArray()); - } - - public function testDeserializeUseCache() - { - $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new JsonEncoder())); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $serializer->deserialize(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json'); - $data = array('title' => 'bar', 'numbers' => array(2, 8)); - $result = $serializer->deserialize(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json'); - $this->assertEquals($data, $result->toArray()); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\LogicException - */ - public function testDeserializeNoNormalizer() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $serializer->deserialize(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDeserializeWrongNormalizer() - { - $serializer = new Serializer(array(new CustomNormalizer()), array('json' => new JsonEncoder())); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $serializer->deserialize(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json'); - } - - /** - * @expectedException \Symfony\Component\Serializer\Exception\UnexpectedValueException - */ - public function testDeserializeNoEncoder() - { - $serializer = new Serializer(array(), array()); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $serializer->deserialize(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json'); - } - - public function testDeserializeSupported() - { - $serializer = new Serializer(array(new GetSetMethodNormalizer()), array()); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $this->assertTrue($serializer->supportsDenormalization(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json')); - } - - public function testDeserializeNotSupported() - { - $serializer = new Serializer(array(new GetSetMethodNormalizer()), array()); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $this->assertFalse($serializer->supportsDenormalization(json_encode($data), 'stdClass', 'json')); - } - - public function testDeserializeNotSupportedMissing() - { - $serializer = new Serializer(array(), array()); - $data = array('title' => 'foo', 'numbers' => array(5, 3)); - $this->assertFalse($serializer->supportsDenormalization(json_encode($data), '\Symfony\Component\Serializer\Tests\Model', 'json')); - } - - public function testEncode() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $data = array('foo', array(5, 3)); - $result = $serializer->encode($data, 'json'); - $this->assertEquals(json_encode($data), $result); - } - - public function testDecode() - { - $serializer = new Serializer(array(), array('json' => new JsonEncoder())); - $data = array('foo', array(5, 3)); - $result = $serializer->decode(json_encode($data), 'json'); - $this->assertEquals($data, $result); - } - - public function testSupportsArrayDeserialization() - { - $serializer = new Serializer( - array( - new GetSetMethodNormalizer(), - new PropertyNormalizer(), - new ObjectNormalizer(), - new CustomNormalizer(), - new ArrayDenormalizer(), - ), - array( - 'json' => new JsonEncoder(), - ) - ); - - $this->assertTrue( - $serializer->supportsDenormalization(array(), __NAMESPACE__.'\Model[]', 'json') - ); - } - - public function testDeserializeArray() - { - $jsonData = '[{"title":"foo","numbers":[5,3]},{"title":"bar","numbers":[2,8]}]'; - - $expectedData = array( - Model::fromArray(array('title' => 'foo', 'numbers' => array(5, 3))), - Model::fromArray(array('title' => 'bar', 'numbers' => array(2, 8))), - ); - - $serializer = new Serializer( - array( - new GetSetMethodNormalizer(), - new ArrayDenormalizer(), - ), - array( - 'json' => new JsonEncoder(), - ) - ); - - $this->assertEquals( - $expectedData, - $serializer->deserialize($jsonData, __NAMESPACE__.'\Model[]', 'json') - ); - } - - public function testNormalizerAware() - { - $normalizerAware = $this->getMockBuilder(NormalizerAwareInterface::class)->getMock(); - $normalizerAware->expects($this->once()) - ->method('setNormalizer') - ->with($this->isInstanceOf(NormalizerInterface::class)); - - new Serializer(array($normalizerAware)); - } - - public function testDenormalizerAware() - { - $denormalizerAware = $this->getMockBuilder(DenormalizerAwareInterface::class)->getMock(); - $denormalizerAware->expects($this->once()) - ->method('setDenormalizer') - ->with($this->isInstanceOf(DenormalizerInterface::class)); - - new Serializer(array($denormalizerAware)); - } - - public function testDeserializeObjectConstructorWithObjectTypeHint() - { - $jsonData = '{"bar":{"value":"baz"}}'; - - $serializer = new Serializer(array(new ObjectNormalizer()), array('json' => new JsonEncoder())); - - $this->assertEquals(new Foo(new Bar('baz')), $serializer->deserialize($jsonData, Foo::class, 'json')); - } -} - -class Model -{ - private $title; - private $numbers; - - public static function fromArray($array) - { - $model = new self(); - if (isset($array['title'])) { - $model->setTitle($array['title']); - } - if (isset($array['numbers'])) { - $model->setNumbers($array['numbers']); - } - - return $model; - } - - public function getTitle() - { - return $this->title; - } - - public function setTitle($title) - { - $this->title = $title; - } - - public function getNumbers() - { - return $this->numbers; - } - - public function setNumbers($numbers) - { - $this->numbers = $numbers; - } - - public function toArray() - { - return array('title' => $this->title, 'numbers' => $this->numbers); - } -} - -class Foo -{ - private $bar; - - public function __construct(Bar $bar) - { - $this->bar = $bar; - } -} - -class Bar -{ - private $value; - - public function __construct($value) - { - $this->value = $value; - } -} diff --git a/vendor/symfony/serializer/composer.json b/vendor/symfony/serializer/composer.json index e25b4b0a..82f4511d 100644 --- a/vendor/symfony/serializer/composer.json +++ b/vendor/symfony/serializer/composer.json @@ -16,25 +16,29 @@ } ], "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=7.1.3", + "symfony/polyfill-ctype": "~1.8" }, "require-dev": { - "symfony/yaml": "~3.4|~4.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/property-access": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/cache": "~3.1|~4.0", - "symfony/property-info": "~3.1|~4.0", "doctrine/annotations": "~1.0", - "symfony/dependency-injection": "~3.2|~4.0", "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0" + "phpdocumentor/reflection-docblock": "^3.2|^4.0", + "symfony/cache": "^3.4|^4.0|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4.13|~4.0|^5.0", + "symfony/validator": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" }, "conflict": { "phpdocumentor/type-resolver": "<0.2.1", - "symfony/dependency-injection": "<3.2", - "symfony/property-access": ">=3.0,<3.0.4|>=2.8,<2.8.4", - "symfony/property-info": "<3.1", + "symfony/dependency-injection": "<3.4", + "symfony/property-access": "<3.4", + "symfony/property-info": "<3.4", "symfony/yaml": "<3.4" }, "suggest": { @@ -43,7 +47,7 @@ "symfony/yaml": "For using the default YAML mapping loader.", "symfony/config": "For using the XML mapping loader.", "symfony/property-access": "For using the ObjectNormalizer.", - "symfony/http-foundation": "To use the DataUriNormalizer.", + "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", "doctrine/cache": "For using the default cached annotation reader and metadata cache." }, @@ -53,10 +57,5 @@ "/Tests/" ] }, - "minimum-stability": "dev", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - } + "minimum-stability": "dev" } diff --git a/vendor/symfony/serializer/phpunit.xml.dist b/vendor/symfony/serializer/phpunit.xml.dist deleted file mode 100644 index ce9af71d..00000000 --- a/vendor/symfony/serializer/phpunit.xml.dist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - ./Tests/ - - - - - - ./ - - ./Tests - ./vendor - - - - diff --git a/vendor/webmozart/assert/.composer-auth.json b/vendor/webmozart/assert/.composer-auth.json deleted file mode 100644 index eea80018..00000000 --- a/vendor/webmozart/assert/.composer-auth.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "github-oauth": { - "github.com": "PLEASE DO NOT USE THIS TOKEN IN YOUR OWN PROJECTS/FORKS", - "github.com": "This token is reserved for testing the webmozart/* repositories", - "github.com": "a9debbffdd953ee9b3b82dbc3b807cde2086bb86" - } -} diff --git a/vendor/webmozart/assert/.editorconfig b/vendor/webmozart/assert/.editorconfig new file mode 100644 index 00000000..384453bf --- /dev/null +++ b/vendor/webmozart/assert/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset=utf-8 +end_of_line=lf +trim_trailing_whitespace=true +insert_final_newline=true +indent_style=space +indent_size=4 + +[*.yml] +indent_size=2 diff --git a/vendor/webmozart/assert/.styleci.yml b/vendor/webmozart/assert/.styleci.yml deleted file mode 100644 index c2ad4a57..00000000 --- a/vendor/webmozart/assert/.styleci.yml +++ /dev/null @@ -1,11 +0,0 @@ -preset: symfony - -finder: - exclude: - - "tests" - -enabled: - - ordered_use - -disabled: - - phpdoc_annotation_without_dot # This is still buggy: https://github.com/symfony/symfony/pull/19198 diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md index 65fbc8f7..1d379277 100644 --- a/vendor/webmozart/assert/CHANGELOG.md +++ b/vendor/webmozart/assert/CHANGELOG.md @@ -3,7 +3,125 @@ Changelog ## UNRELEASED -### Added +## 1.9.1 + +## Fixed + +* provisional support for PHP 8.0 + +## 1.9.0 + +* added better Psalm support for `all*` & `nullOr*` methods + * These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this +* added `@psalm-pure` annotation to `Assert::notFalse()` +* added more `@psalm-assert` annotations where appropriate + +## Changed + +* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. +This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this +for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since +version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. +If you do not use PHPStan than this does not matter. + +## 1.8.0 + +### Added + +* added `Assert::notStartsWith()` +* added `Assert::notEndsWith()` +* added `Assert::inArray()` +* added `@psalm-pure` annotations to pure assertions + +### Fixed + +* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. +* Custom Exception messages for `Assert::count()` now use the values to render the exception message. + +## 1.7.0 (2020-02-14) + +### Added + +* added `Assert::notFalse()` +* added `Assert::isAOf()` +* added `Assert::isAnyOf()` +* added `Assert::isNotA()` + +## 1.6.0 (2019-11-24) + +### Added + +* added `Assert::validArrayKey()` +* added `Assert::isNonEmptyList()` +* added `Assert::isNonEmptyMap()` +* added `@throws InvalidArgumentException` annotations to all methods that throw. +* added `@psalm-assert` for the list type to the `isList` assertion. + +### Fixed + +* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. +They are countable, without implementing the `Countable` interface. +* The doc block of `range` now has the proper variables. +* An empty array will now pass `isList` and `isMap`. As it is a valid form of both. +If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. + +### Changed + +* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: + * [#144](https://github.com/webmozart/assert/pull/144) + * [#145](https://github.com/webmozart/assert/issues/145) + * [#146](https://github.com/webmozart/assert/pull/146) + * [#150](https://github.com/webmozart/assert/pull/150) +* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. +If you don't use Psalm, then this has no impact. + +## 1.5.0 (2019-08-24) + +### Added + +* added `Assert::uniqueValues()` +* added `Assert::unicodeLetters()` +* added: `Assert::email()` +* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. + +### Fixed + +* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. +* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. + +**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. + +### Changed + +* The names of some variables have been updated to better reflect what they are. +* All function calls are now in their FQN form, slightly increasing performance. +* Tests are now properly ran against HHVM-3.30 and PHP nightly. + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. + +## 1.4.0 (2018-12-25) + +### Added + +* added `Assert::ip()` +* added `Assert::ipv4()` +* added `Assert::ipv6()` +* added `Assert::notRegex()` +* added `Assert::interfaceExists()` +* added `Assert::isList()` +* added `Assert::isMap()` +* added polyfill for ctype + +### Fixed + +* Special case when comparing objects implementing `__toString()` + +## 1.3.0 (2018-01-29) + +### Added * added `Assert::minCount()` * added `Assert::maxCount()` @@ -20,6 +138,10 @@ Changelog * `stringNotEmpty` will no longer report "0" is an empty string +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + ## 1.2.0 (2016-11-23) * added `Assert::throws()` diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md index 1c1ede7d..1407a9a1 100644 --- a/vendor/webmozart/assert/README.md +++ b/vendor/webmozart/assert/README.md @@ -3,19 +3,15 @@ Webmozart Assert [![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=master)](https://travis-ci.org/webmozart/assert) [![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master) +[![Code Coverage](https://scrutinizer-ci.com/g/webmozart/assert/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/webmozart/assert/?branch=master) [![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) [![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) -[![Dependency Status](https://www.versioneye.com/php/webmozart:assert/1.2.0/badge.svg)](https://www.versioneye.com/php/webmozart:assert/1.2.0) - -Latest release: [1.2.0](https://packagist.org/packages/webmozart/assert#1.2.0) - -PHP >= 5.3.9 This library contains efficient assertions to test the input and output of your methods. With these assertions, you can greatly reduce the amount of coding needed to write a safe implementation. -All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if +All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if they fail. FAQ @@ -27,21 +23,21 @@ This library is heavily inspired by Benjamin Eberlei's wonderful [assert package but fixes a usability issue with error messages that can't be fixed there without breaking backwards compatibility. -This package features usable error messages by default. However, you can also +This package features usable error messages by default. However, you can also easily write custom error messages: ``` Assert::string($path, 'The path is expected to be a string. Got: %s'); ``` -In [beberlei/assert], the ordering of the `%s` placeholders is different for -every assertion. This package, on the contrary, provides consistent placeholder +In [beberlei/assert], the ordering of the `%s` placeholders is different for +every assertion. This package, on the contrary, provides consistent placeholder ordering for all assertions: * `%s`: The tested value as string, e.g. `"/foo/bar"`. * `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the minimum/maximum length, allowed values, etc. - + Check the source code of the assertions to find out details about the additional available placeholders. @@ -74,11 +70,11 @@ If you create an employee with an invalid ID, an exception is thrown: ```php new Employee('foobar'); -// => InvalidArgumentException: +// => InvalidArgumentException: // The employee ID must be an integer. Got: string new Employee(-10); -// => InvalidArgumentException: +// => InvalidArgumentException: // The employee ID must be a positive integer. Got: -10 ``` @@ -108,16 +104,21 @@ Method | Description `isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` `isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` `isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class -`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` a at least one class on the array of classes +`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes `notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class +`isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents +`isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents +`isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents `isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array +`uniqueValues($values, $message = '')` | Check that the given array contains unique values ### Comparison Assertions Method | Description ------------------------------------------------ | -------------------------------------------------- +----------------------------------------------- | ------------------------------------------------------------------ `true($value, $message = '')` | Check that a value is `true` `false($value, $message = '')` | Check that a value is `false` +`notFalse($value, $message = '')` | Check that a value is not `false` `null($value, $message = '')` | Check that a value is `null` `notNull($value, $message = '')` | Check that a value is not `null` `isEmpty($value, $message = '')` | Check that a value is `empty()` @@ -131,7 +132,8 @@ Method | Description `lessThan($value, $value2, $message = '')` | Check that a value is less than another `lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another `range($value, $min, $max, $message = '')` | Check that a value is within a range -`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values +`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values +`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) ### String Assertions @@ -141,11 +143,15 @@ any of the following assertions. Method | Description --------------------------------------------------- | ----------------------------------------------------------------- `contains($value, $subString, $message = '')` | Check that a string contains a substring -`notContains($value, $subString, $message = '')` | Check that a string does not contains a substring +`notContains($value, $subString, $message = '')` | Check that a string does not contain a substring `startsWith($value, $prefix, $message = '')` | Check that a string has a prefix +`notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix `startsWithLetter($value, $message = '')` | Check that a string starts with a letter `endsWith($value, $suffix, $message = '')` | Check that a string has a suffix +`notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix `regex($value, $pattern, $message = '')` | Check that a string matches a regular expression +`notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression +`unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only `alpha($value, $message = '')` | Check that a string contains letters only `digits($value, $message = '')` | Check that a string contains digits only `alnum($value, $message = '')` | Check that a string contains letters and digits only @@ -156,6 +162,10 @@ Method | Description `maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters `lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range `uuid($value, $message = '')` | Check that a string is a valid UUID +`ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) +`ipv4($value, $message = '')` | Check that a string is a valid IPv4 +`ipv6($value, $message = '')` | Check that a string is a valid IPv6 +`email($value, $message = '')` | Check that a string is a valid e-mail address `notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character ### File Assertions @@ -174,6 +184,7 @@ Method | Description ----------------------------------------------------- | -------------------------------------------------- `classExists($value, $message = '')` | Check that a value is an existing class name `subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another +`interfaceExists($value, $message = '')` | Check that a value is an existing interface name `implementsInterface($value, $class, $message = '')` | Check that a class implements an interface `propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object `propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object @@ -186,10 +197,15 @@ Method | Description -------------------------------------------------- | ------------------------------------------------------------------ `keyExists($array, $key, $message = '')` | Check that a key exists in an array `keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array +`validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) `count($array, $number, $message = '')` | Check that an array contains a specific number of elements `minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements `maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements `countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range +`isList($array, $message = '')` | Check that an array is a non-associative list +`isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty +`isMap($array, $message = '')` | Check that an array is associative and has strings as keys +`isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty ### Function Assertions @@ -215,6 +231,27 @@ assertion only if it the value is not `null`: Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); ``` +### Extending Assert + +The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to +add your own assertions. + +#### Overriding methods + +Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: + +* `public static function __callStatic($name, $arguments)` + * This method is used to 'create' the `nullOr` and `all` versions of the assertions. +* `protected static function valueToString($value)` + * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. +* `protected static function typeToString($value)` + * This method is used for error messages, to convert the a value to a string representing its type. +* `protected static function strlen($value)` + * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. +* `protected static function reportInvalidArgument($message)` + * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. + + Authors ------- @@ -229,12 +266,6 @@ Contributions to the package are always welcome! * Report any bugs or issues you find on the [issue tracker]. * You can grab the source code at the package's [Git repository]. -Support -------- - -If you are having problems, send a mail to bschussek@gmail.com or shout out to -[@webmozart] on Twitter. - License ------- @@ -243,7 +274,7 @@ All contents of this package are licensed under the [MIT license]. [beberlei/assert]: https://github.com/beberlei/assert [assert package]: https://github.com/beberlei/assert [Composer]: https://getcomposer.org -[Bernhard Schussek]: http://webmozarts.com +[Bernhard Schussek]: https://webmozarts.com [The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors [issue tracker]: https://github.com/webmozart/assert/issues [Git repository]: https://github.com/webmozart/assert diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json index c49e623a..2e609b63 100644 --- a/vendor/webmozart/assert/composer.json +++ b/vendor/webmozart/assert/composer.json @@ -1,7 +1,11 @@ { "name": "webmozart/assert", "description": "Assertions to validate method input/output with nice error messages.", - "keywords": ["assert", "check", "validate"], + "keywords": [ + "assert", + "check", + "validate" + ], "license": "MIT", "authors": [ { @@ -10,11 +14,15 @@ } ], "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "conflict": { + "vimeo/psalm": "<3.9.1", + "phpstan/phpstan": "<0.12.20" }, "autoload": { "psr-4": { @@ -23,12 +31,8 @@ }, "autoload-dev": { "psr-4": { - "Webmozart\\Assert\\Tests\\": "tests/" - } - }, - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" + "Webmozart\\Assert\\Tests\\": "tests/", + "Webmozart\\Assert\\Bin\\": "bin/src" } } } diff --git a/vendor/webmozart/assert/psalm.xml b/vendor/webmozart/assert/psalm.xml new file mode 100644 index 00000000..9a430081 --- /dev/null +++ b/vendor/webmozart/assert/psalm.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php index e2f89c0b..b28e1784 100644 --- a/vendor/webmozart/assert/src/Assert.php +++ b/vendor/webmozart/assert/src/Assert.php @@ -15,150 +15,19 @@ use BadMethodCallException; use Closure; use Countable; +use DateTime; +use DateTimeImmutable; use Exception; use InvalidArgumentException; +use ResourceBundle; +use SimpleXMLElement; use Throwable; use Traversable; /** * Efficient assertions to validate the input/output of your methods. * - * @method static void nullOrString($value, $message = '') - * @method static void nullOrStringNotEmpty($value, $message = '') - * @method static void nullOrInteger($value, $message = '') - * @method static void nullOrIntegerish($value, $message = '') - * @method static void nullOrFloat($value, $message = '') - * @method static void nullOrNumeric($value, $message = '') - * @method static void nullOrBoolean($value, $message = '') - * @method static void nullOrScalar($value, $message = '') - * @method static void nullOrObject($value, $message = '') - * @method static void nullOrResource($value, $type = null, $message = '') - * @method static void nullOrIsCallable($value, $message = '') - * @method static void nullOrIsArray($value, $message = '') - * @method static void nullOrIsTraversable($value, $message = '') - * @method static void nullOrIsArrayAccessible($value, $message = '') - * @method static void nullOrIsCountable($value, $message = '') - * @method static void nullOrIsInstanceOf($value, $class, $message = '') - * @method static void nullOrNotInstanceOf($value, $class, $message = '') - * @method static void nullOrIsInstanceOfAny($value, $classes, $message = '') - * @method static void nullOrIsEmpty($value, $message = '') - * @method static void nullOrNotEmpty($value, $message = '') - * @method static void nullOrTrue($value, $message = '') - * @method static void nullOrFalse($value, $message = '') - * @method static void nullOrEq($value, $value2, $message = '') - * @method static void nullOrNotEq($value,$value2, $message = '') - * @method static void nullOrSame($value, $value2, $message = '') - * @method static void nullOrNotSame($value, $value2, $message = '') - * @method static void nullOrGreaterThan($value, $value2, $message = '') - * @method static void nullOrGreaterThanEq($value, $value2, $message = '') - * @method static void nullOrLessThan($value, $value2, $message = '') - * @method static void nullOrLessThanEq($value, $value2, $message = '') - * @method static void nullOrRange($value, $min, $max, $message = '') - * @method static void nullOrOneOf($value, $values, $message = '') - * @method static void nullOrContains($value, $subString, $message = '') - * @method static void nullOrNotContains($value, $subString, $message = '') - * @method static void nullOrNotWhitespaceOnly($value, $message = '') - * @method static void nullOrStartsWith($value, $prefix, $message = '') - * @method static void nullOrStartsWithLetter($value, $message = '') - * @method static void nullOrEndsWith($value, $suffix, $message = '') - * @method static void nullOrRegex($value, $pattern, $message = '') - * @method static void nullOrAlpha($value, $message = '') - * @method static void nullOrDigits($value, $message = '') - * @method static void nullOrAlnum($value, $message = '') - * @method static void nullOrLower($value, $message = '') - * @method static void nullOrUpper($value, $message = '') - * @method static void nullOrLength($value, $length, $message = '') - * @method static void nullOrMinLength($value, $min, $message = '') - * @method static void nullOrMaxLength($value, $max, $message = '') - * @method static void nullOrLengthBetween($value, $min, $max, $message = '') - * @method static void nullOrFileExists($value, $message = '') - * @method static void nullOrFile($value, $message = '') - * @method static void nullOrDirectory($value, $message = '') - * @method static void nullOrReadable($value, $message = '') - * @method static void nullOrWritable($value, $message = '') - * @method static void nullOrClassExists($value, $message = '') - * @method static void nullOrSubclassOf($value, $class, $message = '') - * @method static void nullOrImplementsInterface($value, $interface, $message = '') - * @method static void nullOrPropertyExists($value, $property, $message = '') - * @method static void nullOrPropertyNotExists($value, $property, $message = '') - * @method static void nullOrMethodExists($value, $method, $message = '') - * @method static void nullOrMethodNotExists($value, $method, $message = '') - * @method static void nullOrKeyExists($value, $key, $message = '') - * @method static void nullOrKeyNotExists($value, $key, $message = '') - * @method static void nullOrCount($value, $key, $message = '') - * @method static void nullOrMinCount($value, $min, $message = '') - * @method static void nullOrMaxCount($value, $max, $message = '') - * @method static void nullCountBetween($value, $min, $max, $message = '') - * @method static void nullOrUuid($values, $message = '') - * @method static void allString($values, $message = '') - * @method static void allStringNotEmpty($values, $message = '') - * @method static void allInteger($values, $message = '') - * @method static void allIntegerish($values, $message = '') - * @method static void allFloat($values, $message = '') - * @method static void allNumeric($values, $message = '') - * @method static void allBoolean($values, $message = '') - * @method static void allScalar($values, $message = '') - * @method static void allObject($values, $message = '') - * @method static void allResource($values, $type = null, $message = '') - * @method static void allIsCallable($values, $message = '') - * @method static void allIsArray($values, $message = '') - * @method static void allIsTraversable($values, $message = '') - * @method static void allIsArrayAccessible($values, $message = '') - * @method static void allIsCountable($values, $message = '') - * @method static void allIsInstanceOf($values, $class, $message = '') - * @method static void allNotInstanceOf($values, $class, $message = '') - * @method static void allIsInstanceOfAny($values, $classes, $message = '') - * @method static void allNull($values, $message = '') - * @method static void allNotNull($values, $message = '') - * @method static void allIsEmpty($values, $message = '') - * @method static void allNotEmpty($values, $message = '') - * @method static void allTrue($values, $message = '') - * @method static void allFalse($values, $message = '') - * @method static void allEq($values, $value2, $message = '') - * @method static void allNotEq($values,$value2, $message = '') - * @method static void allSame($values, $value2, $message = '') - * @method static void allNotSame($values, $value2, $message = '') - * @method static void allGreaterThan($values, $value2, $message = '') - * @method static void allGreaterThanEq($values, $value2, $message = '') - * @method static void allLessThan($values, $value2, $message = '') - * @method static void allLessThanEq($values, $value2, $message = '') - * @method static void allRange($values, $min, $max, $message = '') - * @method static void allOneOf($values, $values, $message = '') - * @method static void allContains($values, $subString, $message = '') - * @method static void allNotContains($values, $subString, $message = '') - * @method static void allNotWhitespaceOnly($values, $message = '') - * @method static void allStartsWith($values, $prefix, $message = '') - * @method static void allStartsWithLetter($values, $message = '') - * @method static void allEndsWith($values, $suffix, $message = '') - * @method static void allRegex($values, $pattern, $message = '') - * @method static void allAlpha($values, $message = '') - * @method static void allDigits($values, $message = '') - * @method static void allAlnum($values, $message = '') - * @method static void allLower($values, $message = '') - * @method static void allUpper($values, $message = '') - * @method static void allLength($values, $length, $message = '') - * @method static void allMinLength($values, $min, $message = '') - * @method static void allMaxLength($values, $max, $message = '') - * @method static void allLengthBetween($values, $min, $max, $message = '') - * @method static void allFileExists($values, $message = '') - * @method static void allFile($values, $message = '') - * @method static void allDirectory($values, $message = '') - * @method static void allReadable($values, $message = '') - * @method static void allWritable($values, $message = '') - * @method static void allClassExists($values, $message = '') - * @method static void allSubclassOf($values, $class, $message = '') - * @method static void allImplementsInterface($values, $interface, $message = '') - * @method static void allPropertyExists($values, $property, $message = '') - * @method static void allPropertyNotExists($values, $property, $message = '') - * @method static void allMethodExists($values, $method, $message = '') - * @method static void allMethodNotExists($values, $method, $message = '') - * @method static void allKeyExists($values, $key, $message = '') - * @method static void allKeyNotExists($values, $key, $message = '') - * @method static void allCount($values, $key, $message = '') - * @method static void allMinCount($values, $min, $message = '') - * @method static void allMaxCount($values, $max, $message = '') - * @method static void allCountBetween($values, $min, $max, $message = '') - * @method static void allUuid($values, $message = '') + * @mixin Mixin * * @since 1.0 * @@ -166,113 +35,213 @@ */ class Assert { + /** + * @psalm-pure + * @psalm-assert string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function string($value, $message = '') { - if (!is_string($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_string($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a string. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function stringNotEmpty($value, $message = '') { static::string($value, $message); static::notEq($value, '', $message); } + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function integer($value, $message = '') { - if (!is_int($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_int($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an integer. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function integerish($value, $message = '') { - if (!is_numeric($value) || $value != (int) $value) { - static::reportInvalidArgument(sprintf( + if (!\is_numeric($value) || $value != (int) $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an integerish value. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function float($value, $message = '') { - if (!is_float($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_float($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a float. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function numeric($value, $message = '') { - if (!is_numeric($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_numeric($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a numeric. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function natural($value, $message = '') { - if (!is_int($value) || $value < 0) { - static::reportInvalidArgument(sprintf( - $message ?: 'Expected a non-negative integer. Got %s', + if (!\is_int($value) || $value < 0) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function boolean($value, $message = '') { - if (!is_bool($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_bool($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a boolean. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function scalar($value, $message = '') { - if (!is_scalar($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_scalar($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a scalar. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function object($value, $message = '') { - if (!is_object($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_object($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an object. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ public static function resource($value, $type = null, $message = '') { - if (!is_resource($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_resource($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a resource. Got: %s', static::typeToString($value) )); } - if ($type && $type !== get_resource_type($value)) { - static::reportInvalidArgument(sprintf( + if ($type && $type !== \get_resource_type($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type @@ -280,78 +249,151 @@ public static function resource($value, $type = null, $message = '') } } + /** + * @psalm-pure + * @psalm-assert callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isCallable($value, $message = '') { - if (!is_callable($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_callable($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a callable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isArray($value, $message = '') { - if (!is_array($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isTraversable($value, $message = '') { - @trigger_error( - sprintf( + @\trigger_error( + \sprintf( 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__ ), - E_USER_DEPRECATED + \E_USER_DEPRECATED ); - if (!is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a traversable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isArrayAccessible($value, $message = '') { - if (!is_array($value) && !($value instanceof ArrayAccess)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value) && !($value instanceof ArrayAccess)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array accessible. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isCountable($value, $message = '') { - if (!is_array($value) && !($value instanceof Countable)) { - static::reportInvalidArgument(sprintf( + if ( + !\is_array($value) + && !($value instanceof Countable) + && !($value instanceof ResourceBundle) + && !($value instanceof SimpleXMLElement) + ) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a countable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isIterable($value, $message = '') { - if (!is_array($value) && !($value instanceof Traversable)) { - static::reportInvalidArgument(sprintf( + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an iterable. Got: %s', static::typeToString($value) )); } } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isInstanceOf($value, $class, $message = '') { if (!($value instanceof $class)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class @@ -359,10 +401,22 @@ public static function isInstanceOf($value, $class, $message = '') } } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert !ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notInstanceOf($value, $class, $message = '') { if ($value instanceof $class) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class @@ -370,6 +424,16 @@ public static function notInstanceOf($value, $class, $message = '') } } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isInstanceOfAny($value, array $classes, $message = '') { foreach ($classes as $class) { @@ -378,43 +442,157 @@ public static function isInstanceOfAny($value, array $classes, $message = '') } } - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), - implode(', ', array_map(array('static', 'valueToString'), $classes)) + \implode(', ', \array_map(array('static', 'valueToString'), $classes)) + )); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAOf($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (!\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert !UnexpectedType $value + * @psalm-assert !class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNotA($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAnyOf($value, array $classes, $message = '') + { + foreach ($classes as $class) { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + return; + } + } + + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', + static::typeToString($value), + \implode(', ', \array_map(array('static', 'valueToString'), $classes)) )); } + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function isEmpty($value, $message = '') { if (!empty($value)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an empty value. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert !empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notEmpty($value, $message = '') { if (empty($value)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-empty value. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function null($value, $message = '') { if (null !== $value) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected null. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert !null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notNull($value, $message = '') { if (null === $value) { @@ -424,72 +602,237 @@ public static function notNull($value, $message = '') } } + /** + * @psalm-pure + * @psalm-assert true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function true($value, $message = '') { if (true !== $value) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be true. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function false($value, $message = '') { if (false !== $value) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to be false. Got: %s', static::valueToString($value) )); } } - public static function eq($value, $value2, $message = '') + /** + * @psalm-pure + * @psalm-assert !false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notFalse($value, $message = '') { - if ($value2 != $value) { - static::reportInvalidArgument(sprintf( + if (false === $value) { + static::reportInvalidArgument( + $message ?: 'Expected a value other than false.' + ); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ip($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IP. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv4($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv4. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv6($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv6. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function email($value, $message = '') + { + if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be a valid e-mail address. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. + * + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uniqueValues(array $values, $message = '') + { + $allValues = \count($values); + $uniqueValues = \count(\array_unique($values)); + + if ($allValues !== $uniqueValues) { + $difference = $allValues - $uniqueValues; + + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array of unique values, but %s of them %s duplicated', + $difference, + (1 === $difference ? 'is' : 'are') + )); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function eq($value, $expect, $message = '') + { + if ($expect != $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value equal to %2$s. Got: %s', static::valueToString($value), - static::valueToString($value2) + static::valueToString($expect) )); } } - public static function notEq($value, $value2, $message = '') + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEq($value, $expect, $message = '') { - if ($value2 == $value) { - static::reportInvalidArgument(sprintf( + if ($expect == $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a different value than %s.', - static::valueToString($value2) + static::valueToString($expect) )); } } - public static function same($value, $value2, $message = '') + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function same($value, $expect, $message = '') { - if ($value2 !== $value) { - static::reportInvalidArgument(sprintf( + if ($expect !== $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), - static::valueToString($value2) + static::valueToString($expect) )); } } - public static function notSame($value, $value2, $message = '') + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notSame($value, $expect, $message = '') { - if ($value2 === $value) { - static::reportInvalidArgument(sprintf( + if ($expect === $value) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value not identical to %s.', - static::valueToString($value2) + static::valueToString($expect) )); } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function greaterThan($value, $limit, $message = '') { if ($value <= $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -497,10 +840,19 @@ public static function greaterThan($value, $limit, $message = '') } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function greaterThanEq($value, $limit, $message = '') { if ($value < $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -508,10 +860,19 @@ public static function greaterThanEq($value, $limit, $message = '') } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lessThan($value, $limit, $message = '') { if ($value >= $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -519,10 +880,19 @@ public static function lessThan($value, $limit, $message = '') } } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lessThanEq($value, $limit, $message = '') { if ($value > $limit) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit) @@ -530,10 +900,22 @@ public static function lessThanEq($value, $limit, $message = '') } } + /** + * Inclusive range, so Assert::(3, 3, 5) passes. + * + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function range($value, $min, $max, $message = '') { if ($value < $min || $value > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), @@ -542,21 +924,57 @@ public static function range($value, $min, $max, $message = '') } } + /** + * A more human-readable alias of Assert::inArray(). + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ public static function oneOf($value, array $values, $message = '') { - if (!in_array($value, $values, true)) { - static::reportInvalidArgument(sprintf( + static::inArray($value, $values, $message); + } + + /** + * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function inArray($value, array $values, $message = '') + { + if (!\in_array($value, $values, true)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), - implode(', ', array_map(array('static', 'valueToString'), $values)) + \implode(', ', \array_map(array('static', 'valueToString'), $values)) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ public static function contains($value, $subString, $message = '') { - if (false === strpos($value, $subString)) { - static::reportInvalidArgument(sprintf( + if (false === \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain %2$s. Got: %s', static::valueToString($value), static::valueToString($subString) @@ -564,10 +982,19 @@ public static function contains($value, $subString, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notContains($value, $subString, $message = '') { - if (false !== strpos($value, $subString)) { - static::reportInvalidArgument(sprintf( + if (false !== \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( $message ?: '%2$s was not expected to be contained in a value. Got: %s', static::valueToString($value), static::valueToString($subString) @@ -575,20 +1002,37 @@ public static function notContains($value, $subString, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function notWhitespaceOnly($value, $message = '') { - if (preg_match('/^\s*$/', $value)) { - static::reportInvalidArgument(sprintf( + if (\preg_match('/^\s*$/', $value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ public static function startsWith($value, $prefix, $message = '') { - if (0 !== strpos($value, $prefix)) { - static::reportInvalidArgument(sprintf( + if (0 !== \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix) @@ -596,29 +1040,68 @@ public static function startsWith($value, $prefix, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notStartsWith($value, $prefix, $message = '') + { + if (0 === \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to start with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($prefix) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function startsWithLetter($value, $message = '') { + static::string($value); + $valid = isset($value[0]); if ($valid) { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = ctype_alpha($value[0]); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = \ctype_alpha($value[0]); + \setlocale(LC_CTYPE, $locale); } if (!$valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ public static function endsWith($value, $suffix, $message = '') { - if ($suffix !== substr($value, -static::strlen($suffix))) { - static::reportInvalidArgument(sprintf( + if ($suffix !== \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix) @@ -626,95 +1109,218 @@ public static function endsWith($value, $suffix, $message = '') } } + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEndsWith($value, $suffix, $message = '') + { + if ($suffix === \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to end with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($suffix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ public static function regex($value, $pattern, $message = '') { - if (!preg_match($pattern, $value)) { - static::reportInvalidArgument(sprintf( + if (!\preg_match($pattern, $value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The value %s does not match the expected pattern.', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notRegex($value, $pattern, $message = '') + { + if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The value %s matches the pattern %s (at offset %d).', + static::valueToString($value), + static::valueToString($pattern), + $matches[0][1] + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function unicodeLetters($value, $message = '') + { + static::string($value); + + if (!\preg_match('/^\p{L}+$/u', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain only Unicode letters. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function alpha($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_alpha($value); - setlocale(LC_CTYPE, $locale); + static::string($value); + + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alpha($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain only letters. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function digits($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_digit($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_digit($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain digits only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function alnum($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_alnum($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alnum($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lower($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_lower($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_lower($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-assert !lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function upper($value, $message = '') { - $locale = setlocale(LC_CTYPE, 0); - setlocale(LC_CTYPE, 'C'); - $valid = !ctype_upper($value); - setlocale(LC_CTYPE, $locale); + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_upper($value); + \setlocale(LC_CTYPE, $locale); if ($valid) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * + * @param string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ public static function length($value, $length, $message = '') { if ($length !== static::strlen($value)) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length @@ -722,10 +1328,21 @@ public static function length($value, $length, $message = '') } } + /** + * Inclusive min. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ public static function minLength($value, $min, $message = '') { if (static::strlen($value) < $min) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min @@ -733,10 +1350,21 @@ public static function minLength($value, $min, $message = '') } } + /** + * Inclusive max. + * + * @psalm-pure + * + * @param string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function maxLength($value, $max, $message = '') { if (static::strlen($value) > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max @@ -744,12 +1372,24 @@ public static function maxLength($value, $max, $message = '') } } + /** + * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function lengthBetween($value, $min, $max, $message = '') { $length = static::strlen($value); if ($length < $min || $length > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, @@ -758,76 +1398,128 @@ public static function lengthBetween($value, $min, $max, $message = '') } } + /** + * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function fileExists($value, $message = '') { static::string($value); - if (!file_exists($value)) { - static::reportInvalidArgument(sprintf( + if (!\file_exists($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The file %s does not exist.', static::valueToString($value) )); } } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function file($value, $message = '') { static::fileExists($value, $message); - if (!is_file($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_file($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not a file.', static::valueToString($value) )); } } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function directory($value, $message = '') { static::fileExists($value, $message); - if (!is_dir($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_dir($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is no directory.', static::valueToString($value) )); } } + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function readable($value, $message = '') { - if (!is_readable($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_readable($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not readable.', static::valueToString($value) )); } } + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function writable($value, $message = '') { - if (!is_writable($value)) { - static::reportInvalidArgument(sprintf( + if (!\is_writable($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'The path %s is not writable.', static::valueToString($value) )); } } + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function classExists($value, $message = '') { - if (!class_exists($value)) { - static::reportInvalidArgument(sprintf( + if (!\class_exists($value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an existing class name. Got: %s', static::valueToString($value) )); } } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function subclassOf($value, $class, $message = '') { - if (!is_subclass_of($value, $class)) { - static::reportInvalidArgument(sprintf( + if (!\is_subclass_of($value, $class)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class) @@ -835,10 +1527,40 @@ public static function subclassOf($value, $class, $message = '') } } + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function interfaceExists($value, $message = '') + { + if (!\interface_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an existing interface name. got %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ public static function implementsInterface($value, $interface, $message = '') { - if (!in_array($interface, class_implements($value))) { - static::reportInvalidArgument(sprintf( + if (!\in_array($interface, \class_implements($value))) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface) @@ -846,103 +1568,223 @@ public static function implementsInterface($value, $interface, $message = '') } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ public static function propertyExists($classOrObject, $property, $message = '') { - if (!property_exists($classOrObject, $property)) { - static::reportInvalidArgument(sprintf( + if (!\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the property %s to exist.', static::valueToString($property) )); } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ public static function propertyNotExists($classOrObject, $property, $message = '') { - if (property_exists($classOrObject, $property)) { - static::reportInvalidArgument(sprintf( + if (\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the property %s to not exist.', static::valueToString($property) )); } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ public static function methodExists($classOrObject, $method, $message = '') { - if (!method_exists($classOrObject, $method)) { - static::reportInvalidArgument(sprintf( + if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the method %s to exist.', static::valueToString($method) )); } } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ public static function methodNotExists($classOrObject, $method, $message = '') { - if (method_exists($classOrObject, $method)) { - static::reportInvalidArgument(sprintf( + if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the method %s to not exist.', static::valueToString($method) )); } } + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ public static function keyExists($array, $key, $message = '') { - if (!array_key_exists($key, $array)) { - static::reportInvalidArgument(sprintf( + if (!(isset($array[$key]) || \array_key_exists($key, $array))) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the key %s to exist.', static::valueToString($key) )); } } + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ public static function keyNotExists($array, $key, $message = '') { - if (array_key_exists($key, $array)) { - static::reportInvalidArgument(sprintf( + if (isset($array[$key]) || \array_key_exists($key, $array)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected the key %s to not exist.', static::valueToString($key) )); } } + /** + * Checks if a value is a valid array key (int or string). + * + * @psalm-pure + * @psalm-assert array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function validArrayKey($value, $message = '') + { + if (!(\is_int($value) || \is_string($value))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected string or integer. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ public static function count($array, $number, $message = '') { static::eq( - count($array), + \count($array), $number, - $message ?: sprintf('Expected an array to contain %d elements. Got: %d.', $number, count($array)) + \sprintf( + $message ?: 'Expected an array to contain %d elements. Got: %d.', + $number, + \count($array) + ) ); } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ public static function minCount($array, $min, $message = '') { - if (count($array) < $min) { - static::reportInvalidArgument(sprintf( + if (\count($array) < $min) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', - count($array), + \count($array), $min )); } } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function maxCount($array, $max, $message = '') { - if (count($array) > $max) { - static::reportInvalidArgument(sprintf( + if (\count($array) > $max) { + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', - count($array), + \count($array), $max )); } } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ public static function countBetween($array, $min, $max, $message = '') { - $count = count($array); + $count = \count($array); if ($count < $min || $count > $max) { - static::reportInvalidArgument(sprintf( + static::reportInvalidArgument(\sprintf( $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, @@ -951,9 +1793,91 @@ public static function countBetween($array, $min, $max, $message = '') } } + /** + * @psalm-pure + * @psalm-assert list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isList($array, $message = '') + { + if (!\is_array($array) || $array !== \array_values($array)) { + static::reportInvalidArgument( + $message ?: 'Expected list - non-associative array.' + ); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyList($array, $message = '') + { + static::isList($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isMap($array, $message = '') + { + if ( + !\is_array($array) || + \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') + ) { + static::reportInvalidArgument( + $message ?: 'Expected map - associative array with string keys.' + ); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * @psalm-assert !empty $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyMap($array, $message = '') + { + static::isMap($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ public static function uuid($value, $message = '') { - $value = str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); + $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); // The nil UUID is special form of UUID that is specified to have all // 128 bits set to zero. @@ -961,14 +1885,23 @@ public static function uuid($value, $message = '') return; } - if (!preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { - static::reportInvalidArgument(sprintf( + if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { + static::reportInvalidArgument(\sprintf( $message ?: 'Value %s is not a valid UUID.', static::valueToString($value) )); } } + /** + * @psalm-param class-string $class + * + * @param Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ public static function throws(Closure $expression, $class = 'Exception', $message = '') { static::string($class); @@ -978,45 +1911,48 @@ public static function throws(Closure $expression, $class = 'Exception', $messag try { $expression(); } catch (Exception $e) { - $actual = get_class($e); + $actual = \get_class($e); if ($e instanceof $class) { return; } } catch (Throwable $e) { - $actual = get_class($e); + $actual = \get_class($e); if ($e instanceof $class) { return; } } - static::reportInvalidArgument($message ?: sprintf( + static::reportInvalidArgument($message ?: \sprintf( 'Expected to throw "%s", got "%s"', $class, $actual )); } + /** + * @throws BadMethodCallException + */ public static function __callStatic($name, $arguments) { - if ('nullOr' === substr($name, 0, 6)) { + if ('nullOr' === \substr($name, 0, 6)) { if (null !== $arguments[0]) { - $method = lcfirst(substr($name, 6)); - call_user_func_array(array('static', $method), $arguments); + $method = \lcfirst(\substr($name, 6)); + \call_user_func_array(array('static', $method), $arguments); } return; } - if ('all' === substr($name, 0, 3)) { + if ('all' === \substr($name, 0, 3)) { static::isIterable($arguments[0]); - $method = lcfirst(substr($name, 3)); + $method = \lcfirst(\substr($name, 3)); $args = $arguments; foreach ($arguments[0] as $entry) { $args[0] = $entry; - call_user_func_array(array('static', $method), $args); + \call_user_func_array(array('static', $method), $args); } return; @@ -1025,6 +1961,11 @@ public static function __callStatic($name, $arguments) throw new BadMethodCallException('No such method: '.$name); } + /** + * @param mixed $value + * + * @return string + */ protected static function valueToString($value) { if (null === $value) { @@ -1039,43 +1980,63 @@ protected static function valueToString($value) return 'false'; } - if (is_array($value)) { + if (\is_array($value)) { return 'array'; } - if (is_object($value)) { - return get_class($value); + if (\is_object($value)) { + if (\method_exists($value, '__toString')) { + return \get_class($value).': '.self::valueToString($value->__toString()); + } + + if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { + return \get_class($value).': '.self::valueToString($value->format('c')); + } + + return \get_class($value); } - if (is_resource($value)) { + if (\is_resource($value)) { return 'resource'; } - if (is_string($value)) { + if (\is_string($value)) { return '"'.$value.'"'; } return (string) $value; } + /** + * @param mixed $value + * + * @return string + */ protected static function typeToString($value) { - return is_object($value) ? get_class($value) : gettype($value); + return \is_object($value) ? \get_class($value) : \gettype($value); } protected static function strlen($value) { - if (!function_exists('mb_detect_encoding')) { - return strlen($value); + if (!\function_exists('mb_detect_encoding')) { + return \strlen($value); } - if (false === $encoding = mb_detect_encoding($value)) { - return strlen($value); + if (false === $encoding = \mb_detect_encoding($value)) { + return \strlen($value); } - return mb_strwidth($value, $encoding); + return \mb_strlen($value, $encoding); } + /** + * @param string $message + * + * @throws InvalidArgumentException + * + * @psalm-pure this method is not supposed to perform side-effects + */ protected static function reportInvalidArgument($message) { throw new InvalidArgumentException($message); diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php new file mode 100644 index 00000000..3ad9b2d0 --- /dev/null +++ b/vendor/webmozart/assert/src/Mixin.php @@ -0,0 +1,1971 @@ + $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allString($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStringNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStringNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInteger($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInteger($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIntegerish($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIntegerish($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFloat($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFloat($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNumeric($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNumeric($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNatural($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNatural($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrBoolean($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allBoolean($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrScalar($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allScalar($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrObject($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allObject($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrResource($value, $type = null, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allResource($value, $type = null, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsCallable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsCallable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsArray($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsArray($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsTraversable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsTraversable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsArrayAccessible($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsArrayAccessible($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsCountable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsCountable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsIterable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsIterable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsInstanceOfAny($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsInstanceOfAny($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|ExpectedType|class-string $value + * + * @param null|object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsAOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsAOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param null|object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNotA($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNotA($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param null|object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsAnyOf($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsAnyOf($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsEmpty($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNull($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotNull($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrTrue($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allTrue($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFalse($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFalse($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotFalse($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotFalse($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIp($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIp($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIpv4($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIpv4($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIpv6($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIpv6($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEmail($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEmail($value, $message = ''); + + /** + * @param null|array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUniqueValues($values, $message = ''); + + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUniqueValues($values, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEq($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrGreaterThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allGreaterThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrGreaterThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allGreaterThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLessThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLessThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLessThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLessThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrRange($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allRange($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrOneOf($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allOneOf($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInArray($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInArray($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotWhitespaceOnly($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotWhitespaceOnly($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStartsWithLetter($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStartsWithLetter($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUnicodeLetters($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUnicodeLetters($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrAlpha($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allAlpha($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrDigits($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allDigits($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrAlnum($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allAlnum($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|lowercase-string $value + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLower($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLower($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUpper($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUpper($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLength($value, $length, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLength($value, $length, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMinLength($value, $min, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMinLength($value, $min, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMaxLength($value, $max, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMaxLength($value, $max, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLengthBetween($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLengthBetween($value, $min, $max, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFileExists($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFileExists($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFile($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFile($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrDirectory($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allDirectory($value, $message = ''); + + /** + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrReadable($value, $message = ''); + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allReadable($value, $message = ''); + + /** + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrWritable($value, $message = ''); + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allWritable($value, $message = ''); + + /** + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrClassExists($value, $message = ''); + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allClassExists($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrSubclassOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allSubclassOf($value, $class, $message = ''); + + /** + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInterfaceExists($value, $message = ''); + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInterfaceExists($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrImplementsInterface($value, $interface, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allImplementsInterface($value, $interface, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrPropertyExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allPropertyExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrPropertyNotExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allPropertyNotExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMethodExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMethodExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMethodNotExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMethodNotExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * + * @param null|array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrKeyExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allKeyExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param null|array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrKeyNotExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allKeyNotExists($array, $key, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrValidArrayKey($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allValidArrayKey($value, $message = ''); + + /** + * @param null|Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrCount($array, $number, $message = ''); + + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allCount($array, $number, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMinCount($array, $min, $message = ''); + + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMinCount($array, $min, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMaxCount($array, $max, $message = ''); + + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMaxCount($array, $max, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrCountBetween($array, $min, $max, $message = ''); + + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allCountBetween($array, $min, $max, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNonEmptyList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNonEmptyList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param null|mixed|array $array + * @psalm-assert null|array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * @psalm-assert iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param null|mixed|array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNonEmptyMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNonEmptyMap($array, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUuid($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUuid($value, $message = ''); + + /** + * @psalm-param class-string $class + * + * @param null|Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrThrows($expression, $class = 'Exception', $message = ''); + + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allThrows($expression, $class = 'Exception', $message = ''); +}